RC Car using L298N, HC-06, and Arduino Uno

With this article, we will create a remote control (RC) car with the use of HC-06 bluetooth module to make it wireless and L298N motor driver to control speed and direction of rotations of the motors.

Materials:
1. Arduino Uno as the main board
2. HC-06 bluetooth module to receive commands via bluetooth communication protocol.
3. L298N motor driver module
4. DC motors to move the RC car.

Video Demonstration:

Source Code:


#include "SoftwareSerial.h"

#define IN3Br 2
#define IN4Br 4
#define PWMBr 3

#define IN1Al 7
#define IN2Al 5
#define PWMAl 6

#define HC_06_Rx 12
#define HC_06_Tx 11

#define NORMAL_SPEED 60
#define TURNS_SPEED 10

SoftwareSerial swSerial(HC_06_Rx,HC_06_Tx);
String cmd="";
bool isAlEnabled = false;
bool isBrEnabled = false;
byte PWMAl_val = 100;
byte PWMBr_val = 100;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  swSerial.begin(9600);
  

  pinMode(IN3Br, OUTPUT);
  pinMode(IN4Br, OUTPUT);
  pinMode(PWMBr, OUTPUT);

  pinMode(IN1Al, OUTPUT);
  pinMode(IN2Al, OUTPUT);
  pinMode(PWMAl, OUTPUT);

  digitalWrite(IN3Br, LOW);
  digitalWrite(IN4Br, LOW);
  digitalWrite(PWMBr, LOW);

  digitalWrite(IN1Al, LOW);
  digitalWrite(IN2Al, LOW);
  digitalWrite(PWMAl, LOW);

  swSerial.println("Setup Complete");
}

void loop() {
  // put your main code here, to run repeatedly:
  checkSerial();
}


void checkSerial() {
 //Read data from Serial
 while(Serial.available()>0){
   cmd+=(char)Serial.read();
 }

 while(swSerial.available()>0){
   cmd+=(char)swSerial.read();
 }
 
 //Select function with cmd
 if(cmd!=""){
    cmd.trim();  // Remove added LF in transmit
    // We expect Command from bluetooth
    if (cmd.equals("S")) {
      swSerial.println("Braking");
      brakeVehicle();
    } else if(cmd.equals("R")) {
       swSerial.println("Right turn");
       turnVehicleRght();
    }else if (cmd.equals("L")){
       swSerial.println("Left turn");
       turnVehicleLeft();
    }else if(cmd.equals("F")){
       swSerial.println("Moving forward");   
       moveVehicleForward();
    }else if(cmd.equals("B")){
       swSerial.println("Moving backward");
       moveVehicleBackward();
    }
    cmd=""; //reset cmd
 }
 
 
}

void brakeVehicle () {
  digitalWrite(PWMBr, LOW);
  digitalWrite(PWMAl, LOW);
}

void turnVehicleRght() {
  analogWrite(PWMBr, TURNS_SPEED);
  analogWrite(PWMAl, NORMAL_SPEED);
}

void turnVehicleLeft() {
  analogWrite(PWMAl, TURNS_SPEED);
  analogWrite(PWMBr, NORMAL_SPEED);
}

void moveVehicleForward() {
  digitalWrite(IN3Br, HIGH);
  digitalWrite(IN4Br, LOW);
  analogWrite(PWMBr, NORMAL_SPEED);

  digitalWrite(IN1Al, HIGH);
  digitalWrite(IN2Al, LOW);
  analogWrite(PWMAl, NORMAL_SPEED);
}

void moveVehicleBackward() {
  digitalWrite(IN3Br, LOW);
  digitalWrite(IN4Br, HIGH);
  analogWrite(PWMBr, NORMAL_SPEED);

  digitalWrite(IN1Al, LOW);
  digitalWrite(IN2Al, HIGH);
  analogWrite(PWMAl, NORMAL_SPEED);
}

If you found this tutorial helpful, please consider supporting me by sharing this to your friends. You may leave your comments and suggestions in the comment box.

Thank you and have a good day.

Leave a Reply

Your email address will not be published. Required fields are marked *