2014년 1월 31일 금요일

아두이노 제어를 위한 라스타 RC 개조-연결 및 프로그래밍

거의 1년쯤전에 동생이 핸드폰으로 제어되는 무선조정 자동차를 만들어 보고 싶다고 해서 라스타사의 RC 자동차를 개조하여 보내주었습니다.

그랬더니 한번도 손도 안대고 있다가 할줄 모르겠다고 2014년 설날저녁에 가지고 왔어요.

저도 거의 1년만에 만지다 보니 본래 제 의도를 잘 모르겠더라구요.
할 수 없이 제가 쓴 블로그를 다시 보고 간신히 조립을 했습니다.

한 두시간정도 아두이노 개발도구를 깔고 드라이버잡고..
아두이노 UNO R3는 상당히 오래된 장치라서 아두이노 개발키트에서 드라이버 잡는것이 아주 어려웠습니다.

XP에서 아두이노 UNO R3 드라이버를 깔려면 드라이버 안에 있는 압축폴더를 풀어서 그 안에있는 INF 파일을 사용하셔야 해요..

한 두시간정도 드라이버가 안깔려서 고생을 좀 했습니다.

자세한 사진을 올리려고 했는데 동생이 그냥 가져가 버려서 중간에 찍은 사진밖에 없네요..
나중에 사진을 더 추가하겠습니다.

이것은 모터드라이버 제어선 연결입니다.


이것은 아두이노쪽의 연결이고요
왼쪽이 블루투스 RX-TX 연결 2개선이고요
오른쪽인 모터제어선 6개 입니다.


 아두이노 쪽 연결의 다른 사진입니다.


블루투스 모듈의 연결입니다.
RX-TX선 연결이고요.


블루투스 연결 앞쪽이예요. 전원을 연결했어요


모터드라이버와 모터를 연결한 사진이예요.



안드로이드 제어프로그램은 "BluCar"라는 어플을 사용했습니다.

https://play.google.com/store/apps/details?id=com.uzzors2k.blu_car&hl=ko


아두이노 프로그램 소스는 아래와 같아요.

여유가 있으면 주행 동영상을 올려볼께요.


#include <SoftwareSerial.h>

int bluetoothTx = 2;
int bluetoothRx = 3;

// Left = 0x04;
// Right = 0x08;
// Forward = 0x10;
// Backward = 0x20;
int Cmd = 0;

int DRV_EN = 13;
int DRV_FW = 12;
int DRV_BW = 11;

int WHL_EN = 8;
int WHL_LT = 10;
int WHL_RT = 9;

SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);

void setup() {
  // Setup the function of arduino pins
  pinMode(DRV_EN, OUTPUT);
  pinMode(DRV_FW, OUTPUT);
  pinMode(DRV_BW, OUTPUT);
  pinMode(WHL_EN, OUTPUT);
  pinMode(WHL_LT, OUTPUT);
  pinMode(WHL_RT, OUTPUT);

  // Setup the serial port of arduino
  Serial.begin(9600);

 // Setup Bluetooth serial connecti/on to arduino
  bluetooth.begin(1200);
}

void loop() {
  if(bluetooth.available())
  {
    Cmd = bluetooth.read();
    switch(Cmd & (0x04 | 0x08))
    {
      case 0x00:
        digitalWrite(WHL_EN, LOW);
        digitalWrite(WHL_LT, LOW);
        digitalWrite(WHL_RT, LOW);
        break;
      case 0x04: // Left
        digitalWrite(WHL_EN, HIGH);
        digitalWrite(WHL_LT, HIGH);
        digitalWrite(WHL_RT, LOW);
        break;
      case 0x08: // Right
        digitalWrite(WHL_EN, HIGH);
        digitalWrite(WHL_LT, LOW);
        digitalWrite(WHL_RT, HIGH);
        break;
    }
    switch(Cmd & (0x10 | 0x20))
    {
      case 0x00:
        digitalWrite(DRV_EN, LOW);
        digitalWrite(DRV_FW, LOW);
        digitalWrite(DRV_BW, LOW);
        break;
      case 0x10: // Forward
        digitalWrite(DRV_EN, HIGH);
        digitalWrite(DRV_FW, HIGH);
        digitalWrite(DRV_BW, LOW);
        break;
      case 0x20: // Backward
        digitalWrite(DRV_EN, HIGH);
        digitalWrite(DRV_FW, LOW);
        digitalWrite(DRV_BW, HIGH);
        break;
    }
  }
}