험비자동차 제작 방법

작품 이름

작품 이름은 무선 조종 험비자동차 입니다. 자동차를 좋아하는 친구의 머리 속에서 나온 작품으로,

대포를 장착한 모델로 업그레이드 되었고, 무선 조종으로 움직이는 친구입니다.

링크 : Cherokey: A 4WD Basic Robot Building Kit for Arduino

링크 : 아두이노 릴레이 사용법

링크 : [아두이노] 적외선(IR) 리모컨 사용 방법

주요 부품

자동차 키트

Cherokey: A 4WD Basic Robot Building Kit for Arduino 링크

공기압축 대포

이안과학 공기압축 대포 만들기 링크

적외선 송수신기

적외선 리모컨 세트

릴레이 모듈

아두이노 5V 릴레이

회로도

아두이노액츄에이터
D4D4
D5D5
D6D6
D7D7
RXRX
TXDX
5V5V
GNDGND
아두이노적외선센서
A4DAT
5VVCC
GNDGND

하드웨어 제작/조립 방법

모터를 프레임에 조립해 줍니다.

프레임 덮개를 덮어줍니다.

바퀴를 달아줍니다.

상면에 오렌지보드를 마운팅합니다.

하부에 배터리 홀더를 장착합니다.

바퀴의 전선을 보드의 상면으로 구멍을 통해 통과시킵니다.

각 모터에서 올라온 전선을 그림과 같이 연결합니다.

배터리 홀더의 전선을 상면으로 연결해 줍니다.

스위치를 켜면 불이 들어오는 것을 확인합니다.

아두이노에도 전원이 공급되도록 플러그를 연결합니다.

모터제어를 위한 결선을 실시합니다. (상부 테이블 참고)

적외선 리모컨 센서는 사진과 같이 연결됩니다.(위 표를 참고하세요.) 전원은 뒷바퀴 근처의 5V, GND에서 연결해 옵니다.

대포에 공급할 전원을 그림과 같이 연결합니다. 대포에 보낼 신호선을 D9에 연결합니다.

뒷바퀴 근처의 5V, GND에서 릴레이로 공급될 전원선을 연결해 둡니다.

덮개를 지지할 기둥을 체결합니다.(긴것+짧은것을 연결해서 기둥을 길게 만들어서 체결합니다.)

덮개를 덮고 적외선센서, 릴레이, 대포를 덮개위 적당한 위치에 배치합니다.

전원선(-)을 모터에 연결. 모터 나머지 부분을 릴레이 NO에 연결

전원선(+) 를 릴레이 Com에 연결,

아두이노(5V) -> 릴레이IN(VCC)

아두이노(GND) ->릴레이IN(GND)

아두이노(D9) -> 릴레이IN (신호선)

코드

아두이노에서 아래 코드를 업로드 해줍니다.

/*
 # Edited by:  Matt
 # Date:       2015.09.06
 # Version:    1.1
 # Product:    Cherokey 4WD Mobile Platform
 # SKU:        ROB0102/ROB0117

 # Description:
 # Drive 2 motors with this Cherokey 4WD Mobile Platform
 # Connect D4,D5,D6,D7,GND to UNO digital 4,5,6,7,GND

*/
#include <IRremote.h>//IR리모컨라이브러리  
//
int RECV_PIN = A4;//포트설정
IRrecv irrecv(RECV_PIN);                    // IR리모콘 사용을 위한 클래스 생성 
decode_results decodedSignal;               // IR리모콘으로부터 받은 데이터
// Relay설정
int Relay = 9;0

// 모터 속도 설정
int MotorSpeed = 255;

unsigned long last = millis();
// 적외선 리모컨 동작 정의
const long go_forward = 0x00FF18E7;//2번 버튼
const long go_backward = 0x00FF4AB5;//8번 버튼
const long go_left = 0x00FF10EF;//4번 버튼
const long go_right = 0x00FF5AA5;//6번 버튼
const long stop_car = 0x00FF38C7;//5번 버튼
const long left_turn = 0x00ff30CF;//1번 버튼
const long right_turn = 0x00FF7A85;//3번 버튼
const long fire_cannon = 0x00FFA857; //+ 버튼
//
  
