The video of the car is here
https://www.youtube.com/embed/3yXaul0LStc?si=rC_zSwOfSqvJCXg9
PARTS YOU NEED
-
ESP32 dev board
-
PS3 Controller (Sixaxis/DualShock 3)
-
Motor driver (L298N)
-
2 DC motors (or RC car chassis with motors)
-
Battery pack for motors (6–12V depending on motors)
-
USB power or 5V regulator for ESP32
-
Jumper wires
-
Breadboard or direct soldering
-
Screwdriver (if using terminals)
STEP 1: MOUNT THE HARDWARE
Option A: Car chassis already built
-
Most RC chassis have space on top. Place the ESP32 and driver board on the top plate.
-
Use double-sided tape, Velcro, or screws.
Option B: Bare motors + wheels
-
Fix motors to a simple chassis (wood, acrylic, 3D print, etc.).
-
Add wheels to the motor shafts.
-
Add a small front caster wheel if needed.
STEP 2: POWER SETUP
ESP32:
-
Power via USB power bank
-
Or use 5V input pin (from LiPo + 5V regulator)
Motor Driver:
-
Use a separate battery pack (example: 7.4V LiPo or 6xAA)
-
Connect + to motor driver VIN / VM
-
Connect – to motor driver GND
IMPORTANT:
-
Connect ESP32 GND to motor driver GND
Common ground is mandatory
STEP 3: WIRE MOTORS TO DRIVER (L298N)
-
Motor A → OUT1 & OUT2
-
Motor B → OUT3 & OUT4
-
Remove 5V jumper if using external power above 7V
STEP 4: WIRE ESP32 TO DRIVER (CONTROL PINS)
Example GPIO mapping:
ESP32 GPIO |
L298N Pin |
GPIO 5 |
IN1 |
GPIO 18 |
IN2 |
GPIO 19 |
IN3 |
GPIO 21 |
IN4 |
5V |
5V logic |
GND |
GND |
If your driver has ENA/ENB pins:
-
Jumper them HIGH
-
Or connect to PWM pins on ESP32 for speed control
STEP 5: PAIR THE PS3 CONTROLLER
-
Get ESP32 Bluetooth MAC
-
Use Sixaxis Pair Tool and set that MAC to the controller
-
Upload code that prints this:
#include <Ps3Controller.h>
void setup()
{
Serial.begin(115200);
Ps3.begin();
String address = Ps3.getAddress();
Serial.print(“The ESP32’s Bluetooth MAC address is: “);
Serial.println(address);
}
void loop()
{
}
-
Press PS button to connect
STEP 6: UPLOAD THE CAR CODE
Copy this into Arduino IDE:
#include <Ps3Controller.h>
//Right motor
int enableRightMotor=22;
int rightMotorPin1=16;
int rightMotorPin2=17;
//Left motor
int enableLeftMotor=23;
int leftMotorPin1=18;
int leftMotorPin2=19;
const int PWMFreq = 1000; /* 1 KHz */
const int PWMResolution = 8;
const int rightMotorPWMSpeedChannel = 4;
const int leftMotorPWMSpeedChannel = 5;
void notify()
{
int yAxisValue =(Ps3.data.analog.stick.ly); //Left stick – y axis – forward/backward car movement
int xAxisValue =(Ps3.data.analog.stick.rx); //Right stick – x axis – left/right car movement
int throttle = map( yAxisValue, 127, -127, -255, 255);
int steering = map( xAxisValue, -127, 127, -255, 255);
int motorDirection = 1;
if (throttle < 0) //Move car backward
{
motorDirection = -1;
}
int rightMotorSpeed, leftMotorSpeed;
rightMotorSpeed = abs(throttle) – steering;
leftMotorSpeed = abs(throttle) + steering;
rightMotorSpeed = constrain(rightMotorSpeed, 0, 255);
leftMotorSpeed = constrain(leftMotorSpeed, 0, 255);
//Serial.println(rightMotorSpeed);
//Serial.println(leftMotorSpeed);
rotateMotor(rightMotorSpeed * motorDirection, leftMotorSpeed * motorDirection);
}
void onConnect()
{
Serial.println(“Connected!.”);
}
void onDisConnect()
{
rotateMotor(0, 0);
Serial.println(“Disconnected!.”);
}
void rotateMotor(int rightMotorSpeed, int leftMotorSpeed)
{
if (rightMotorSpeed < 0)
{
digitalWrite(rightMotorPin1,LOW);
digitalWrite(rightMotorPin2,HIGH);
}
else if (rightMotorSpeed > 0)
{
digitalWrite(rightMotorPin1,HIGH);
digitalWrite(rightMotorPin2,LOW);
}
else
{
digitalWrite(rightMotorPin1,LOW);
digitalWrite(rightMotorPin2,LOW);
}
if (leftMotorSpeed < 0)
{
digitalWrite(leftMotorPin1,LOW);
digitalWrite(leftMotorPin2,HIGH);
}
else if (leftMotorSpeed > 0)
{
digitalWrite(leftMotorPin1,HIGH);
digitalWrite(leftMotorPin2,LOW);
}
else
{
digitalWrite(leftMotorPin1,LOW);
digitalWrite(leftMotorPin2,LOW);
}
ledcWrite(rightMotorPWMSpeedChannel, abs(rightMotorSpeed));
ledcWrite(leftMotorPWMSpeedChannel, abs(leftMotorSpeed));
}
void setUpPinModes()
{
pinMode(enableRightMotor,OUTPUT);
pinMode(rightMotorPin1,OUTPUT);
pinMode(rightMotorPin2,OUTPUT);
pinMode(enableLeftMotor,OUTPUT);
pinMode(leftMotorPin1,OUTPUT);
pinMode(leftMotorPin2,OUTPUT);
//Set up PWM for motor speed
ledcSetup(rightMotorPWMSpeedChannel, PWMFreq, PWMResolution);
ledcSetup(leftMotorPWMSpeedChannel, PWMFreq, PWMResolution);
ledcAttachPin(enableRightMotor, rightMotorPWMSpeedChannel);
ledcAttachPin(enableLeftMotor, leftMotorPWMSpeedChannel);
rotateMotor(0, 0);
}
void setup()
{
setUpPinModes();
Serial.begin(115200);
Ps3.attach(notify);
Ps3.attachOnConnect(onConnect);
Ps3.attachOnDisconnect(onDisConnect);
Ps3.begin();
Serial.println(“Ready.”);
}
void loop()
{
}
ADD UPGRADES TO YOUR CAR
Don’t stop here you can add extra features like:
-
Camera (ESP32-CAM or FPV)
-
LEDs or indicators
-
Battery voltage display
-
WiFi or dashboard control