Instructables
loading
loading

Simple RC car for beginners (Android control over Bluetooth)

Featured
Picture of Simple RC car for beginners (Android control over Bluetooth)
This is a simple project of Android Bluetooth Car with Bluetooth control. Arduino controller is used

To control the car used Android-device with a built-in accelerometer. Tilt forward - car goes forward, tilt to the left - car turns to the left, tilt back - car goes back. Speed of movement or rotation depends on how much you tilt the device. Sensitivity and value of the tilt set in the configuration Android-apps. Also are provided a normal way to control: the buttons on the screen. In addition to all I implemented the touch control. Total 3 ways to control the RC Car.

Capabilities of the device you can see on the video above
 
Remove these adsRemove these ads by Signing Up

Step 1: Android device

Picture of Android device
Parts needed

1. Android device

The most important part - Android device with accelerometer and Bluetooth: tablet, smartphone and other... As an Android device, I used a cheap Chinese tablet "Ainol Aurora" with an external USB-Bluetooth module (because its not have own), connected via USB Host.

Step 2: DIY Car Chassis

Picture of DIY Car Chassis
arduino_car.jpg
2. DIY Car Chassis

We also need any chassis with 2 or 4 DC motors. You can use an old RC toy car. As a platform I used a small RC DIY platform, bought on eBay for $ 25. To control described in this project is most suitable track chassis.

Step 3: Controller (MCU)

Picture of Controller (MCU)
3. Controller (MCU)

You need Arduino-compatible controller

Controller must support 2 PWM and UART.

Step 4: Bluetooth module

Picture of Bluetooth module
4. Bluetooth module

As a Bluetooth module uses cheap Chinese module HC-06 (6-8$ on eBay). Instructions guide on connecting bluetooth module to Arduino is here.
You can use HC-05, HC-07 and other serial Bluetooth modules

Step 5: Motor Driver

Picture of Motor Driver
5. Motor Driver

I used L298N Dual Bridge DC stepper Motor Driver module. It cost 4-5$ on eBay.

Step 6: Other parts

Picture of Other parts
6. Other parts


Step 7: Theory

Picture of Theory
Theory

All calculations are performed in the Android-application, and immediately calculate the values 2‹2‹of the PWM for the left and right motor. Application has flexible settings, such as the range of the PWM, the sensitivity of tilt, the minimum threshold for the PWM and other. Example commands transmitted by Bluetooth:
L-255\rR-120\r
L - the command to the left engine, R - for the right
A dash means the motor rotation to move back
255 - PWM value (for Arduino is the maximum speed of rotation)
\r - end of command.
On this command RC car will move forward and slightly rotated to the right, as right engine rotates slowly left.

L255\rR-255\r
On this command the left engine will rotate back and forward right, forcing a car to rotate around its axis counterclockwise.

H1\r
Command is an additional channel to which you can connect for example lights, sound, etc.

Symbols command L, R and H can be defined in the settings of Android-applications.

In the MCU control program provides a timer that shuts off the engine if the last command was received more than n-seconds ago. The data are stored in the EEPROM memory of the controller and can be changed from Android device. The range of this setting is from 0.1 seconds to 99.9 seconds. This setting can be disabled. To work with EEPROM provides commands: Fr - reading values 2‹2‹and Fw - record values.

Electronics

Block diagram see on picture above

Step 8: Android Application

Picture of Android Application
10.png
11.png
As we can see, the Arduino connects to Bluetooth module and a motor driver with two or four connected motors.

Android Application

The application for Android was written in Eclipse IDE. All sources of the project and the project for Eclipse, you can download below. Android version on your device must be > 3.0.

The application contains several activity. Main activity is a home screen with buttons running different operating modes and settings

There are 3 control modes Bluetooth-car: from accelerometer, screen buttons and touch-control.

Android application settings

Screenshot of settings CxemCar Android application version 1.0

MAC address

To establish a connection with the RC Car's Bluetooth module, you must set MAC-address in the application settings. But first, you must configure the pair the devices on Android-device: open Settings -> Bluetooth and click "Search for devices". When the phone finds our Bluetooth-module, click them and enter password for pairing (usually "1234")

