Programming/IoT_Embedded

아두이노로 만드는 가장 쉬운 RC 카

이세우 2015. 2. 24. 16:32


아이들이 좋아 할 만한 장남감을 하나 만들 생각에 아두이노로 RC카를 만들어 보기로 했습니다.

이래저래 조사해서 가장 값싸고 설득력 있는 수준에서 아이들이 좋아 할 만한 물건을 아이들과 함께 만들어 봅니다.

여기서 RC카의 본래 의미는 Radio Control의 의미 인데, Remote Control로 이해 해 주시기 바랍니다.


우선 전체적인 구조는 안드로이드 핸드폰에 원격조종 앱을 설치해서 아두이노에 명령을 보내면 아두이노가 모터를 움직이는 겁니다.

그러기 위해서 우선 첫번째로 모터와 바퀴가 달린 차체를 구해야 합니다.

그런데 말입니다. RC 베이스라 불리우는 이게 여간 비싸지 않습니다.

보통 라인트레이서라는 것으로 검색하면 여기저기 판매하는 곳이 있는데, 몸체만 5~8만원 선입니다.

바퀴만 몇 만원 하는 경우도 많습니다.


요즘 이마트에서 멋진 차체에 리모콘 까지 있는 무선조종 장난감 자동차가 2만원 이하에 좋은게 많은데, 이런걸 사는 건 도저히 용납이 안되죠.


그래서 찾아낸 것이 바로 이 제품입니다.



이 제품은 MPU카페 라는 곳에서 한개당 6,800원에 공동구매로 판매하고 있습니다. 2개면 13,600원 이네요. 여기에 택배비 까지 하면 15천원이 넘는군요.

대륙의 힘을 직접 맛보면 가격은 훨씬 더 저렴해 지는데요. 알리익스프레스에서는 2개에 $2.95 우리돈으로 환산하면 3,500원이 조금 안 되는 군요.

물론, 알리익스프레스에서 구매하면 15일은 보통 넘어가고 한달 걸리는 경우도 있고 브라켓도 따로 구매해야 하니까 불편하기는 합니다.

뭐 구매는 이 둘을 놓고 적정선에서 알아서 판단하시면 될것 같습니다.


저는 다른것들 구매할게 많아서 MPU카페에서 구매 했습니다.

저 모터와 바퀴는 탈착이 되는 식이구요. 모터가 바퀴를 돌리기 위한 기어 박스도 이미 내장 되어 있습니다.

이런 부품들은 특징이 판매자로 부터 스펙시트를 구할 수 가 없다는 것인데요,

모터의 제원은 MPU카페에는 3~6V로 나와있는데, 모터에 Dagurobot 이라고 붙어 있어서 검색해보니,

DC 4.5V 190mA(max 250mA)로 되어 있더군요.


아두이노 출력 전압이 5V에 최대 200mA이니까 아두이노 5V핀에 직접 연결해서 사용해도 되겠군요.