//Motor Definitions
int E1 = 5;     //M1 Speed Control
int E2 = 6;     //M2 Speed Control
int M1 = 4;     //M1 Direction Control
int M2 = 7;     //M2 Direction Control

// cannon
void Fire_Cannon() {

  digitalWrite(Relay, LOW);
  delay(3000);
  digitalWrite(Relay, HIGH);
  delay(1000);
  
}

//DIRECTIONS

//STOP
void stop(void)
{
  digitalWrite(E1, 0);
  digitalWrite(M1, LOW);
  digitalWrite(E2, 0);
  digitalWrite(M2, LOW);
}

//ADVANCE
void advance(char a, char b)
{
  analogWrite (E1, a);
  digitalWrite(M1, HIGH);
  analogWrite (E2, b);
  digitalWrite(M2, HIGH);
}

//MOVE BACKWARDS
void back_off (char a, char b)
{
  analogWrite (E1, a);
  digitalWrite(M1, LOW);
  analogWrite (E2, b);
  digitalWrite(M2, LOW);
}


//TURN LEFT
void turn_L (char a, char b)
{
  analogWrite (E1, a);
  digitalWrite(M1, HIGH);
  analogWrite (E2, b);
  digitalWrite(M2, LOW);
}

//TURN RIGHT
void turn_R (char a, char b)
{
  analogWrite (E1, a);
  digitalWrite(M1, LOW);
  analogWrite (E2, b);
  digitalWrite(M2, HIGH);
}

void setup(void) {
  int i;
  for (i = 4; i <= 7; i++)
    pinMode(i, OUTPUT);
    
  Serial.begin(9600);      //Set Baud Rate
  
//  Serial.println("hello. w = forward, d = turn right, a = turn left, s = backward, x = stop, z = hello world"); //Display instructions in the serial monitor
  digitalWrite(E1, LOW);
  digitalWrite(E2, LOW);
  digitalWrite(M1, LOW);
  digitalWrite(M2, LOW);  
  irrecv.enableIRIn();
  pinMode(Relay, OUTPUT); 
  digitalWrite(Relay, HIGH);

}

void loop(void) {
  if (irrecv.decode(&decodedSignal) == true) {

//    long val = decodedSignal.value;
    if (decodedSignal.value != 0xFFFFFFFF)
    {
      Serial.println(decodedSignal.value, HEX);
      switch (decodedSignal.value)
      {
        case  fire_cannon: // 대포 발사
          Serial.println("Cannon Fire");
          Fire_Cannon();
          last = millis(); 
          break;
      
        case  go_forward://Move Forward
          Serial.println("going forward");
          advance (MotorSpeed, `);  //move forward at max speed
//          delay (1000);
//          stop();
          last = millis();      
          break;
        case go_backward://Move Backward
          Serial.println("going backward");
          back_off (MotorSpeed, MotorSpeed);  //move backwards at max speed
//          delay (1000);
//          stop();
          break;
        case go_left://Turn Left
          Serial.println("turning left");
          turn_L (MotorSpeed, MotorSpeed);
//          delay (1000);
//          stop();
          break;
        case go_right://Turn Right
          Serial.println("turning right");
          turn_R (MotorSpeed, MotorSpeed);
//          delay (1000);
//          stop();
          break;
        case 'z':
          Serial.println("hello world!");
          break;
        case stop_car:
          Serial.println("stopping");
          stop();
          break;
      }

    }
//    else stop();
      last = millis();
      irrecv.resume(); // Receive the next value
  }
}

트러블 슈팅 과정


원격조종을 블루투스를 통해 모바일 폰으로 제어하려고 했는데, 적당한 라이브러리를 찾지 못해서였는지 리모컨 제어가 불가하였습니다.

대안으로 적외선 리모컨을 이용하여 제어를 하기로 하고, 적외선 리모컨 모듈 사용하는 법등을 찾아서 간단한 회로/코드 테스트를 통해서 성공하게 되었습니다.