To know Bluetooth module MAC-address possible from any application, such as Bluetooth Terminal. To do this, click "Connect a device - Secure" and in the resulting window, click the button "Scan for devices". Software will be scans the Bluetooth devices and displays them MAC-address.

Step 9: Arduino RC car wiring

Picture of Arduino RC car wiring
13.jpg
14.jpg
15.jpg
16.jpg
Wiring diagram for Arduino controller

In the circuit I used a jumper (in the scheme Jmp1), because with a connected Bluetooth module is impossible be load sketch to the Arduino.

I soldered a Bluetooth-module to the Arduino and led status light. For communication between Arduino and Bluetooth, read this article: Arduino and Bluetooth. Module HC-06 placed in heat-shrink tube 10mm. Bluetooth-state LED with current limiting resistor (calculator) were also placed in heat-shrink tube.

In the breadboard platform, I drilled a hole and secure motor driver L298N. Arduino board attached with double-sided tape

Between the car platform and breadboard I placed 3 Li-Po battery 3.7V 1100 mAh. Power to the controller and motors separately: Arduino powered by a 3.7 V battery, and the motors and driver L298N from two 3.7V batteries connected in series. There are two 2-position power switch - one position is the power from the batteries to consumers, in the other position to charging terminals.

Beetween BT pin RX (2) and Arduino pin TX may require level shifter. For this, you can use voltage divider: calculator 5V to 3.3V

Step 10: Software

Picture of Software
The program was written in Arduino IDE 1.01.

#include "EEPROM.h"

#define D1 2          // direction of motor rotation 1
#define M1 3          // PWM left motor
#define D2 4          // direction of motor rotation 2
#define M2 5          // PWM right motor
#define HORN 13       // additional channel 1
//#define autoOFF 2500  // milliseconds after which the robot stops when the connection

#define cmdL 'L'      // UART-command for left motor
#define cmdR 'R'      // UART-command for right motor
#define cmdH 'H'      // UART-command for additional channel (for example Horn)
#define cmdF 'F'      // UART-command for EEPROM operation
#define cmdr 'r'      // UART-command for EEPROM operation (read)
#define cmdw 'w'      // UART-command for EEPROM operation (write)

char incomingByte;    // incoming data

char L_Data[4];       // array data for left motor
byte L_index = 0;     // index of array L
char R_Data[4];       // array data for right motor
byte R_index = 0;     // index of array R
char H_Data[1];       // array data for additional channel
byte H_index = 0;     // index of array H
char F_Data[8];       // array data for  EEPROM
byte F_index = 0;     // index of array F
char command;         // command

unsigned long currentTime, lastTimeCommand, autoOFF;

void setup() {
  Serial.begin(9600);       // initialization UART
  pinMode(HORN, OUTPUT);    // additional channel
  pinMode(D1, OUTPUT);      // output for motor rotation
  pinMode(D2, OUTPUT);      // output for motor rotation
  /*EEPROM.write(0,255);
  EEPROM.write(1,255);
  EEPROM.write(2,255);
  EEPROM.write(3,255);*/
  timer_init();             // initialization software timer
}

void timer_init() {
  uint8_t sw_autoOFF = EEPROM.read(0);   // read EEPROM "is activated or not stopping the car when losing connection"
  if(sw_autoOFF == '1'){                 // if activated
    char var_Data[3];
    var_Data[0] = EEPROM.read(1);
    var_Data[1] = EEPROM.read(2);
    var_Data[2] = EEPROM.read(3);
    autoOFF = atoi(var_Data)*100;        // variable autoOFF ms
  }
  else if(sw_autoOFF == '0'){        
    autoOFF = 999999;
  }
  else if(sw_autoOFF == 255){
    autoOFF = 2500;                      // if the EEPROM is blank, dafault value is 2.5 sec
  }
  currentTime = millis();                // read the time elapsed since application start
}
 
