If you've ever tried to control a robot using conventional Wi-Fi, you're probably familiar with the "latency agony": you press a button, and after a noticeable delay, the robot finally responds. Between router dependencies, TCP/IP overhead, and the hassle of managing IP addresses, the maker experience often loses its real-time responsiveness.
The ESP32 Robot with ESP-NOW (working title) project breaks this paradigm by leveraging ESP-NOW to create a direct, ultra-low-latency communication link between devices—no routers, no network configuration, and no smartphone required.
Instead of relying on apps or touchscreens, you can build fully custom physical controllers, tailored to your application. Whether it's a simple button-based remote, a joystick interface, or something entirely unique, this approach gives you full control over both the hardware and the user experience.
The result? A control system so responsive that the robot feels like a physical extension of your hands.
Let’s explore how this architecture transforms remote control into a high-performance experience.
Check out the robot in action in the video below. Choose the audio track according to your language preference.
Project OverviewThis project demonstrates a complete wireless robot control system using ESP32 and ESP-NOW. It includes:
- A robot unit with motor control and animated OLED eyes
- A wireless controller built with Franzininho WiFi LAB01
- A custom ESP-NOW protocol layer for reliable communication
- A fail-safe system and real-time telemetry
Unlike traditional Wi-Fi or Bluetooth solutions, ESP-NOW provides low latency, connectionless communication, making it ideal for robotics.
- Low-latency communication using ESP-NOW
- Real-time directional control with variable speed
- Animated robot eyes reacting to movement
- Telemetry feedback (RSSI + connection status)
- Fail-safe: stops robot if signal is lost
- Dual-core ESP32 usage with FreeRTOS task for animation
The system is divided into two main nodes:
Controller (Node 1) ---> Robot (Node 2)
| |
|---- Control -------->|
|<--- Telemetry -------|- Controller sends movement commands
- Robot executes and returns status (RSSI, link)
- ESP32
- L298N motor driver
- OLED display (SH1106)
- Custom animation system (RoboEyes)
- Differential drive (2 DC motors)
- PWM motor control (8-bit, 1 kHz)
- OLED animated eyes (SH1106)
- Fail-safe system (500 ms timeout)
- Telemetry every 1 second
Motor driver connections:
- IN1 → GPIO 33
- IN2 → GPIO 27
- IN3 → GPIO 32
- IN4 → GPIO 4
OLED (I2C):
- SDA → GPIO 22
- SCL → GPIO 21
Power:
- ESP32 powered via power bank (USB)
6-button interface:
- Direction (UP, DOWN, LEFT, RIGHT)
- Speed control (A/B)
- 6-button interface:Direction (UP, DOWN, LEFT, RIGHT)Speed control (A/B)
OLED display showing:
- Command
- Speed
- RSSI
- Link status
- OLED display showing:CommandSpeedRSSILink status
At the core of this project is the ESPNowProtocol library, a key component that significantly simplifies the development of reliable ESP-NOW applications.
Instead of dealing directly with low-level ESP-NOW APIs, this library provides a higher-level abstraction for:
- Device identification using Node IDs
- Reliable message delivery with automatic retransmission
- Structured packet handling (control and telemetry)
- Automatic peer discovery
- Clean callback-based communication
This allows you to focus on application logic, rather than communication details.
Why ESPNowProtocol MattersWorking directly with ESP-NOW can quickly become complex when you need:
Reliable delivery (ESP-NOW is not reliable by default)
- Reliable delivery (ESP-NOW is not reliable by default)
- Multiple message types
- Bidirectional communication
- Device management
The ESPNowProtocol library solves these problems by adding a lightweight protocol layer on top of ESP-NOW.
Example UsageSending a command becomes straightforward:
protocol.sendReliable(ROBOT_ID, MSG_CONTROL, (uint8_t*)&ctrl, sizeof(ctrl));And receiving data is handled via a clean callback:
protocol.onReceive(onData);Benefits in This ProjectUsing ESPNowProtocol enabled:
- Faster development (no need to reinvent protocol logic)
- Reliable communication between controller and robot
- Clean separation between communication and application layer
- Reusable architecture for future projects
This is especially important in robotics, where timing and reliability directly affect behavior.
Open Source & ReusabilityESPNowProtocol is an open-source project and can be reused in many applications:
- Remote controllers
- IoT device communication
- Sensor networks
- Multi-node systems
This robot is just one example of what can be built on top of it.
TakeawayIf you're planning to build anything with ESP-NOW, using a structured protocol like ESPNowProtocol can save you a lot of time—and help you build more robust systems from the start.
Dual-Core Design (ESP32)One of the strongest aspects of this project.
Core 0- Communication (ESP-NOW)
- Control loop
- Fail-safe
- Eye animation task (FreeRTOS)
xTaskCreatePinnedToCore(...);✔ Smooth UI✔ No interference with control
👀 Animated Eyes SystemThe robot includes expressive eyes using RoboEyes.
States- Boot → curiosity animation
- Idle → blinking + random movement
- Forward → focused look
- Fast → angry expression
- Backward → looking down
- Timeout → tired (connection lost)
This creates a human-like interaction layer—a simple but powerful UX improvement.
Robot sends status every second:
protocol.send(255, MSG_TELEMETRY, ...);Controller displays:
- RSSI
- Link status
- Latency: ~20 ms
- Range: ~100 m (line-of-sight)
- Stable connection with auto-recovery
- ️ Smooth animation (~100 FPS task)
- Battery monitoring
- PID motor control
- ESP-NOW encryption
- Mobile bridge (Wi-Fi/BLE gateway)
- Audio feedback (DAC + WAV)









Comments