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
Component
Quantity
Arduino UNO
1
L298N Motor Driver
1
BO Motors
4
BO Motor Tyres
4
12V Battery
1
FlySky FS-CT6B Transmitter
1
FlySky FS-R6B Receiver
1
Cardboard (Chassis)
1
Switch
1
Wires
As required
Jumper Wires
As required
Pin Connection Table
L298N Motor Driver → Arduino UNO
L298N Pin
Arduino Pin
IN1
D8
IN2
D9
IN3
D10
IN4
D11
5V
VIN
GND
GND
Battery → L298N Motor Driver
Battery
L298N Terminal
Positive (+)
12V Input
Negative (−)
GND
FlySky FS-R6B Receiver → Arduino UNO
Receiver Pin
Arduino Pin
5V
5V
GND
GND
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);
}
}