void loop() {
  if (Serial.available() > 0) {          // if received UART data
    incomingByte = Serial.read();        // raed byte
    if(incomingByte == cmdL) {           // if received data for left motor L
      command = cmdL;                    // current command
      memset(L_Data,0,sizeof(L_Data));   // clear array
      L_index = 0;                       // resetting array index
    }
    else if(incomingByte == cmdR) {      // if received data for left motor R
      command = cmdR;
      memset(R_Data,0,sizeof(R_Data));
      R_index = 0;
    }
    else if(incomingByte == cmdH) {      // if received data for additional channel
      command = cmdH;
      memset(H_Data,0,sizeof(H_Data));
      H_index = 0;
    }   
    else if(incomingByte == cmdF) {      // if received data for EEPROM op
      command = cmdF;
      memset(F_Data,0,sizeof(F_Data));
      F_index = 0;
    }
    else if(incomingByte == '\r') command = 'e';   // end of line
    else if(incomingByte == '\t') command = 't';   // end of line for EEPROM op
    
    if(command == cmdL && incomingByte != cmdL){
      L_Data[L_index] = incomingByte;              // store each byte in the array
      L_index++;                                   // increment array index
    }
    else if(command == cmdR && incomingByte != cmdR){
      R_Data[R_index] = incomingByte;
      R_index++;
    }
    else if(command == cmdH && incomingByte != cmdH){
      H_Data[H_index] = incomingByte;
      H_index++;
    }   
    else if(command == cmdF && incomingByte != cmdF){
      F_Data[F_index] = incomingByte;
      F_index++;
    }   
    else if(command == 'e'){                       // if we take the line end
      Control4WD(atoi(L_Data),atoi(R_Data),atoi(H_Data));
      delay(10);
    }
    else if(command == 't'){                       // if we take the EEPROM line end
      Flash_Op(F_Data[0],F_Data[1],F_Data[2],F_Data[3],F_Data[4]);
    }
    lastTimeCommand = millis();                    // read the time elapsed since application start
  }
  if(millis() >= (lastTimeCommand + autoOFF)){     // compare the current timer with variable lastTimeCommand + autoOFF
    Control4WD(0,0,0);                             // stop the car
  }
}

void Control4WD(int mLeft, int mRight, uint8_t Horn){

  bool directionL, directionR;      // direction of motor rotation L298N
  byte valueL, valueR;              // PWM M1, M2 (0-255)
  
  if(mLeft > 0){
    valueL = mLeft;
    directionL = 0;
  }
  else if(mLeft < 0){
    valueL = 255 - abs(mLeft);
    directionL = 1;
  }
  else {
    directionL = 0;
    valueL = 0;
  }
 
  if(mRight > 0){
    valueR = mRight;
    directionR = 0;
  }
  else if(mRight < 0){
    valueR = 255 - abs(mRight);
    directionR = 1;
  }
  else {
    directionR = 0;
    valueR = 0;
  }
   
  analogWrite(M1, valueL);            // set speed for left motor
  analogWrite(M2, valueR);            // set speed for right motor
  digitalWrite(D1, directionL);       // set direction of left motor rotation
  digitalWrite(D2, directionR);       // set direction of right motor rotation
  
  digitalWrite(HORN, Horn);           // additional channel
}

