CI

How to Make Remote Control Car

Description

This project is a complete step-by-step guide to building your own remote control car using an Arduino UNO, an L298N motor driver, and a FlySky FS-CT6B transmitter with FS-R6B receiver. Unlike Bluetooth-controlled builds, this car is controlled using RC radio signals, giving smoother and more responsive control similar to hobby RC vehicles.

The Arduino reads PWM signals from the FlySky receiver's channels and converts them into motor movement — controlling forward, backward, left, and right turns through the L298N driver. This project is a great way to learn about RC receiver signal processing, PWM decoding using pulseIn(), and real-time motor control logic.

Components Required

ComponentQuantity
Arduino UNO1
L298N Motor Driver1
BO Motors4
BO Motor Tyres4
12V Battery1
FlySky FS-CT6B Transmitter1
FlySky FS-R6B Receiver1
Cardboard (Chassis)1
Switch1
WiresAs required
Jumper WiresAs required

Pin Connection Table

L298N Motor Driver → Arduino UNO

L298N PinArduino Pin
IN1D8
IN2D9
IN3D10
IN4D11
5VVIN
GNDGND

Battery → L298N Motor Driver

BatteryL298N Terminal
Positive (+)12V Input
Negative (−)GND

FlySky FS-R6B Receiver → Arduino UNO

Receiver PinArduino Pin
5V5V
GNDGND
Channel 1 (CH1)A0
Channel 2 (CH2)A1
Channel 3 (CH3)A2
Channel 4 (CH4)A3
Channel 5 (CH5)A4
Channel 6 (CH6)A5

Motor Output Connections

The two left-side BO motors are connected in parallel to the left output terminal (OUT1/OUT2) of the L298N, and the two right-side BO motors are connected in parallel to the right output terminal (OUT3/OUT4). Connecting each side's motors in parallel allows both wheels on that side to move together in sync.

Arduino Code

// Creative Inventions
// Subscribe to my Youtube channel

int in1 = 8;
int in2 = 9;
int in3 = 10;
int in4 = 11;

int receiver_pins[] = {A0,A1,A2,A3,A4,A5}; 
int receiver_values[] = {0, 0, 0, 0};

int res_min = 1100;
int res_max = 1900;

boolean prt = true;
int mode = 0;

void setup() {
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);

  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);

  Serial.begin(115200);

  // Startup LED indication
  setLED(1); delay(300);
  setLED(2); delay(300);
  setLED(3); delay(300);
  setLED(0);
}

void loop() {
  receive();
  setModeLED();

  int rot = receiver_values[0];   // CH1 (Left/Right)
  int speed = receiver_values[1]; // CH2 (Forward/Backward)

  int m1 = 0;
  int m2 = 0;

  // -------- MOVEMENT LOGIC --------

  // Forward / Backward
  if (speed > 100) {
    m1 = 1;
    m2 = 1;
  }
  else if (speed < -100) {
    m1 = -1;
    m2 = -1;
  }

  // Turning (overrides forward/back)
  if (rot > 100) {        // Right
    m1 = 1;
    m2 = -1;
  }
  else if (rot < -100) {  // Left
    m1 = -1;
    m2 = 1;
  }

  mpower(1, m1);
  mpower(2, m2);
}

// ---------------- RECEIVE ----------------
int rp = 0;
void receive() {

  receiver_values[rp] = map(pulseIn(receiver_pins[rp], HIGH),
                           res_min, res_max, -255, 255);
  rp++;
  if (rp == 4) rp = 0;

  boolean activevalues = true;

  for (int i = 0; i < 4; i++) {
    if (prt) {
      Serial.print("CH"); Serial.print(i);
      Serial.print(": "); Serial.print(receiver_values[i]);
      Serial.print("  ");
    }
    if (receiver_values[i] < -500) {
      activevalues = false;
    }
  }

  mode = 0;

  if (!activevalues) {
    mode = -1;
  } else if (receiver_values[2] > -100) {
    mode = 2;
  } else if (receiver_values[3] > -100) {
    mode = 1;
  }

  if (prt) Serial.println();
}

// ---------------- LED ----------------
void setModeLED() {
  if (mode == -1) setLED(0);
  else if (mode == 0) setLED(1);
  else if (mode == 1) setLED(2);
  else if (mode == 2) setLED(3);
}

void setLED(int led) {
  for (int i = 1; i < 4; i++) {
    if (led == i) digitalWrite(10 + i, LOW);
    else digitalWrite(10 + i, HIGH);
  }
}

// ---------------- MOTOR CONTROL ----------------
void mpower(int motor, int dir) {

  int pA, pB;

  if (motor == 1) {
    pA = in1;
    pB = in2;
  } else {
    pA = in3;
    pB = in4;
  }

  if (dir == 1) {          // Forward
    digitalWrite(pA, HIGH);
    digitalWrite(pB, LOW);
  }
  else if (dir == -1) {    // Reverse
    digitalWrite(pA, LOW);
    digitalWrite(pB, HIGH);
  }
  else {                   // Stop
    digitalWrite(pA, LOW);
    digitalWrite(pB, LOW);
  }
}