(아두이노 핀 최대전류 사양 :  http://playground.arduino.cc/Main/ArduinoPinCurrentLimitations )



모터는 다들 아시다 시피 양극 음극이 따로 없고, 극을 다르게 연결하면 회전 하는 방향이 바뀌게 되죠.

(혹시 모터의 동작 원리가 궁금하시다면 여기를 보세요 : https://www.youtube.com/watch?v=Nt9BsT7HkiA )

그래서 이 모터가 어느 방향으로 돌아 갈지를 미리 알아야 합니다.

그래서 저는 5V 어뎁터에 연결해서 미리 어느 방향으로 돌아 갈지 알아보고 +,-를 표시해 두었습니다.

아들 녀석이랑 동영상도 같이 보고 테스트도 같이 해보고 하니까 무척 좋아 하네요.

모터에 전선을 적당한 길이로 잘라서 납땜해두었습니다.


이제 방향을 알았으니 차제를 만들어 붙여야 겠군요.

몸체는 CD케이스 뚜겅을 쓰기로 했습니다.



본래 자동차라고 하면 바퀴가 4개가 달려야 하는데, 그러면 앞바퀴가 방향 조정이 되도록 서보모터를 붙어야 하는데, 구조도 부품도 복잡해 집니다.

그래서 저는 앞 바퀴는 그냥  전자 회로 기판에 쓰는 PCB 서포터라는 막대기 같은 것을 꼽아서 넘어지지만 않게 하였습니다.

앞에 바퀴를 달기도 하는데, 뭐 더 돈들이기도 그렇고 해서 그냥 질질 끌고 다니기로 한겁니다.

앞 바퀴도 MPU카페에서 팔고 있으니 더 완성도를 높이시려면 구매하시는 것도 좋을 겁니다.


PCB 서포트




이렇게 서포트 끼울 자리를 맨 앞에, 모터 끼울 자리 양 옆에, 전선 통과할 구멍을 중앙에 뚫어 줍니다.

이때 CD 케이스 뚜껑에 그냥 드릴질을 하면 쫙~! 하고 깨져 버리기 때문에 스카치 테잎으로 붙여 놓고 드릴질을 할 필요가 있습니다.



구멍 뚫은 곳에 조립을 마친 모습입니다.


이제 모터를 아두이노와 연결을 해야 하는데, 아두이노로 직접 모터의 정방향/역방향 제어 하는 것이 쉽지 않습니다.

그래서 모터 제어를 위해 트랜지스터와 다이오드를 이용한 H-Bridge라는 회로를 구성해야 하는데, 

이 회로를 집적시켜 놓은 H-Bridge IC 칩들이 시중에 많습니다. 그런데, 이 칩들에다가 다시 적절량의 전류 유지를 위한 캐패시터(콘덴서), 동작 상황을 나타내는 LED 등등을 붙여서 모터 드라이버라는 모듈(작은 회로 부품)을 또 만들어서 팔고 있습니다.


그러니까 결국 가장 손쉽게 모터를 제어 하는데에는 DC 모터 드라이버 모듈을 사면 되는데,

사용하려는 모터에 적절한 용량과 갯수에 맞게 제작된 녀석을 고르면 되는 겁니다.

제가 구매한 것은 L9110s Dual DC 모터 드라이버 모듈 인데요, 이것도 MPU카페에서 7,500원에 판매하고 있습니다.

물론, 알리익스프레스에는 더 저렴하게 판매하구요.  한개에 $2.93에 팔고 있군요.


이 모듈은 전선을 끼우기 좋게 만들어져 있습니다. 모터에서 나온 전선을 각각 끼웁니다.


나머지 핀들이 6개 있는데, 그 중에 Vcc와 GND는 각각 아두이노의 5V와 GND에 연결합니다.

이때 모터의 용량이 아두이노에서 나오는 최대 출력 5V, 200mA를 초과하는 경우에는  아두이노와 연결해선 안되고 배터리와 직접 연결해야 합니다.


나머지 4개의 핀은 제품에 따라 표기 방식이 조금씩 다를 수 있는데, 어쨌든 왼쪽 바퀴2개 오른쪽 바퀴 2개로 보면되는데,

1A,1B, 2A,2B 와 같은 식으로 표시되어 있고, 각 핀에 HIGH/LOW 값을 어떻게 입력하느냐에 따라 모터가 동작하게 됩니다.


1A : High

 1B : Low

 왼쪽 바퀴 정회전

 1A :  Low

 1B : High

 왼쪽 바퀴 역회전

 1A : Low(High)

 1B : Low(High)

 왼쪽 바퀴 정지


2A, 2B에 위와 같이 입력값을 주면 오른쪽 바퀴를 제어하게 됩니다.

저는 각각 아두이노 4, 5, 6, 7번에 연결하였고, Serial Monitor를 통해 값을 입력시켜서 HIGH 또는 LOW를 주어서 동작 상태를 확인 했습니다.


시리얼 모니터로 4(←),8(↑),6(→),2(↓),0(정지)를 입력해서 동작 확인을 하는 아두이노 소스코드는 아래와 같습니다.

#define PIN_A1 4 //Left wheel
#define PIN_B1 5 //left wheel
#define PIN_A2 6 //right wheel
#define PIN_B2 7 //right wheel


char val;

void setup(){
  Serial.begin(9600);
  pinMode(PIN_A1, OUTPUT);
  pinMode(PIN_A2, OUTPUT);
  pinMode(PIN_B1, OUTPUT);
  pinMode(PIN_B2, OUTPUT);
  Serial.println("Arduino RC Car is ready to start");
}

void loop(){
  while(!Serial.available());
  while(Serial.available()){
     val = Serial.read();
     Serial.print(val);
     if(val == '4'){//left
       Serial.println("left");
       left();
     }else if(val == '6'){//right
       Serial.println("right");
       right();
     }else if(val == '8'){//forward
       Serial.println("forward");
       forward();
     }else if(val == '2'){//backward
       Serial.println("backward");
       backward();
     }else if(val == '0'){//stop
       Serial.println("stop");   
      stop();
     }
  }
}

void forward(){
  digitalWrite(PIN_A1, HIGH);
  digitalWrite(PIN_B1, LOW);
  digitalWrite(PIN_A2, HIGH);
  digitalWrite(PIN_B2, LOW);
}
void backward(){
  digitalWrite(PIN_A1, LOW);
  digitalWrite(PIN_B1, HIGH);
  digitalWrite(PIN_A2, LOW);
  digitalWrite(PIN_B2, HIGH);
}
void left(){
  digitalWrite(PIN_A1, LOW);
  digitalWrite(PIN_B1, HIGH);
  digitalWrite(PIN_A2, HIGH);
  digitalWrite(PIN_B2, LOW);
}
void right(){
  digitalWrite(PIN_A1, HIGH);
  digitalWrite(PIN_B1, LOW);
  digitalWrite(PIN_A2, LOW);
  digitalWrite(PIN_B2, HIGH);
}
void stop(){
  digitalWrite(PIN_A1, LOW);
  digitalWrite(PIN_B1, LOW);
  digitalWrite(PIN_A2, LOW);
  digitalWrite(PIN_B2, LOW);
}


여기 까지 잘 되었다면, 그 다음으로는 무선으로 제어 하게 만들어야 할 단계입니다.


무선 통신을 위해서는 블루투스를 사용하였는데, 블루투스 모듈로 가장 손쉽게 구할 수 있는것이  HC-06이라는 모듈입니다.

본래는 헤더핀없이 바로 납땜해서 사용하게 되어 있는데, 편리를 위해 breakout 보드(백보드)를 붙여서 파는 것도 많습니다.

이것도 당연히 MPU카페에서 12,500원에 판매하고 있습니다.  알리익스프레스에서는  $3.35에 판매하는 군요.




이 모듈은 슬레이브 모드로 해서 안드로이드와 통신을 하고 통신 그 내용을 아두이노의 시리얼 핀으로 전달 할 수 있습니다.

breakout 보드를 붙인 모듈을 기준으로 설명하자면, 핀이 모두 6개 나와 있습니다.

그중에 Vcc와 GND는  아두이노의 5V, GND에 연결하고 Rx, Tx를 아두이노의 2,3번에 연결합니다.

나머지 2개의 핀은 사용하지 않습니다.


시리얼 통신을 한다고 해놓고 아두이노의 0,1번에 연결하지 않고 2,3번에 연결한 이유는 디버깅을 위해서 PC와 시리얼 통신을 해야 하기 때문에

0,1번은 비워 두고 2,3번에 연결한겁니다. 그리고 HC-06과 아두이노 간에는 SoftwareSerial 이라는 방법을 통해 통신합니다.


최종적으로 완성된 아두이노 소스코드는 아래와 같습니다.

#include <SoftwareSerial.h>

#define PIN_RX 2
#define PIN_TX 3

#define PIN_A1 4 //Left wheel
#define PIN_B1 5 //left wheel
#define PIN_A2 6 //right wheel
#define PIN_B2 7 //right wheel

SoftwareSerial btSerial(PIN_RX, PIN_TX);
char val;


void setup(){
  Serial.begin(9600);
  btSerial.begin(9600);
  pinMode(PIN_A1, OUTPUT);
  pinMode(PIN_A2, OUTPUT);
  pinMode(PIN_B1, OUTPUT);
  pinMode(PIN_B2, OUTPUT);
  Serial.println("Arduino RC Car is ready to start");
}

void loop(){
  while(!btSerial.available());
  while(btSerial.available()){
     val = btSerial.read();
     Serial.print(val);
     if(val == '4'){//left
       Serial.println("left");
       left();
     }else if(val == '6'){//right
       Serial.println("right");
       right();
     }else if(val == '8'){//forward
       Serial.println("forward");
       forward();
     }else if(val == '2'){//backward
       Serial.println("backward");
       backward();
     }else if(val == '0'){//stop
       Serial.println("stop");   
      stop();
     }
  }
}

// 이하 생략..


이렇게 모터와 모터드라이버, 그리고 블루투스 모듈까지 완전히 연결하고 전원은 9V 배터리를 연결합니다.

전원은 9V 건전지 스냅 단자와 DC 파워 플러그를 납땜해서  만들었습니다.



DC파워 플러그는 E-type으로 외경 5.5mm, 내경 2.1mm가 필요합니다. (http://arduino.cc/en/Main/arduinoBoardUno)

위의 판매처 링크에는 내경 2.0mm로 되어있는데, 아마도 잘못 기재한 것 같습니다.


자 이렇게 전원 까지 완전히 완성했습니다.




이제 원격 조종에 필요한 안드로이드 앱을 만들어야 겠는데, 일단은 구글 플레이스토어에서 가장 적절한 녀석을 다운로드 받아서 가지고 놀아 봅니다.

구글 플레이 스토어에서 "Blue stick"이라고 검색하면 앱이 하나 나옵니다.


https://play.google.com/store/apps/details?id=com.inex.BlueStickControl


먼저 "pair"  버튼을 눌러서 페어링을 시도 해야겠죠.

기기 이름은 기본설정되어 있는 경우 라면 "linvor", 핀번호는 "1234"로 되어 있습니다.

이름과 핀번호가 마음에 안들면 나중에 AT Command를 이용해서 변경하시면 됩니다.


페어링이 이루어 지면 HC-06 블루투스 모듈에 깜박이던 LED가 멈추고 안드로이드를 이용해서 조작이 될겁니다.

이전에 전,후,좌,우 정지를 8,2,4,6,0으로 해 놓은 이유가 키보드의 방향키 배열과도 같아서 그렇기도 하지만,

이 블루스틱이라는 앱이 보내는 신호도 그렇기 때문입니다.



이렇게 동작이 되는 군요.

아이들이 무척 좋아 합니다.

끝으로 회로를 브레드보드에 계속 둘 수는 없으니, 이 회로 그대로 만능기판에 헤더핀을 납땜해서 전용기판을 하나 따로 만들어 봤습니다.

아두이노와 연결할 핀은 아두이노 쉴드 처럼 각 핀에 꼭 맞게 배치해서 그냥 끼우기만 하면 되게 했습니다.

회로 연결에 사용한 전선은 에나멜 코팅된 구리선이라서 서로 맞닿아도 쇼트가 나지 않으며, 납땜할때 인두로 지지면 코팅이 녹아서 손쉽게 작업이 됩니다.

이렇게 전용기판을 따로 만들어 두면 일단 지저분한 선들이 감춰지면서 견고해 지고 브레드보드와 아두이노를 다른 용도로 쓸 수 있게 됩니다.

다른 용도로 쓰다가 아두이노에 소스코드를 올리고 모듈들을 척척 꼽기만 하면 언제든 아두이노 자동차로 다시 태어 날 수 있으니 좋네요.


이번에는 아이들과 함께 작업하면서 가장 적은 돈으로 만들 수 있는 것에 초점을 두었는데요,

아무래도 아이들이 가지고 놀다보니 잘 부서지는 문제도 있고 기술적으로도 너무 허접한 수준이고

비용도 아두이노를 제외하고라도 34,010원이라서 좀 비싼감이 있습니다.

물론, 알리익스프레스에서 직구하면 $10도 안들어 가니까 비싸다고만 할 수 는 없기도 하지요.


다음에는 장난감 탱크를 차체로 해서 부피를 줄이고 좀 더 견고하면서 부품 비용도 더 절약하는 방법으로 다시 포스팅 해볼까 합니다.