void Flash_Op(char FCMD, uint8_t z1, uint8_t z2, uint8_t z3, uint8_t z4){

  if(FCMD == cmdr){           // if EEPROM data read command
    Serial.print("FData:");       // send EEPROM data
    Serial.write(EEPROM.read(0));     // read value from the memory with 0 address and print it to UART
    Serial.write(EEPROM.read(1));
    Serial.write(EEPROM.read(2));
    Serial.write(EEPROM.read(3));
    Serial.print("\r\n");         // mark the end of the transmission of data EEPROM
  }
  else if(FCMD == cmdw){          // if EEPROM data write command
    EEPROM.write(0,z1);               // z1 record to a memory with 0 address
    EEPROM.write(1,z2);
    EEPROM.write(2,z3);
    EEPROM.write(3,z4);
    timer_init();             // reinitialize the timer
    Serial.print("FWOK\r\n");         // send a message that the data is successfully written to EEPROM
  }
The code uses a library to work with EEPROM AVR-memory. Arduino board by USART from the Bluetooth module receives data ready for the left and right engine. All basic calculations are performed in the Android application.

The project structure in Eclipse you can see on the screenshot above.

You can download the source code for the Arduino, and the project for Eclipse
Download APK application for Android-device

The latest software version can be found on this page

Video of demonstration the virtual steering wheel mode (1.2 version and above):


P.S. Sorry for my bad english
P.S.S. Soon to be the same project for STM32
1-40 of 122Next »
NguyễnH1023 days ago

Good evening sir. I already downloaded the Android Application but it's not the English version. it's different language. where can I find English version sir? Thank you in advance

NguyễnH1023 days ago
Ee HueiN1 month ago

i get a socket failed on the cxem app as well, what could be the problem? The LED on my bluetooth module is blinking also. Can the arduino uno and motor driver be on at the same time?

a1m918 Ee HueiN26 days ago

Solution for your "Socket Failed" is:

Go to setting OR Tap menu button or [. . .] button and press setting.

then tap MAC address, and enter you Bluetooth Module MAC address (the one which is connected to your arduino)
save settings. and you are Ready to go !

Ee HueiN1 month ago

May I know do I still need to load any program to the arduino or it will be loaded once I connect my android to the bluetooth module? Do I need to supply voltage to VCC of the motor driver? and where does D13 connect to? Thanks.

LokmanH1 month ago

Arduino: 1.6.3 (Windows 7), Board: "Arduino Uno"

Sketch uses 3,624 bytes (11%) of program storage space. Maximum is 32,256 bytes.

Global variables use 231 bytes (11%) of dynamic memory, leaving 1,817 bytes for local variables. Maximum is 2,048 bytes.

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0xa1

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0xa1

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0xa1

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0xa1

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0xa1

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0xa1

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0xa1

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0xa1

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0xa1

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0xa1

Problem uploading to board. See http://www.arduino.cc/en/Guide/Troubleshooting#upload for suggestions.

This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences.

tolik777 (author)  LokmanH1 month ago

Try to disconnect the wire TX from the Bluetooth module

thx bro

can u help me with a recomandation for future work what can i do next using the same equipment

a1m918 made it!2 months ago

Thank you :) for sharing such a brief tutorial.

Bilal Syed6 minsUnlike ·.jpg
AlonzoW a1m9181 month ago

what phone app did you use i can't find the cxem app

a1m918 AlonzoW1 month ago

the download link for the CXEM app is available in last steps. I used the same app that was provided. the only thing I needed, was to put MAC address into this app for SYNC purpose.

AlonzoW1 month ago

The app isn't in the app store

i need help please , when i use the android application to control the car .. the phone show me an error message called " socket failed " .. i need help as soon as possible !

I have encountered the same problem. Did you able to solve it? If yes, how?

KafoumbaD2 months ago

Hey I completed all the steps and all my LEDs are connected. However after connected the bluetooth to my phone, I am unable to make the rc car move. do you know what could be the problem? Tahnk you

Plz put it on amazon

i looked at video and observe in the end view of cables, i didn't see where does GND of controller and GND of motor driver go? in general, what is the right way, i need to connect all GND and minus of each battery together and connect this heap to metal carcass? or just together without connect to carcass?

about cables, are used just simple cables or specific?

Hello! I am interested in this project, but i am newbie/, i have some questions(part of them meybe stupid), but help me please=). So:

-if i am using http://www.ebay.com/itm/MINI-USB-Nano-V3-0-ATmega3... this kind of controller, i need arduino tx and BT rx level shifter?

-from the diagram, 3V3 from controller goes to 3V3 BT, what pin is 3V3 BT on the BT?, where are RX, TX, GND and VCC, so i suppose that 3V3 BT is VCC

-and one newbie question: so i must have 3.7V power on controller and 7.4V on motor driver, in diagram is showed just each has one connection(+) but where goes second(-)? i suppose that goes to GND or it's wrong?

boybielove3 months ago

Hello, can I ask if I could use Intel Galileo gen 2 for this project? I am a newbie! :D

VinnyB3 months ago

