Notes from the bench
This site documents the engineering behind a small ESP32-P4 combat robot and the side projects around it: firmware on ESP-IDF, motor drivers, IMUs, low-latency networking, batteries, and PCB design. Every article comes from a real bug or a real decision, with the measurements that settled it.
ESP32-P4 robot · November 5, 2026
Drive the robot. Get the app.
Web controller
Sign in with your robot account for video, dual-stick control, intercom and infrared remotes.
Open web controller ↗https://robot.daojianmeng.top:8444/
Android app
Speak to Xiaozhi through your phone and hear replies on both the phone and robot.
Download Android APK · 20.8 MBThe controller needs IPv6 connectivity and the robot backend to be running. Use the complete https:// address, including :8444. The app download is hosted here and does not require a robot login.
Latest articles
ESP32 Robot: Phone Voice and Dual-Speaker Replies
Android 1.4.19 adds phone speech input and Xiaozhi replies on both the phone and robot.
ESP32 Robot Update: Web Control, Account Permissions, and Reliable OTA
Firmware 2.4.11 and Android 1.4.5: a browser and iPhone controller, signed permissions, a second OTA reset fix, infrared air-conditioning control, and clearer diagnostics.
DRV8833 vs MX1508 for N20 Motors on a 2S Pack: Why the Cheap One Stays on the Shelf
Two common dual H-bridge drivers compared for a small 7.4 V robot. The DRV8833 has real protection and rarely dies; the MX1508 sits too close to its voltage ceiling to trust with regenerative braking.
ESP-IDF on Windows: Five Build Failures That Are Not Your Code
Non-ASCII paths, file(GLOB) not seeing new sources, the wrong Python, Git Bash vs PowerShell, and a build directory that cannot be moved. Each one wasted an afternoon; here is the two-line diagnosis for each.
Choosing a Battery for a Small ESP32 Robot: Why Boost Converters, 18650s and Series 1S Packs All Lost
Four N20 motors can stall at over 3 A combined, and a consumer LiPo cell with a 2 A protection board cannot deliver it. The budget, the four rejected options, and the 2S high-discharge pack that won.
Your "MPU6050" Module Is Probably an MPU6500: WHO_AM_I, AD0, and a Self-Healing I²C Driver
A cheap IMU board labelled MPU6050 returned WHO_AM_I = 0x70, and a floating AD0 pin made it disappear from the bus entirely. How to write a driver that copes with both, plus the streaming design that gets 44 Hz attitude over UDP.
Mecanum Wheel Control on ESP32: Keep All Motion Logic in the Firmware
The app sends intent (strafe, drive, rotate); the ESP32 does the wheel mixing, gear limits, dead-band compensation and fail-safe. Why that split is right, and the numbers behind it.
Why I Replaced MQTT with Direct IPv6 UDP for Robot Joystick Control
Cloud MQTT relay jitter kept tripping a 300 ms link-loss watchdog and made the motors stutter. A direct UDP channel over IPv6, discovered via the MQTT heartbeat, fixed it. Design notes and packet format.