구조 및 제작과정 이 다소 복잡한 밸런싱 로봇에 비해 아두이노 모터쉴드에 의한 RC 카는 제작이 간단할뿐더러 앱인벤터에 이한 블루투스 제어 코드의 구조는 거의 같다고 보면 된다. Brokkking의 밸런싱 로봇에서는 블루투스로부터 송신 받은 데이터를 바이트 데이터로 처리하였으나 여기서는 그냥 단순하게 문자로 처리하기로 한다. 그 차이다.
밸런싱 로봇에 사용한 고가의 15,000원 급 스테퍼 모터와는 달리 이번 RC카에 사용하는 모터는 4000원 이하급의 저가 DC 모터이다. 차체에 고정은 양면 테이프를 사용한다. 이 모터를 구동하기 위해서는 L239D 라는 집적회로를 제어해야 하나 실제 해보면 모터는 돌아가는데 2개의 모터가 균일하게 돌지 않는다. 그래서 Adafruit 사에서 발매된 모터쉴드와 AFMotor.h 라이브러리를 함께 사용해야 한다.
아울러 아두이노 실행 코드에 모터 속도를 정해 주게 되어 있는데 그 값을 잘 주어야 한다. 값이 너무 적으면 바퀴가 돌지도 못하면서 윙∼하는 거슬리는 소음이 들린다. 시험해본 결과 mspd = 220 또는 그 이상이 좋은 것 같다. 255가 최대 값이다.
한편 안드로이드 스마트 폰에서 앱인벤터에 의한 HC-06 블루투스 제어가 가능하게 하기 위해서 아두이노 우노 보드의 0번 1번 핀을 이용하기로 하자. 아두이노의 RX 0번과 TX 1번 핀은 USB 케이블을 연결하여 코드를 컴파일 후 업로딩 하는데 사용이 된다. 따라서 컴퍼일 업로딩이 끝나기 전까지는 항상 HC-06 블루투스 보드에서 RX 0번과 TX 1번 핀들을 뽑아 OFF 상태로 두어 LED가 점멸하는 상태에 있어야 함에 유의하자.
한편 Adafruit 모터 쉴드를 씌우게 되면 0번과 1번 핀을 꽂을 수 없으므로 별도로 아두이노 우노 보드의 0번과 1번 핀 사진에서처럼 랜드에 납땜 작업을 하여 점퍼선 핀을 수평으로 꽂을 수 있도록 준비해두어야 한다.
그 다음 모터 쉴드를 조심스럽게 조립하도록 한다.
사진은 모터 쉴드의 M3 와 M4에 모터 배선을 연결하였다. 배선 연결 방법은 드라이버로 나사를 푼 후 측면에서 숫커넥터 침을 넣고 다시 드라이버로 조이면 된다. 배선에서 빨간색은 5V 검은색을 GND를 뜻한다.
RC카 코드 컴파일 업로딩 단계에서는 USB 케이블을 이용하므로 반드시 0번 1번 에 해당하는 블루투스 센서 보드의 핀들이 뽑혀 있음을 확인한다. USB 케이블을 제거하기 전에 시리얼 모니터 문자 입력 박스에서 대문자로 ‘F’, ‘B’, ‘L’, ‘R’, ‘S’를 입력하여 RC카의 바퀴 회전 여부와 방향을 확인해 보도록 하자. 앱인벤터 의 키 구성은 전진,후진,좌회전,우회전,정지의 5가지이며 밸런싱 로봇과 동일하다.
완료 후에 USB 케이블을 제거하고 블루투스의 0번 1번 핀을 연결 후 9V 전지를 아두이노 우노의 검은 색 DC 어댑터dp 잭을 꽂는다.
블루투스 센서 보드가 안드로이드 폰 디바이스를 찾을 때까지 LED 가 껌뻑일 것이다.
헤더 영역의 코딩에서 라이브러리 AFMotor.h 가 반드시 준비되어야 한다. 인터넷에서 쉽게 구할 수 있다. motor1, motor2는 왼쪽 모터와 오른쪽 모터를 뜻하며 3과 4는 모터쉴드에서의 M3과 M4를 뜻한다.
loop()에서는 스마트폰으로부터이 명령을 수신하는 HC-06 블루투스 보드로부터 Serial.available() 명령에 의해 입력 버퍼를 점검하게 된다. 입력 버퍼에 뭔가 수신이 되었으면 Serial.read() 명령을 사용하여 문자 변수 command에 저장한다. 뒤다르는 if 제어문에서 문자가 ‘F’, ‘B’, ‘L’,‘ R’, ‘S’인지를 확인하고 문자 명령에 적합한 서브루틴을 호출하여 RC카를 주행시킨다.
아래의 퍼즐 맞추기는 앱 인벤터 키를 구성하는 블록 편집 결과이다.
작동은 RC CAR Control을 터치하면 블루투스 주소가 뜬다. 이 주소를 터치하면 페어링 연결이 되며 블루투스 센서 보드의 LED 껌뻑임이 멈춘다.
5개의 키를 터치하여 RC카를 운전해 보도록 한다.
좌회전하는 짤을 참고해 보자.
//RCCAR_BT_01
#include <AFMotor.h>
AF_DCMotor motor1(3);
AF_DCMotor motor2(4);
int mspd = 220;
char command;
void setup() {
Serial.begin(9600);
Stop();
}
void loop(){
if(Serial.available() > 0){
command = Serial.read();
if( command == 'F') {
forward();
delay(1000);
}
if( command == 'B') {
back();
delay(1000);
}
if( command == 'L') {
left();
delay(1000);
}
if( command == 'R') {
right();
delay(1000);
}
if( command == 'S') {
Stop();
delay(1000);
}
}
}
void forward() {
motor1.setSpeed(mspd); //Define maximum velocity
motor1.run(FORWARD); //rotate the motor clockwise
motor2.setSpeed(mspd); //Define maximum velocity
motor2.run(FORWARD); //rotate the motor clockwise
}
void back() {
motor1.setSpeed(mspd);
motor1.run(BACKWARD); //rotate the motor counterclockwise
motor2.setSpeed(mspd);
motor2.run(BACKWARD); //rotate the motor counterclockwise
}
void left() {
motor1.setSpeed(mspd); //Define maximum velocity
motor1.run(FORWARD); //rotate the motor clockwise
motor2.setSpeed(0);
motor2.run(RELEASE); //turn motor2 off
}
void right() {
motor1.setSpeed(0);
motor1.run(RELEASE); //turn motor1 off
motor2.setSpeed(mspd); //Define maximum velocity
motor2.run(FORWARD); //rotate the motor clockwise
}
void Stop() {
motor1.setSpeed(0);
motor1.run(RELEASE); //turn motor1 off
motor2.setSpeed(0);
motor2.run(RELEASE); //turn motor2 off
}
//끝
pairplay 가 kr-dev 컨텐츠를 응원합니다! :)
이오스 계정이 없다면 마나마인에서 만든 계정생성툴을 사용해보는건 어떨까요?
https://steemit.com/kr/@virus707/2uepul