Building an IoT RC Car with ESP-NOW: A MicroPython Adventure

Prerequisites: This is part of our IoT Firmware series. If you’re new to ESP32 development, make sure to check out our first blog post in the series where we cover the basics of ESP32 programming and MicroPython setup. Basic electronics knowledge will be helpful for this project, especially when working with motor drivers and power management.

⚡ Check out the project repository for the complete source code, detailed setup instructions, and to contribute to the project! Feel free to star the repo if you find it helpful. 🌟

Ever wanted to build a high-performance IoT RC car that combines the power of ESP-NOW protocol with MicroPython’s ease of use? In this project, we’ll explore how to create a sophisticated RC car that demonstrates the capabilities of modern microcontroller-based systems. This isn’t your average RC car - it’s a powerful IoT platform that can be extended for various applications.

Why ESP-NOW?

ESP-NOW is a powerful wireless communication protocol developed by Espressif Systems. It offers several advantages for RC car applications:

  • Low Latency: Perfect for real-time control applications
  • Long Range: Up to 200 meters in open space
  • Simple Implementation: No need for complex network setup
  • Low Power Consumption: Ideal for battery-powered projects
  • Peer-to-Peer Communication: Direct device-to-device communication without a router

Hardware Components

Here’s what you’ll need to build this project:

ComponentQuantityPurposeNotes
ESP32/ESP82661Main microcontrollerAny ESP32 variant works
DRV8833 Motor Driver2Motor controlDual H-bridge driver
720 Coreless Motors4MovementHigh-speed motors
Custom ESP-Now-RC Controller1Wireless controlCompatible controller
Power Supply1Battery powerMicro-Lipo (min. 2A discharge)
Breadboard/PCB1Circuit assemblyFor prototyping

Pin Configuration

This Pin layout was used because i used a ESP32-S3 mini

Here’s the detailed pin mapping for connecting all components:

Motor Driver 1 (DRV8833)

PinGPIOFunctionConfiguration
IN1GPIO 10Motor 1 DirectionPWM output
IN2GPIO 11Motor 1 DirectionPWM output
IN3GPIO 12Motor 2 DirectionPWM output
IN4GPIO 13Motor 2 DirectionPWM output

Motor Driver 2 (DRV8833)

PinGPIOFunctionConfiguration
IN1GPIO 2Motor 3 DirectionPWM output
IN2GPIO 3Motor 3 DirectionPWM output
IN3GPIO 5Motor 4 DirectionPWM output
IN4GPIO 6Motor 4 DirectionPWM output

Software Architecture

The car uses a robust architecture for reliable control:

  1. Initialization

    • ESP-NOW setup
    • PWM configuration
    • Motor driver initialization
    • Safety checks
  2. Main Loop

    • Command reception
    • Motor control processing
    • Safety monitoring
    • Status updates

Data Communication

The car receives data in a structured format:

{
    "speed": value,     // -30000 to +30000
    "direction": value, // -30000 to +30000
    "mode": value,      // 0: normal, 1: sport
    "safety": value     // 0: normal, 1: emergency stop
}

Motor Control System

The system uses 16-bit PWM for precise motor control:

# Motor control configuration
PWM_FREQUENCY = 1000  # Hz
SPEED_RANGE = (-30000, 30000)  # 16-bit resolution
MOTOR_PAIRS = [
    (10, 11),  # Motor 1
    (12, 13),  # Motor 2
    (2, 3),    # Motor 3
    (5, 6)     # Motor 4
]

Common Challenges and Solutions

1. Motor Control Issues

If you’re experiencing motor control problems:

  • Verify PWM frequency settings
  • Check motor driver connections
  • Ensure proper power supply
  • Monitor motor temperature

2. Power Management

To ensure stable operation:

  • Use appropriate battery capacity (min. 2A discharge)
  • Add power filtering capacitors
  • Monitor battery voltage
  • Implement low voltage protection

3. Wireless Communication

For reliable control:

  • Verify ESP-NOW pairing
  • Check signal strength
  • Implement failsafe mechanisms
  • Monitor packet loss

Getting Started

  1. Hardware Setup

    • Connect motor drivers according to pin configuration
    • Ensure proper power supply
    • Add decoupling capacitors
    • Test motor connections
  2. Software Setup

    • Flash MicroPython to ESP32
    • Upload the car firmware
    • Configure controller MAC address
    • Test basic movement
  3. Testing

    • Power on the car
    • Test each motor
    • Verify wireless control
    • Check safety features
    • Monitor serial output for debugging

Performance Optimization

For optimal performance:

  • Use high-friction tires
  • Balance the chassis
  • Optimize power distribution
  • Implement proper cooling
  • Regular maintenance

Motor Fine-Tuning and Optimization

Proper motor setup is crucial for optimal performance. Here’s how to fine-tune your motors:

1. Motor Power Calibration

  • Start with 50% power and gradually increase
  • Test each motor individually
  • Find the minimum power needed for movement
  • Set maximum power to 80-90% to prevent overheating
  • Use the following code to test motor power:
def test_motor_power(motor_pin1, motor_pin2, power):
    pwm1 = machine.PWM(machine.Pin(motor_pin1))
    pwm2 = machine.PWM(machine.Pin(motor_pin2))
    pwm1.duty_u16(power)
    pwm2.duty_u16(0)

2. Gear Optimization

  • Use 1:3 or 1:4 gear ratio for 720 coreless motors
  • Ensure proper gear meshing
  • Apply light lubricant to reduce friction
  • Check for gear alignment
  • Secure gear mounting

3. Motor Polarity and Testing

  • Test each motor’s direction before final assembly
  • Mark positive and negative terminals
  • Verify wheel spin direction
  • Check for smooth rotation
  • Test under load conditions

4. Wheel Spin Testing

  • Ensure wheels rotate freely
  • Check for wobbling
  • Verify wheel alignment
  • Test grip on different surfaces
  • Balance wheel weight distribution

Future Enhancements

The project can be extended in several ways:

  • Add telemetry data transmission
  • Implement battery monitoring
  • Create a custom chassis
  • Add sensors for autonomous features
  • Implement OTA updates
  • Add power saving modes
  • Support for multiple control modes

Conclusion

This IoT RC car project demonstrates the power and flexibility of ESP32 microcontrollers in robotics applications. Whether you’re building a simple RC car or a more complex robotic platform, this project provides a solid foundation for wireless control systems.

The combination of ESP-NOW protocol, MicroPython, and the DRV8833 motor drivers makes this project both powerful and accessible to makers of all skill levels.

Check Out the Project

Want to build this project yourself? Head over to our GitHub repository where you’ll find:

  • Complete source code
  • Detailed wiring diagrams
  • Troubleshooting guide
  • Example controller code
  • Community support

Happy building! 🚀