{{ page.title }}
RC-Robot_NovaGlide
A modular robot control system for ESP32-C3 with wireless control (ESP-NOW), telemetry (MQTT), and comprehensive sensor integration.
šļø Project Structure
ESP-IDF_NovaGlide/
āāā main/
ā āāā ESP-IDF_NovaGlide.c ā
Main application entry point
ā āāā system_init.c/h # System initialization (NVS)
ā āāā scheduler.c/h ā
Unified subsystem update loop based on FreeRTOS scheduler
ā āāā control_task.c/h ā
RC Robot control task (joystick ā motors)
ā
āāā subsystems/
āāā motors/ # Motor PWM control
ā āāā motors.c/h
ā āāā CMakeLists.txt
ā
āāā adc/ # Joystick ADC reading
ā āāā adc.c/h
ā āāā CMakeLists.txt
ā
āāā sensors/ # All sensor drivers
ā āāā temp_sensor.c/h # ESP32-C3 internal temperature
ā āāā ina219_sensor.c/h # Battery voltage/current monitor
ā āāā ultrasonic_sensor.c/h # Distance sensor
ā āāā CMakeLists.txt
ā
āāā connectivity/ # Wireless communication
ā āāā wifi_sys/ # WiFi initialization
ā āāā espnow_sys/ ā
ESP-NOW wireless control
ā āāā mqtt_sys/ # MQTT telemetry
ā
āāā controls/ # Control algorithms
ā āāā joystick.c/h # Joystick mixing algorithm
ā āāā CMakeLists.txt
ā
āāā ui/ # User interface (LED, buttons)
āāā ui.c/h
āāā CMakeLists.txt
RC-Robot š Key Components
Motors Subsystem
Location: subsystems/motors/
Purpose: Controls 4 DC motors using PWM (left/right, forward/reverse, spin left/right)
Key Functions:
motor_system_init()- Initialize LEDC timers and channelsmotor_set_pwm(left, right)- Set signed PWM values (-8191 to +8190)motor_update()- Apply PWM to hardware (called by scheduler)
GPIO Pins:
- Motor 1 (Left-side Forward): GPIO 6
- Motor 2 (Right-side Forward): GPIO 5
- Motor 3 (Left-side Reverse): GPIO 4
- Motor 4 (Right-side Reverse): GPIO 7
ESP-NOW Subsystem
Location: subsystems/connectivity/espnow_sys/
Purpose: Receives wireless joystick data from remote control
Key Functions:
espnow_system_init()- Initialize ESP-NOW-
espnow_recv_cb()- Callback when data received - Data structure:
sensors_data_tstruct with x_axis, y_axis values
MQTT Subsystem
Location: subsystems/connectivity/mqtt_sys/
Purpose: Publishes robot telemetry to MQTT broker
MQTT Topics:
/bitrider/temp- Internal temperature (°C)/bitrider/battery_voltage- Battery voltage (V)/bitrider/sys_current- System current (mA)/bitrider/sys_power- System power (mW)/bitrider/pwm_left- Left motor PWM value/bitrider/pwm_right- Right motor PWM value
Configuration:
- Broker:
mqtt://techquadbit.net - WiFi SSID:
IoT_bots - Password:
208208208
Joystick Control
Location: subsystems/controls/joystick.c
Purpose: Converts joystick X/Y values to differential motor PWM
Algorithm:
joystick_mix(x_raw, y_raw, &pwm_left, &pwm_right)
- Normalizes joystick input to [-1, +1]
- Applies differential steering (k = 0.4)
- Outputs signed PWM values for each motor side
Sensors
Temperature Sensor
- Type: ESP32-C3 internal sensor
- Update Rate: Every 5 seconds
- Range: 10°C to 50°C
INA219 Power Monitor
- Interface: I2C (GPIO 3: SDA, GPIO 2: SCL)
- Measures: Battery voltage, current, power
- Update Rate: Every 2.5 seconds
- Shunt Resistor: 100mΩ
Ultrasonic Distance Sensor
- GPIO Pins: Trigger: GPIO 4, Echo: GPIO 5
- Update Rate: Every 1 second
- Max Range: 400 cm
UI Subsystem
Location: subsystems/ui/
Features:
- LED blinking (GPIO 10) - 500ms interval
- Button interrupt handling (GPIO 8)
š System Architecture
Initialization Flow
- System Init - NVS flash initialization
- WiFi Init - Connect to WiFi network
- Subsystem Init - Initialize all components
- Task Creation - Start control and telemetry tasks
- Scheduler Start - Begin main update loop
Main Tasks
Scheduler Task (50ms / 20Hz)
- Updates all subsystems periodically
- Calls
update()function for each component - Priority: 10
Control Task (100ms / 10Hz)
- Reads joystick data from ESP-NOW
- Applies mixing algorithm
- Updates motor PWM values
- Priority: 15
Telemetry Task (1000ms / 1Hz)
- Collects sensor data
- Publishes to MQTT broker
- Priority: 5
š Data Flow
Remote Control (ESP-NOW)
ā
ESP-NOW Subsystem ā sensors_data_t (x, y)
ā
Control Task ā joystick_mix()
ā
Motor Subsystem ā PWM
ā
Motors (Physical Hardware)
Sensors ā Scheduler (periodic updates)
ā
Telemetry Task
ā
MQTT Broker ā Monitoring Dashboard
š§ Configuration
Motor PWM Configuration
- Frequency: 7000 Hz
- Resolution: 13-bit (0-8191)
- Range: -8191 (full reverse) to +8190 (full forward)
WiFi Configuration
Edit subsystems/connectivity/wifi_sys/wifi_sys.h:
#define WIFI_SSID "your_ssid"
#define WIFI_PASSWORD "your_password"
MQTT Configuration
Edit subsystems/connectivity/mqtt_sys/mqtt_sys.h:
#define MQTT_BROKER_URI "mqtt://your_broker_ip"
š Debugging
Enable Component Logging
Each subsystem has a TAG for logging:
ESP_LOGI(TAG, "Message"); // Info
ESP_LOGW(TAG, "Warning"); // Warning
ESP_LOGE(TAG, "Error"); // Error
Monitor Motor PWM Values
Motors log PWM values every second:
I (1234) MOTORS: PWM L/R: 4000/3500 | M1:4000 M2:3500 M3:0 M4:0
Check Sensor Readings
I (5678) TEMP_SENSOR: Temperature: 32.50°C
I (9012) INA219: VBUS: 7.40V, I: 850.00mA, P: 6290.00mW
I (3456) ULTRASONIC: Distance: 45.23 cm
š Adding New Subsystems
- Create directory:
subsystems/your_subsystem/ - Add source files:
your_subsystem.c/h - Create
CMakeLists.txt:idf_component_register( SRCS "your_subsystem.c" INCLUDE_DIRS "." REQUIRES freertos) - Add to root
CMakeLists.txt:set(EXTRA_COMPONENT_DIRS ... "subsystems/your_subsystem") - Include in
main/scheduler.hand wire to scheduler
š Dependencies
ESP-IDF Components
- freertos
- esp_wifi
- esp_netif
- nvs_flash
- mqtt
- esp_driver_ledc
- esp_driver_gpio
- esp_adc
External Libraries (Managed Components)
esp-idf-lib/i2cdev- I2C device libraryesp-idf-lib/ina219- INA219 power monitoresp-idf-lib/ultrasonic- HC-SR04 ultrasonic sensor
š„ Authors
Alexander Bobkov