can you use the arduino motor shield instead of the motor controller

sir can arduino uno R3 can be used in this project with the same arduino code?

tapobratp4 months ago

i m a new beginner in this field so i want a total coading of arduino uno328 for robot movement via my android mobile bluetooth

you can use any type of arduino

kpoiu6 months ago

Android RC Control Adrian $10

mukesh01217 months ago

hiiii,

i have made this project and its successful,

I just want to ask that how can i add an hc sr04 sensor into it, plz give me the details for doing this,,,,

what will be the arduino coding for adding this distance sensor, plz. help me in this existing arduino coding. any help should be highly appreciated.

you can also email the coding at- mirnal.mannu123@gmail.com

kx 608 months ago
cool I'll try it
mail2whs9 months ago

Really an amazing steps for mobile control. There is a search engine where anyone can find the RC toys and accessories with various types of model and variety.

http://www.whichhobbystory.com

whslogo_1.png
NOSNEBF10 months ago

This is my first project with arduino , so can anyone please modify the sketch for an RC car where one motor steers the front wheels and the the other motor moves the car forward and reverse?

RoboRemo NOSNEBF9 months ago

Hi, I made a similar project, you can find it here:

http://www.roboremo.com/rc-car.html

apravin1 year ago

Can anyone help me by converting the same program in the instructables for arduino nano v3.0. The details of arduino nano v3.0 and motor driver is attached in below post...

Please some one help me.

apravin1 year ago

Can anyone help me by converting the same program in the instructables for arduino nano v3.0. The details of arduino nano v3.0 and motor driver is attached in below post...

Please some one help me.

apravin1 year ago

Can anyone help me by converting the same program in the instructables for arduino nano v3.0. The details of arduino nano v3.0 and motor driver is attached in below post...

Please some one help me.

apravin1 year ago

Can anyone help me by converting the same program in the instructables for arduino nano v3.0. The details of arduino nano v3.0 and motor driver is attached in below post...

Please some one help me.

apravin1 year ago

Can anyone help me by converting the same program in the instructables for arduino nano v3.0. The details of arduino nano v3.0 and motor driver is attached in below post...

Please some one help me.

apravin1 year ago

Can anyone help me by converting the same program in the instructables for arduino nano v3.0. The details of arduino nano v3.0 and motor driver is attached in below post...

Please some one help me.

apravin1 year ago

Hai,


I am working on ,"Simple Rc car controlled over bluetooth", project but the motors are not responding. so i decided to check motors first. But even i am troubling in that. Please help me

The program of arduino to control two Dc motors using L298N or L293D
is given below. I am using Arduino nano V3.0 board. with the below
code i just want to run the motors.
Just i want to check the motor driver is working or not.

The IN1, IN2, IN3 and IN4 are connected to D2, D3, D4 and D5 of my
arduino nano. Does the connections and program match each other? What
else i need to change in the connections or program.

more details of arduino nano V3.0 is in
http://arduino.cc/en/Main/arduinoBoardNano

The schematic of Arduino nano and image of my motor driver is attached with it.

Programe

int IN1=2;//connected to Arduino's port 2
int IN2=3;//connected to Arduino's port 3
int IN3=4;//connected to Arduino's port 4
int IN4=5;//connected to Arduino's port 5
void setup()
{
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
}
void loop()
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);//setting motorA's directon
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);//setting motorB's directon
}



--
pravin

20140527_201348.jpg20140527_201152.jpg20140527_201142.jpgScreenshot from 2014-05-28 12:26:49.pngnano.jpgurl.jpeg61wIpoYe+OL.png
apravin1 year ago

Hai...
I have some problem in 'android arduino bot controlled over bluetooth'. I am using motor driver l298n, arduino nano v3.0 and HC-05 BT module. But the motors are not working with the given programe here. Problem in iterfacing motor driver with arduino
My motor driver pictures are attached here
Thank you
Pravin
20140527_201142.jpg20140527_201152.jpg20140527_201348.jpg
Andri08031 year ago

I have problem with my project... The project get error "The blank final field Mhandler may not have been initialized", what should i do? thx..

1-40 of 122Next »