Introduction: Arduino Tank Car Lesson 4-IR Remote Tank Car

About: Osoyoo brand products are mainly focused on STEM education.User experience and customer feeling are always our first priority. Our goal is to create the best designed product to help students and hobbyist to e…

In this tutorial, we will use KOOKYE Smart tank car to make a simple

remote controlled smart car. Once the car installation is completed, we will use a Infrared Remote to control the car movements including go forward, go back, left turn and right turn.

Detailed Tutorials: http://kookye.com/?p=5794
Buy it for USA : Amazon.com

Step 1: How It Work

There is a IR receiver and remote control. The arduino board would

translate the programs to the predefined behaviors once it receive the IR signals from remote control.

Step 2: ​Software Installation:

Step 1: Install latest Arduino IDE (If you have Arduino IDE version after 1.1.16, please skip this step)
Download Arduino IDE from https://www.arduino.cc/en/Main/Software?setlang=en... , then install the software.

Step 2: Install IRremote library into Arduino IDE (If you have already installed IRremote library, please skip this step)

Download IRremote library from http://www.kookye.com/download/car/IRremote.zip, then import the library into Arduino IDE(Open Arduino IDE-> click Sketch->Include Library->Add .Zip Library)

Step 3:Download Lesson 4 sample code from http://www.kookye.com/download/car/tank_robot_less... , unzip the download zip file tank_robot_lesson4.zip, you will see a folder called tank_robot_lesson4.

Step 4: Connect UNO R3 board to PC with USB cable, Open Arduino IDE ->; click file ->; click Open ->; choose code "tank_robot_lesson4.ino" in tank_robot_lesson4 folder, load the code into arduino.

Step 5:Choose corresponding board and port for your project,upload the sketch to the board.

Step 3: Understanding the Code:

Part 1: Define the button that you will be using on IR remote control.

(If you use the lesson 1example code, the arduino IDE Serial Monitor will output its counterpart IR code.)

#define IR_ADVANCE 0x00FF18E7 //code from IR controller "▲" button

#define IR_BACK 0x00FF4AB5 //code from IR controller "▼" button

#define IR_RIGHT 0x00FF5AA5 //code from IR controller ">;" button

#define IR_LEFT 0x00FF10EF //code from IR controller "<;" button

#define IR_SERVO 0x00FF38C7 //code from IR controller "OK" button

#define IR_OPENLED 0x00FFB04F //code from IR controller "#" button

#define IR_CLOSELED 0x00FF6897 //code from IR controller "*" button

#define IR_BEEP 0x00FF9867 //code from IR controller "0" button

Part 2:The function on IR Remote Control

Part 3:Define movement name for each button.

enum DN
{

GO_ADVANCE, //go ahead

GO_LEFT, //left turn

GO_RIGHT,//right turn

GO_BACK,//go back

MOVE_SERVO,//move servo

OPEN_LED,//open led

CLOSE_LED,//close led

BEEP,//control buzzer

DEF

}Drive_Num=DEF;

Part 4:Decode the IR signal and translate button code into movment name.
void do_IR_Tick()

{

if(IR.decode(&IRresults))

{ if(IRresults.value==IR_ADVANCE)

{

Drive_Num=GO_ADVANCE;

}

else if(IRresults.value==IR_RIGHT)

{

Drive_Num=GO_RIGHT;

}

else if(IRresults.value==IR_LEFT)

{

Drive_Num=GO_LEFT;

}

else if(IRresults.value==IR_BACK)

{

Drive_Num=GO_BACK;

}

else if(IRresults.value==IR_SERVO)

{

Drive_Num=MOVE_SERVO;

}

else if(IRresults.value==IR_OPENLED)

{

Drive_Num=OPEN_LED;

}

else if(IRresults.value==IR_CLOSELED)

{

Drive_Num=CLOSE_LED;

}

else if(IRresults.value==IR_BEEP)

{

Drive_Num=BEEP;

}

IRresults.value = 0;

IR.resume();

}

}

Part 5:Execute movement function as per movement name from Part 4.

void do_Drive_Tick()
{

switch (Drive_Num)

{

case GO_ADVANCE:

go_ahead(10);JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;//if GO_ADVANCE code is detected, then go advance

case GO_LEFT:

turn_left(10);JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;//if GO_LEFT code is detected, then turn left

case GO_RIGHT:

turn_right(10);JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;//if GO_RIGHT code is detected, then turn right

case GO_BACK:

go_back(10);JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;//if GO_BACK code is detected, then backward

case MOVE_SERVO:

move_servo();JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;//move servo

case OPEN_LED:

open_led(1),open_led(2);JogTime = 0;break;//open led

case CLOSE_LED:

close_led(1),close_led(2);JogTime = 0;break;//close led

case BEEP:

control_beep();JogTime = 0;break;//control beep

default:break;

}

Drive_Num=DEF;

//keep current moving mode for 200 millis seconds

if(millis()-JogTime>=200)
{

JogTime=millis();

if(JogFlag == true)

{

stopFlag = false;

if(JogTimeCnt <= 0)

{

JogFlag = false; stopFlag = true;

}

JogTimeCnt--;

}

if(stopFlag == true)

{

JogTimeCnt=0;

go_stop();

}

}

}

/*******Turn on LED # led_num*******/
void open_led(int led_num) { if (led_num == 1) digitalWrite(LED1,LOW); else digitalWrite(LED2,LOW); }

/*******Turn off LED # led_num*******/
void close_led(int led_num) { if (led_num == 1) digitalWrite(LED1,HIGH); else digitalWrite(LED2,HIGH);

/*******Beep buzzer*******/
void control_beep() { digitalWrite(BUZZER,LOW),delay(100); digitalWrite(BUZZER,HIGH),delay(100); }

/***move servo***/
void move_servo() { int i; for(i = 0;i<180;i++){ head.write(i); delay(5); } for(i = 180;i>=0;i--){ head.write(i); delay(5); } head.write(90); }

Step 4: Hardware Installation:

Step 1: Install expansion board on UNO R3 board.

Step 2: Move the wire connected to pinout(GND,VCC,S) in IR recevier to the counterpart pin in expansion board as the following picture.

Step 3: Turn the switch of expansion board to "1" and "2" position, as the following photo shows.

Step 4: Put two 12865 batteries in battery box and turn the swith of box to "ON". (If you have finished the above steps on lesson one, please skip these steps)

Step 5:Press IR controller keys to control the car movements as per predefine code.

Note: Please check the wire connections if the tank car can not work as expected.