프로젝트 개요


아두이노를 활용하어 RC카, 무선 조종기를 제작했습니다.

원래 처음에 프로젝트를 기획할 때에는 전진, 후진, 우회전, 좌회전, 투석기능이 작동되는 RC카를 제작하려고 했으나, 모터드라이버 배송지연 등의 문제로 불가피하게 전진, 후진만 가능한 RC카를 제작하게 되었습니다.

사용한 부품


학교에서 받은 아두이노키트에는 모터드라이버가 포함되어있지 않아 인터넷에서 4채널 모터드라이버를 주문했다. 그러나 지금까지도 도착하지 않았다. (….)

그래서 릴레이를 사용해서 전진, 후진이라도 가능하도록 제작했다.

Untitled

Untitled

프로젝트 기획당시에는 무선 리모컨과 RC카를 IR로 통신하도록 하려했지만, 통신거리, 속도 등 한계가 있다고 생각되어 블루투스 모듈을 구매해 블루투스로 통신하도록 했다.

바퀴와 그와맞는 차체는 직접 제작하기 쉽지않아 키트를 사용했다.

아두이노에서 출력되는 5V출력은 모터를 돌리기에 부족해 배터리팩을 따로 사용했다.

작동 원리


블루투스 모듈은 연결한다고 바로 연결되는것이 아니라, 초기화, 모드변경, PIN설정 등 여러가지 설정이 필요하다. 그 설정을 한번에 해주는 코드는 아래와 같다.

//////////RC카 블루투스 모듈 초기화 코드//////////
#include <SoftwareSerial.h>
SoftwareSerial bluetooth(3,2);
void setup() 
{
  pinMode(12,OUTPUT);
  digitalWrite(12,LOW);
  pinMode(11,OUTPUT);
  digitalWrite(11,LOW);
  Serial.begin(9600);
  bluetooth.begin(9600);
  String data;
  char buff[10];
  int cnt = 0;
  delay(100);
  bluetooth.print("AT");
  delay(1000);
  cnt = 0;
  while(bluetooth.available()) {
    char c = bluetooth.read();
    buff[cnt] = c;
    cnt ++;
  }
  buff[cnt] = '\\0';
  data = buff;
  if(data == "OK"){
    digitalWrite(12,HIGH);
    delay(100);
    digitalWrite(12,LOW);
    Serial.println("yes");
  }else{
    digitalWrite(11,HIGH);
    while(1);
  }
  
  bluetooth.print("AT+ROLE=S");
  delay(1000);
  cnt = 0;
  while(bluetooth.available()) {
    char c = bluetooth.read();
    buff[cnt] = c;
    cnt ++;
  }
  buff[cnt] = '\\0';
  data = buff;
  if(data == "OK+ROLE:S"){
    digitalWrite(12,HIGH);
    delay(100);
    digitalWrite(12,LOW);
    Serial.println("yes");
  }
  else{
    digitalWrite(11,HIGH);
    while(1);
  }
  
  bluetooth.print("AT+NAMEHC-06");
  delay(1000);
  cnt = 0;
  while(bluetooth.available()) {
    char c = bluetooth.read();
    buff[cnt] = c;
    cnt ++;
  }
  buff[cnt] = '\\0';
  data = buff;
  if(data == "OKsetname"){
    digitalWrite(12,HIGH);
    delay(100);
    digitalWrite(12,LOW);
    Serial.println("yes");
  }
  else{
    digitalWrite(11,HIGH);
    while(1);
  }
  
  bluetooth.print("AT+PIN1234");
  delay(1000);
  cnt = 0;
  while(bluetooth.available()) {
    char c = bluetooth.read();
    buff[cnt] = c;
    cnt ++;
  }
  buff[cnt] = '\\0';
  data = buff;
  if(data == "OKsetPIN"){
    digitalWrite(12,HIGH);
    delay(100);
    digitalWrite(12,LOW);
    Serial.println("yes");
  }else{
    digitalWrite(11,HIGH);
    while(1);
  }
}
void loop()
{
  digitalWrite(12,HIGH);
  delay(100);
  digitalWrite(12,LOW);
  delay(100);
}

//////////리모컨 블루투스 모듈 초기화 코드//////////
#include <SoftwareSerial.h>
SoftwareSerial bluetooth(3, 2);
void setup() 
{
  pinMode(12,OUTPUT);
  digitalWrite(12,LOW);
  pinMode(11,OUTPUT);
  digitalWrite(11,LOW);
  Serial.begin(9600);
  bluetooth.begin(9600);
  String data;
  char buff[10];
  int cnt = 0;
  delay(100);
  bluetooth.print("AT");
  delay(1000);
  cnt = 0;
  while(bluetooth.available()) {
    char c = bluetooth.read();
    buff[cnt] = c;
    cnt ++;
  }
  buff[cnt] = '\\0';
  data = buff;
  if(data == "OK"){
    digitalWrite(12,HIGH);
    delay(100);
    digitalWrite(12,LOW);
    Serial.println("yes");
  }else{
    digitalWrite(11,HIGH);
    while(1);
  }
  
  bluetooth.print("AT+ROLE=M");
  delay(1000);
  cnt = 0;
  while(bluetooth.available()) {
    char c = bluetooth.read();
    buff[cnt] = c;
    cnt ++;
  }
  buff[cnt] = '\\0';
  data = buff;
  if(data == "OK+ROLE:M"){
    digitalWrite(12,HIGH);
    delay(100);
    digitalWrite(12,LOW);
    Serial.println("yes");
  }
  else{
    digitalWrite(11,HIGH);
    while(1);
  }
  
  bluetooth.print("AT+NAMEHC-06");
  delay(1000);
  cnt = 0;
  while(bluetooth.available()) {
    char c = bluetooth.read();
    buff[cnt] = c;
    cnt ++;
  }
  buff[cnt] = '\\0';
  data = buff;
  if(data == "OKsetname"){
    digitalWrite(12,HIGH);
    delay(100);
    digitalWrite(12,LOW);
    Serial.println("yes");
  }
  else{
    digitalWrite(11,HIGH);
    while(1);
  }
  
  bluetooth.print("AT+PIN1234");
  delay(1000);
  cnt = 0;
  while(bluetooth.available()) {
    char c = bluetooth.read();
    buff[cnt] = c;
    cnt ++;
  }
  buff[cnt] = '\\0';
  data = buff;
  if(data == "OKsetPIN"){
    digitalWrite(12,HIGH);
    delay(100);
    digitalWrite(12,LOW);
    Serial.println("yes");
  }else{
    digitalWrite(11,HIGH);
    while(1);
  }
}
void loop()
{
  digitalWrite(12,HIGH);
  delay(100);
  digitalWrite(12,LOW);
  delay(100);
}

위 코드로 블루투스 모듈을 초기화하고, 아래와같이 릴레이를 구성했다.

[릴레이 핀 배열]
S   NC-켜지면 통전 
+   COM-공통단자
-    NO-평상시 통전

[릴레이 역할]
릴레이 1 - 디지털 6
켜지면 양측 BLAK VCC 통전, 평상시 GND 통전

릴레이 2 - 디지털 7
켜지면 양측 RED GND 통전, 평상시 VCC 통전

릴레이 4 - 디지털 9 - 전체 M/V
켜지면 모터전력 전체 VCC 통전

아래는 리모컨 아두이노에 탑제한 메인 실행코드이다. 처음에는 100ms 마다 상태를 송신하려고 했지만, 끊김문제 등 안정성 문제가 발생해 500ms로 조정했다.