The idea was simple: build an RC car where I designed every part — chassis geometry, remote body, firmware. I started in Fusion 360, modelling the chassis geometry before I had even ordered the wheels. The chassis came out properly: four rubber tyres, a servo-steered Ackermann front axle, and a rear-wheel drive layout.
The remote was the part I was most proud of. Instead of using an off-the-shelf transmitter, I modelled a gamepad from scratch, 3D-printed the shell in two halves, fitted two analog joystick modules inside, and ran everything through an ESP32 WROOM using ESP-NOW. The latency was good. The control feel was actually decent.
What went wrong: I kept adding things. A 5A boost converter, an oversized 3500mAh LiPo, and a printed housing for every component. The real weight came from the motor itself, the MG996R metal-gear servo, the boost converter, and the stack of PLA casings I built around everything — not the electronics. The ESP32, buck converter, and DRV8876 barely register on a scale. At 565 g assembled, the motor had no performance headroom left. The lesson stuck — directly led to the small RC car, which came in at 101 g.
Build
Custom Remote
- Modelled in Fusion 360, printed on Creality
- Dual KY-023 analog joystick modules
- ESP32 WROOM transmitter
- ESP-NOW protocol — no pairing, peer-to-peer MAC
- 3.7V 18650 3000mAh 20C Li-ion cell, fits inside grip section
- Screw-on/off 3D-printed joystick thumb-cap covers
Written in Arduino C++ using the ESP-NOW API. The receiver maps joystick axes to 20 kHz 10-bit PWM on the DRV8876 (IN1/IN2 mode) and servo angle constrained to 60–115° for the Ackermann geometry. The sender reads GPIO34/35 with a 7-sample median filter and auto-calibrates joystick centres on power-up. Holding the BOOT button for 2 s triggers manual recalibration without a restart.

