Building Arduino Bluetooth-Controlled RC Car

Recently, I had the opportunity to assemble and drive my very first Arduino-powered Bluetooth-controlled RC car. Creating my own wireless RC car has been a personal goal for a long time. I’ve written multiple tutorials covering the core technologies behind this wireless controlled car such as bluetooth technology, the dc motor driver and of course Arduino. Seeing it finally move under Bluetooth control gave me a real sense of happiness. 

Below are images of my first Arduino RC Bluetooth car in action.

Arduino RC bluetooth car

Below are the main parts that were used:

Controlling the Car with a Mobile App

The car is operated using a mobile application called “RC Bluetooth Car.” The app sends command characters via Bluetooth to the HC-05 module connected to the Arduino. Based on the received command, the Arduino controls the motors through the L293D motor shield.

Below is the Arduino program used in this project:

#include <AFMotor.h>

//initial motors pin
AF_DCMotor motor1(1, MOTOR12_1KHZ);
AF_DCMotor motor2(2, MOTOR12_1KHZ);
AF_DCMotor motor3(3, MOTOR34_1KHZ);
AF_DCMotor motor4(4, MOTOR34_1KHZ);

char command;

void setup()
{
  Serial.begin(9600);  //Set the baud rate to your Bluetooth module.
}

void loop() {
  if (Serial.available() > 0) {
    command = Serial.read();

    stop(); //initialize with motors stopped
    
    switch (command) {
      case 'F':
        forward();
        break;
      case 'B':
        back();
        break;
      case 'L':
        left();
        break;
      case 'R':
        right();
        break;
      case 'S':
        stop();
        break;
    }
  }
}

void forward()
{
  motor1.setSpeed(255); //Define maximum velocity
  motor1.run(FORWARD);  //rotate the motor clockwise
  motor2.setSpeed(255); //Define maximum velocity
  motor2.run(FORWARD);  //rotate the motor clockwise
  motor3.setSpeed(255); //Define maximum velocity
  motor3.run(FORWARD);  //rotate the motor clockwise
  motor4.setSpeed(255); //Define maximum velocity
  motor4.run(FORWARD);  //rotate the motor clockwise
}

void back()
{
  motor1.setSpeed(255); //Define maximum velocity
  motor1.run(BACKWARD); //rotate the motor anti-clockwise
  motor2.setSpeed(255); //Define maximum velocity
  motor2.run(BACKWARD); //rotate the motor anti-clockwise
  motor3.setSpeed(255); //Define maximum velocity
  motor3.run(BACKWARD); //rotate the motor anti-clockwise
  motor4.setSpeed(255); //Define maximum velocity
  motor4.run(BACKWARD); //rotate the motor anti-clockwise
}

void left()
{
  motor1.setSpeed(255); //Define maximum velocity
  motor1.run(BACKWARD); //rotate the motor anti-clockwise
  motor2.setSpeed(255); //Define maximum velocity
  motor2.run(BACKWARD); //rotate the motor anti-clockwise
  motor3.setSpeed(255); //Define maximum velocity
  motor3.run(FORWARD);  //rotate the motor clockwise
  motor4.setSpeed(255); //Define maximum velocity
  motor4.run(FORWARD);  //rotate the motor clockwise
}

void right()
{
  motor1.setSpeed(255); //Define maximum velocity
  motor1.run(FORWARD);  //rotate the motor clockwise
  motor2.setSpeed(255); //Define maximum velocity
  motor2.run(FORWARD);  //rotate the motor clockwise
  motor3.setSpeed(255); //Define maximum velocity
  motor3.run(BACKWARD); //rotate the motor anti-clockwise
  motor4.setSpeed(255); //Define maximum velocity
  motor4.run(BACKWARD); //rotate the motor anti-clockwise
}

void stop()
{
  motor1.setSpeed(0);  //Define minimum velocity
  motor1.run(RELEASE); //stop the motor when release the button
  motor2.setSpeed(0);  //Define minimum velocity
  motor2.run(RELEASE); //rotate the motor clockwise
  motor3.setSpeed(0);  //Define minimum velocity
  motor3.run(RELEASE); //stop the motor when release the button
  motor4.setSpeed(0);  //Define minimum velocity
  motor4.run(RELEASE); //stop the motor when release the button
}

Challenges and Observations

During initial testing, I noticed that one wheel was not spinning properly, particularly when moving forward or turning left. My first assumption was that the batteries were not supplying sufficient current, or that there was some imbalance caused by the L293D motor shield.

After upgrading to a better Lithium-Ion charger and charging the batteries up to approximately 3.8V per cell, the performance improved significantly. The Bluetooth module became more stable, and the motors responded better. Interestingly, after several test runs, the previously stalled wheel began functioning normally.

This experience reinforced how important stable power delivery is in motor-driven Arduino projects.

Below is a video demonstration of the Arduino Bluetooth car in action:

Planned Improvements

From this build, I identified several areas for enhancement:

1. Dedicated Power Supply for the Bluetooth Module

When battery voltage drops, the HC-05 module sometimes fails to power up. Adding a separate regulated supply for the Bluetooth module will improve reliability.

2. Battery Management System (BMS) Integration

For the RoboMaster project, I plan to integrate proper battery management. I’ve already obtained a 3S 10A 18650 BMS lithium battery protection board, which will provide overcharge, over-discharge, and current protection.

Future Lithium-Ion Charger Projects

Due to limited charging options, I plan to build additional DIY Lithium-Ion chargers using LM317 voltage regulators and custom battery holders.

I previously attempted to use the TP4056 charging module, but it failed—possibly due to soldering issues or loose wiring. Despite that setback, I’m determined to design a more reliable and robust charging solution for my 18650 battery packs.

Building this Arduino Bluetooth RC car has been both educational and motivating. It combined embedded programming, motor control, wireless communication, and power management into one practical project. More improvements and experiments are definitely coming in the RoboMaster series.

Post a Comment

Previous Post Next Post