프로젝트

나도 메이커! 메이커스 여러분들의 작품/프로젝트를 공유하는 공간입니다.

아두이노 모터 쉴드 x 초음파센서-장애물 피하는 로봇 만들기

2018-12-27 10:45:40

개요

본 예제를 실습하기에 앞서 초음파 센서와
DC 모터 제어를 처음 해 보시는 분들은 
다음의 예제를 먼저 학습해 주세요.

 

이제 우리 일상생활 곳곳에 로봇이 이용되고 있는데요,

 

그중 가장 친숙한 로봇은 바로 로봇 청소기가 아닐까 합니다.
 
처음 등장했을 때만 해도 멍청한 수준의 로봇청소기였지만,
점점 인공지능이 최적화되고 다양한 작동 모드를 지원하는 제품들이 출시되고 있습니다.
 
눈이 달린 것도 아닌데 이리저리 장애물을 피해 다니며 
청소하는 모습을 보면 신기하기만 한데요,
그 원리는 초음파 센서나 적외선 감지 센서를 통해 전/후방의 장애물을 감지하고,
이를 통해 모터의 움직임을 제어하게 되는것 입니다.

출처 : 로봇 청소기 www.archiexpo.com

본 예제에서는 이와 유사한 방식으로 초음파 센서와 2축 DC모터 기어 박스 로봇을 이용하여
장애물 감지 로봇을 만들어 보겠습니다.



실습에 사용될 DC 모터입니다.
일반적인 DC 모터와 달리 '기어박스'라는 것이 부착되어 있는습니다.
이 '기어박스'는 DC모터의 속도(RPM)를 감속하고, 토크(회전력)를 증가시켜 무거운 물체를 회전할수 있게 해줍니다.
48:1이라는 수치는 바로 '기어비' 인데요,


출처 : 기어박스의 내부모습 - fabacademy.org

이 '기어비'는 1:1일 경우 DC모터가 1회전 하면 기어박스 내의 기어도 1회전하여,
DC모터의 토크가 그대로 전달되지만,
48:1일 경우 DC모터가 48회전하면 기어박스의 톱니가 1회전하고,
따라서 더 큰 힘이 발생하게 되는것입니다.


미리보기 동영상

 

부품목록

NO 부품명 수량 상세설명
1 오렌지 보드 1 아두이노 호환보드 
2 아두이노 모터 쉴드 1 모터 쉴드
3 2축 기어박스 키트 (DC모터 포함) 1 48:1 DC 기어모터(Magician Chassis)
4 9V 배터리 1 9V 배터리
5 초음파 센서 1 HC-SR04
6 점퍼케이블 1 점퍼케이블(암-수)
7 9V 배터리 연결 배럴 잭 1 배럴 잭

 

부품명 오렌지 보드 모터 쉴드 9V 배터리 배럴 잭 2축 기어박스 키트 9v 배터리
파트 x1 x1 x1 x1 x1

 

부품명 초음파센서 점퍼케이블
파트 x1 x1

하드웨어 Making

조립 메뉴얼이 동봉되어 있으므로 메뉴얼을 참조해 주세요.
본 예제에서는 magic chassis라는 2축 기어모터 키트를 사용하였습니다.



구성품은 아래와 같습니다.

 

  • Max Motor Voltage: 6VDC
  • No Load Speed: 90±10rpm
  • No Load Current:190mA(max.250mA)
  • Torque: 800gf.cm
  • Stall Current: ~1A
  • 65mm Diameter Wheels (30mm Wide)
  • Plastic Rims with Solid Rubber Tires


1.먼저 해당 부품을 이용하여 하판에 모터를 고정해 줍니다.
이때 긴 나사를 사용합니다.



2.좌,우측 모두 고정해 주세요.



3.홈에 맞추어 바퀴를 끼워주세요.

 



4. 긴 육각 봉과 나사를 이용하여 볼 캐스터를 고정합니다.
 
5.나머지 납작머리 나사를 이용하여 건전지 케이스를 고정하고,
상판을 고정하기위해 육각 봉을 하판에 먼저 고정해 주세요.


6.필요에 따라 아두이노 보들를 상판에 먼저 고정합니다.
이때 짧은 육각봉을 이용합니다.


7.모터쉴드를 적층하고 채널 A에 오른쪽 모터를, 채널 B에 왼쪽 모터를 연결해줍니다.
쉴드에 +,-표기를 확인하고 연결해 주세요.
 

8. 초음파 센서 HC-SR04를 전면에 고정합니다.
케이블타이나 철사를 이용하여 고정하거나,
글루건으로 고정해 주세요.

배선 연결을 Trig는D7에 , Echo는 D6핀에
나머지  VCC,Gnd는 각각 모터쉴드의 5V핀과 Gnd에 연결합니다.


10. 마지막으로 9V 배터리와 배럴잭을 연결하면 완성!
기존 키트에 동봉 되어있던 1.5V AA X 4 건전지 홀더는 사용하지 않습니다.
9V 건전지 1개를 모터쉴드의 외부전원단자와 연결하면 됩니다.

회로도


 

브레드보드 레이아웃

 

소프트웨어 Coding

아래의 코드를 아두이노에 업로드 합니다.

#include <NewPing.h> // NewPing라이브러리를 불러옵니다.

#define SONAR_NUM     1 // 초음파센서의 갯수럴 설정합니다.
#define MAX_DISTANCE 500 // 최대거리는 500(cm)로 제한합니다.
#define PING_INTERVAL 250 

unsigned long pingTimer[SONAR_NUM];
unsigned int cm[SONAR_NUM];
uint8_t currentSensor = 0;

NewPing sonar[SONAR_NUM] = {
  NewPing(7, 6, MAX_DISTANCE), // Trigger pin, echo pin, 그리고 최대거리 
};

void setup() {
  Serial.begin(9600);
  pingTimer[0] = millis() + 75;
  for (uint8_t i = 1; i < SONAR_NUM; i++) // 센서의 초기값을 설정합니다.
    pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL;

  //모터쉴드의 A & B채널 설정
  pinMode(12, OUTPUT); //Motor 채널 A pin을 출력으로 설정합니다.
  pinMode(9, OUTPUT); //Brake 채널 A pin을 출력으로 설정합니다.
  pinMode(13, OUTPUT); //Motor 채널 B pin을 출력으로 설정합니다.
  pinMode(8, OUTPUT); //Brake 채널 B pin을 출력으로 설정합니다.
}

void loop() {
  for (uint8_t i = 0; i < SONAR_NUM; i++) { // 둘 이상의 초음파 센서를 사용할경우 모든 센서를 체크합니다.
    if (millis() >= pingTimer[i]) {         // 핑 타임 체크
      pingTimer[i] += PING_INTERVAL * SONAR_NUM;  // 다음 핑 타임을 위한 시간 체크
      if (i == 0 && currentSensor == SONAR_NUM - 1) oneSensorCycle(); 
      sonar[currentSensor].timer_stop();       
      currentSensor = i;
      cm[currentSensor] = MAX_DISTANCE;               
      sonar[currentSensor].ping_timer(echoCheck); 
    }
  }

       if (cm[0] < 20)  // 만약 20cm 안에 장애물이 감지되면,
       {
          turn_right(); // 오른쪽으로 회전합니다.
       } 
       


       else; // 아닐경우,
       {
          forward(); // 계속 전진합니다.      
       }
  
}

void echoCheck() {
  if (sonar[currentSensor].check_timer())
    cm[currentSensor] = sonar[currentSensor].ping_result / US_ROUNDTRIP_CM;
}

void oneSensorCycle() {
  for (uint8_t i = 0; i < SONAR_NUM; i++) {
    Serial.print(i);
    Serial.print("=");
    Serial.print(cm[i]);
    Serial.print("cm ");
  }
  Serial.println();
}
void forward()
{
  //전진모드에 대한 설정입니다.
  digitalWrite(12, LOW);  //12번 핀과 연결된 채널 A 모터의 방향을 설정합니다. 
  digitalWrite(9, LOW);   //9번 핀과 연결된 채널 A 모터의 브레이크를 해제합니다.
  analogWrite(3, 255);    //3번 핀과 연결된 채널 A 모터의 속도를 최대값(255)로 설정합니다.
  digitalWrite(13, HIGH); //13번 핀과 연결된  채널 B 모터의 방향을 설정합니다. 
  digitalWrite(8, LOW);   //8번 핀과 연결된 채널 B 모터의 브레이크를 해제합니다.
  analogWrite(11, 255);   //11번 핀과 연결된 채널 B 모터의 속도를 최대값(255)로 설정합니다. 
}

void turn_right()
{ 
  //우회전에 대한 설정입니다.
  digitalWrite(12, HIGH); //12번 핀과 연결된 채널 A 모터의 방향을 역방향으로 설정합니다. 
  digitalWrite(9, LOW);   //9번 핀과 연결된 채널 A 모터의 브레이크를 해제합니다.
  analogWrite(3, 255);    //3번 핀과 연결된 채널 A 모터의 속도를 최대값(255)로 설정합니다.
  digitalWrite(13, HIGH); //13번 핀과 연결된  채널 B 모터의 방향을 설정합니다. 
  digitalWrite(8, LOW);   //8번 핀과 연결된 채널 B 모터의 브레이크를 해제합니다.
  analogWrite(11, 255);   //11번 핀과 연결된 채널 B 모터의 속도를 최대값(255)로 설정합니다. 
  delay(500); //0.5초(500밀리초)동안 유지합니다.
}


스케치 설명

외부라이브러리 NewPing.h(다운받기)를 다운받아 압축해제후
NewPing 폴더를 아래의 경로에 넣어주세요.
 Document>Arduino>Libraries
*아두이노 IDE가 실행중 이라면, 라이브러리 설치후 다시 시작해 주세요.

-NewPing 라이브러리는 초음파 센서의 데이터 수신을 보다 빠르게 작동 시켜줍니다.

kocoafab

모터쉴드, 초음파센서, 아두이노, 오렌지보드