yahboom
HomeLearn
Solution
Blog
Online Store
About Us
EN/中文
MicroROS V2 Robot Car📖
01.Introduction
  • 0.Unboxing Video
  • 1. Readme Learning Route
  • 2. Must Read Before Use
  • 3. Introduction to MicroROS V2 Control Board
  • 4. Introduction to LiDAR
  • 5. Introduction to ESP32 Camera Module
  • 6. FAQ
  • 7. About Charging
02.Assembly course
  • Assembly Video
03.Preparation
  • 1. Quickly Start
  • 2. Write Firmware
  • 3. Install VM and Start System
  • 4. Configure VM and Connect Robot
  • 5. Connect to MicroROS Agent
04.Quick start control course
  • 1. VM Keyboard Remote Control
  • 2. VM Handle Remote Control
  • 3. USB Handle Control
05.Robot control course
  • 1. Robot Information Release
  • 2. Robot Keyboard Control
  • 3. Robot Handle Control
  • 4. Robot State Estimation
  • 5. Linear Speed Calibration
  • 6. Angular Velocity Calibration
  • 7. Robot URDF Model
06.Lidar course
  • 1. Precautions for LiDAR Mapping and Navigation
  • 2. Lidar Avoid
  • 3. Lidar Following
  • 4. Lidar Guard
  • 5. Lidar Patrol
  • 6. Gmapping Mapping
  • 7. Cartographer Mapping
  • 8. Cartographer Quickly Repositioning Navigation
  • 9. Slam Toolx Mapping
  • 10. Navigation2 Single Point Navigation
  • 11. Navigation2 Multi Point Navigation
  • 12. Ros Robot App Mapping And Navigation
07.Road network planning
  • 1. Introduction to Road Network Planning and Quick Start
  • 2. Build a Pose Map
  • 3. Road Network Annotation
  • 4. Planning and Navigation Between Road Networks
  • 5. Road Network Navigation in Any Pose
  • 6. Path Replanning
08.Vision basic course
OpenCV Image Processing
  • 1. Introduction to OpenCV Source CV
  • 2. Open Source CV Geometric Transformation
  • 3. Open Source CV Image Processing and Drawing Text Line Segments
  • 4. Open Source CV Image Beautification
09.Visual General Course (For Standard&Superior version)
4. Yolov11&26 Visual Recognition
  • 1. YOLO Environment Setup
  • 2. CLI Usage
  • 3. Object Detection
  • 4. Instance Segmentation
  • 5. Pose Estimation
  • 6. Image Classification
  • 7. Oriented Bounding Boxes Object Detection
  • 8. Model Prediction
1. ESP32 Visual Recognition Module Configuration
  • 1. Serial Port Configuration WiFi Instructions
  • 2. Use ESP32 Camera Module in Robot Car
  • 3. Servo PTZ Calibration
2. OpenCV Visual Recognition
  • 1. Human Pose Estimation
  • 2. Object Detection
  • 3. AR Vision
  • 4. QR Code
  • 5. Color Recognition
  • 6. Facial Recognition
  • 7. AprilTag Machine Code Recognition
3. Mediapipe Visual Recognition
  • 1. Hand Detection
  • 2. Pose Detection
  • 3. Holistic Detection
  • 4. Facial Detection
  • 5. Facial Recognition
  • 6. Facial Special Effects
  • 7. 3D Object Recognition
  • 8. Brush
  • 9. Gesture Recognition
  • 10. Palm Target Localization
  • 11. Fingertip Trajectory Recognition
10.Visual Advanced Course (Just for Standard version)
1. Visual Control
  • 1. QR Code Recognition Control Action
  • 2. AprilTag Control Car Action Group
  • 3. Gesture Control Car Action Group
  • 4. Visual Line Tracking
2. Visual Tracking
  • 1. Color Tracking
  • 2. Facial Tracking
  • 3. QR Code Tracking
  • 4. Object Recognition And Tracking
  • 5. Mediapipe Palm Tracking
  • 6. Mediapipe Gesture Tracking
  • 7. Mediapipe Human Pose Tracking
  • 8. KCF Object Tracking
  • 9. AprilTag Machine Code Tracking
3. Visual Following
  • 1. Color Follow
  • 2. Face Follow
  • 3. QR Code Follow
  • 4. Mediapipe Palm Follow
  • 5. Mediapipe Gesture Follow
  • 6. Mediapipe Human Posture Follow
  • 7. AprilTag Machine Code Follow
  • 8. Object Follow
11.Visual Advanced Course (Just for Superior version)
1. Visual Control
  • 1. QR Code Recognition Control Action
  • 2. AprilTag Control Car Action Group
  • 3. Gesture Control Car Action Group
  • 4. Visual Line Tracking
2. Visual Tracking
  • 1. Color Tracking
  • 2. Facial Tracking
  • 3. QR Code Tracking
  • 4. YOLO Object Recognition and Tracking
  • 5. Mediapipe Palm Tracking
  • 6. Mediapipe Gesture Tracking
  • 7. Mediapipe Human Pose Tracking
  • 8. KCF Object Tracking
  • 9. AprilTag Machine Code Tracking
3. Visual Follow
  • 1. Color Follow
  • 2. Face Follow
  • 3. QR Code Follow
  • 4. Mediapipe Palm Follow
  • 5. Mediapipe Gesture Follow
  • 6. Mediapipe Human Pose Follow
  • 7. AprilTag Machine Code Follow
  • 8. Object Follow
12.AI Large Model Basic and Applications Course
1. AI Large Model Preparation
  • 1.AI Large Model Preparation
2. AI Large Model Basic Course
  • 1. AI Large Model Types and Principles
  • 2. RAG Retrieval Augmented and Training Samples
  • 3. Embodied Intelligent System Architecture
  • 4. Embodied Intelligence Core Source Code
3. AI Large Model Development
  • 1. Register Model Service Account
  • 2. Configure API KEY
  • 3. Dify Introduction
  • 4. Dify Basic Features
  • 5. RAG Knowledge Base Deployment
  • 6. AI Application Development Chatbot
  • 7. RAG Knowledge Base and Chatbot
  • 8. AI Agent Workflow
4. AI Large Model (Text Version)
  • 1. Semantic Understanding and Instruction Following
  • 2. Multimodal Visual Understanding
  • 3. Multimodal Visual Understanding + Basic Control
  • 4. Multimodal Visual Understanding + Object Following
  • 5. Multimodal Visual Understanding + Visual Line Following
  • 6. Multimodal Visual Understanding + SLAM Navigation
  • 7. Multimodal Visual Understanding + SLAM Navigation + Visual Line Following
  • 8. Multimodal Visual Understanding + SLAM Navigation + Object Following
  • 9. Intent Inference + Multimodal Visual Understanding + SLAM Navigation
13.Openclaw Basics Course
  • 1. Openclaw Introduction
  • 2. Openclaw Core Concepts
  • 3. Openclaw Api-Key Configuration
  • 4. Openclaw Switching Models
  • 5. Openclaw System Prompt
  • 6. Openclaw Common CLI Command
14. Openclaw Interaction Course
  • 1. Openclaw Webchat Interaction
  • 2. Openclaw Tui Interaction
  • 3. Openclaw Whatsapp Interaction
15.Openclaw Development Course
  • 1. Openclaw Robot Mcp Service Integration
  • 2. Robot CLI Command Tools
  • 3. Robot-Control Plugin Tools
  • 4. Openclaw Skills Development
  • 5. Openclaw Scheduled Tasks
  • 6. Openclaw Multi Agent System
  • 7. Openclaw Proactive Interaction
  • 8. Openclaw Vector Memory
16.Openclaw Embodied Intelligence Course
  • 1. OpenClaw Natural Interaction + Basic Control
  • 2. OpenClaw Natural Interaction + Slam Navigation
  • 3. OpenClaw Natural Interaction + Multimodal Visual Understand
  • 4. OpenClaw Natural Interaction + Multimodal Visual Understand + Slam Navigation + Visual Follow
  • 5. OpenClaw Natural Interaction + Multimodal Visual Understand + Slam Navigation + Visual Track
17.Multi-machine Course
  • 1. Multi Machine Handle Control
  • 2. Multi Machine Keyboard Control
  • 3. Multi Machine Navigation
18.MicroROS-V2 Control Board Development Environment
  • 1. Set Up the ESP32-IDF Development Environment
  • 2. ESP32-IDF Configuration Tool
  • 3. ESP Flash Tool Flashing Firmware
  • 4. Install ESP32 Microros Components
  • 5. Install And Start Microros Agent
19.MicroROS-V2 Control Board ESP32 Basic Course
  • 1. Led Light Up
  • 2. Button Function
  • 3. Drive Buzzer
  • 4. Oled
  • 5. Usb Host Function
  • 6. Serial Communication
  • 7. Battery Voltage Detection
  • 8. Drive Pwm Servo
  • 9. Drive Motors
  • 10. Read Motor Encoder Data
  • 11. Pid Motor Speed Control
  • 12. Robot Kinematics Analysis Theory
  • 13. Read Imu Data
  • 14. Read Lidar Data
  • 15. Flash Data Storage
  • 16. Custom Partition Table
  • 17. Bluetooth Communication
  • 18. Wifi Connection
  • 19. ESP32 Visual Recognition Module
20.MicroROS-V2 Control Board Micro_ros Basic Course
  • 1. Publish Topics
  • 2. Subscribe To Topics
  • 3. Multi Topic Subscription And Publishing
  • 4. Subscribe To Buzzer Topic
  • 5. Subscribe To Pwm Servo Topic
  • 6. Subscribe To Speed Control Topic
  • 7. Publish Odometry Topic
  • 8. Publish Imu Data Topic
  • 9. Publish Lidar Data Topic
21. Linux System Course
  • 1.Introduction to Linux system
  • 2.Ubuntu file system
  • 3.Ubuntu common commands
  • 4.Ubuntu common editors
  • 5.Ubuntu software operation commands
  • 6.Virtual machine installation
  • 7.SSH remote control
  • 8.VNC remote control
  • 9.Transfer files remotely
  • 10.Driver library and communication
  • 11.Static IP and hotspot mode
  • 12.Bind device ID
  • 13.Capacity expansion and resource allocation
  • 14.Update system software sources
  • 15.Set root user password
  • 16.sudo free password
  • 17.Connect to WiFi network
  • 18.View system version
  • 19.Customized service management
  • 20.Back up system image
22.Docker Course
  • 1.Docker overview and docker installation
  • 2.Common commands for docker image containers
  • 3.Docker images deeply understand and publish images
23.ROS Basic Course
  • 1.Introduction to ROS2
  • 2.ROS2 install Humble
  • 3.ROS2 development environment
  • 4.ROS2 workspace
  • 5.ROS2 function package
  • 6.ROS2 node
  • 7.ROS2 topic communication
  • 8.ROS2 service communication
  • 9.ROS2 action communication
  • 10.ROS2 custom interface message
  • 11.ROS2 parameter service case
  • 12.ROS2 meta-function package
  • 13.ROS2 distributed communication
  • 14.ROS2 DDS
  • 15.ROS2 time related API
  • 16.ROS2 common command tools
  • 17.ROS2 rviz2 use
  • 18.ROS2 rqt toolbox
  • 19.ROS2 Launch startup file configuration
  • 20.ROS2 recording and playback tool
  • 21.ROS2 URDF model
  • 22.ROS2 Gazebo simulation platform
  • 23.ROS2 TF2 coordinate transformation
Download
  • Mapping_APP(iOS_Android)
  • Code
  • Software_Tools
  • VM_System_File
  • 3D_Model_File
  • ESP32_Firmware
  • Dify LLM Base
  • Instruction_Manual
  • VMware
Download ZIP

Welcome to MicroROS V2 Robot Car repository

9. Drive Motors

Driving Motors

Experiment Objective

This section will guide you through driving DC geared motors with the MicroROS-V2 control board. Through this tutorial, you will learn how to use the ESP32-S3's MCPWM peripheral together with the bdc_motor component to control the forward/reverse direction and speed of the motors, implementing basic control such as acceleration, braking, and coasting stop.

Experiment Principle

1. Keywords

KeywordDescription
DC Geared MotorA DC motor with a built-in reduction gearbox that provides high torque; speed is controlled by regulating the voltage through PWM
MCPWMThe ESP32-S3's motor control PWM peripheral, which can configure multiple groups of timers and generators to drive DC motors together with the bdc_motor component
bdc_motorEspressif's official DC motor driver component, which encapsulates MCPWM configuration and forward/reverse, brake, and coast control logic
Brake stop (STOP_BRAKE)The motor coil is short-circuited, producing electromagnetic damping that stops the motor immediately
Coast stop (STOP_COAST)The motor coil is disconnected, and the motor decelerates to a stop by inertia
Dead ZoneThe region where the motor cannot rotate when the PWM duty cycle is too low; the code automatically adds a bias value (200) to cross the dead zone

2. Technical Architecture

The program uses the ESP32-S3's MCPWM peripheral together with Espressif's official bdc_motor component to drive two DC geared motors (M1 and M2). M1 uses GPIO13 (PWM A) and GPIO14 (PWM B); M2 uses GPIO11 (PWM A) and GPIO12 (PWM B). The PWM frequency is 25KHz and the timebase resolution is 10MHz. The code implements logic direction mapping (M2 is inverted due to mirrored mounting), dead zone filtering, and limit protection, providing basic control functions such as forward, reverse, brake stop, and coast stop.

Main component files:

  • main/main.c — main program entry, demonstrates the forward / brake / reverse / coast cycle

  • components/pwm_motor/pwm_motor.c / pwm_motor.h — motor driver implementation and interface declarations

Experiment Steps

1. Hardware Preparation

HardwareRequirement
MicroROS-V2 control board✅ Required
USB data cable✅ Required (for power supply and serial monitor)
Battery (12V)✅ Required (to power the motor driver)
MicroROS-V2 chassis motors✅ Required (connected to motor interfaces M1 / M2)

2. Prerequisites

  1. ESP32-IDF development environment set up

  2. MicroROS-V2 control board connected to the PC via USB

  3. Battery connected to the control board power interface

Motor wiring description

The motor driver interfaces on the MicroROS-V2 control board are defined as follows:

Motor interfacePin APin B
M1GPIO14 (PWMA)GPIO13 (PWMB)
M2GPIO12 (PWMA)GPIO11 (PWMB)

Note: The physical wiring directions of M1 and M2 are opposite, which is already handled in the code through logic direction constants.

3. Compile and Flash

​x

cd ~/esp/base_samples/pwm_motor
source ~/esp/esp-idf/export.sh
idf.py build flash monitor

After the program starts, the motors execute the following action cycle in sequence:

  1. Motors rotate forward (forward direction) at maximum speed

  2. Brake stop (STOP_BRAKE)

  3. Motors rotate reverse (backward direction) at maximum speed

  4. Coast stop (STOP_COAST)

Each state lasts 1 second and the cycle repeats.

4. How to Stop

Press Ctrl+] in the terminal to exit the serial monitor.

Experiment Result

After correctly flashing and running the program, the serial monitor outputs the following logs:

xxxxxxxxxx
hello yahboom
I (xxx) MAIN: Nice to meet you!
I (xxx) PWM_MOTOR: Init PwmMotor Device
I (xxx) MAIN: Motor Forward
I (xxx) MAIN: Motor Stop Brake
I (xxx) MAIN: Motor backward
I (xxx) MAIN: Motor Stop Coast
I (xxx) MAIN: Motor Forward
...

The DC motors connected to the M1 and M2 interfaces execute forward, brake stop, reverse, and coast stop in sequence according to the log order, with each state lasting 1 second.

  • Forward/Reverse: the motors rotate at maximum speed

  • Brake stop: the motors stop rotating immediately

  • Coast stop: the motors gradually decelerate to a stop by inertia

Code Explanation

Source code paths:

  • Firmware source code: ~/esp/base_samples/pwm_motor/main/main.c

  • Motor driver: ~/esp/base_samples/pwm_motor/components/pwm_motor/pwm_motor.h, pwm_motor.c

1. Project Structure

xxxxxxxxxx
pwm_motor/
├── CMakeLists.txt                          # Top-level CMake project file
├── main/
│   ├── CMakeLists.txt                      # main component build configuration
│   └── main.c                              # Main program entry
├── components/
│   └── pwm_motor/
│       ├── CMakeLists.txt                  # Component configuration (depends on driver, bdc_motor)
│       ├── idf_component.yml              # Component dependency declarations (bdc_motor: ^0.1.0)
│       ├── pwm_motor.c                     # Motor driver implementation
│       └── pwm_motor.h                     # Motor driver interface declarations
└── managed_components/
    └── espressif__bdc_motor/              # bdc_motor component (automatically pulled in)
        ├── include/bdc_motor.h
        └── src/bdc_motor.c

The bdc_motor component is the official DC motor driver library provided by Espressif. During compilation, it is automatically pulled from the component registry according to idf_component.yml.

2. Main Program Logic

The execution flow of app_main in main.c:

  1. Print the startup information

  2. After a 1-second delay, call PwmMotor_Init() to initialize the motor driver

  3. Enter the main loop, executing in sequence:

    • PwmMotor_Set_Speed_All(speed, speed) — both wheels rotate forward at maximum speed

    • PwmMotor_Stop(MOTOR_ID_ALL, STOP_BRAKE) — both wheels brake stop

    • PwmMotor_Set_Speed_All(-speed, -speed) — both wheels rotate reverse at maximum speed

    • PwmMotor_Stop(MOTOR_ID_ALL, STOP_COAST) — both wheels coast stop

3. Key Components

Motor Driver (pwm_motor.h / pwm_motor.c)

Pin and PWM parameter definitions:

Parameter definition file: ~/esp/base_samples/pwm_motor/components/pwm_motor/pwm_motor.h

xxxxxxxxxx
// Motor driver GPIO
#define PWM_GPIO_M1A              13      // M1 motor phase A
#define PWM_GPIO_M1B              14      // M1 motor phase B
#define PWM_GPIO_M2A              11      // M2 motor phase A
#define PWM_GPIO_M2B              12      // M2 motor phase B

// Logic direction (the forward direction of the car is the positive direction)
#define PWM_MOTOR_LOGIC_SIGN_M1   (+1)    // M1 positive direction
#define PWM_MOTOR_LOGIC_SIGN_M2   (-1)    // M2 reverse direction (mirrored mounting)

// PWM clock and frequency
#define PWM_MOTOR_TIMER_RESOLUTION_HZ    10000000  // 10MHz, 1 tick = 0.1us
#define PWM_MOTOR_FREQ_HZ                25000     // PWM frequency 25KHz
#define PWM_MOTOR_DUTY_TICK_MAX          (400)     // Theoretical maximum duty cycle ticks (10MHz / 25KHz)
#define PWM_MOTOR_DEAD_ZONE              (200)     // Dead zone filtering value
#define PWM_MOTOR_MAX_VALUE              (200)     // Maximum effective speed value (400 - 200)

The logic direction of M2 is inverted (-1) because the two motors are mounted in a mirror configuration on the car chassis; reverse direction control is needed for them to drive in the same direction.

Enumeration definitions:

xxxxxxxxxx
typedef enum _motor_id {
    MOTOR_ID_ALL = 0,   // All motors
    MOTOR_ID_M1 = 1,    // Motor M1
    MOTOR_ID_M2 = 2,    // Motor M2
} motor_id_t;

typedef enum _stop_mode {
    STOP_COAST = 0,     // Coast stop (motor coil disconnected, free rotation)
    STOP_BRAKE = 1      // Brake stop (motor coil short-circuited, immediate stop)
} stop_mode_t;

Motor initialization (PwmMotor_Init_M1 / PwmMotor_Init_M2):

Initialize the motor using the bdc_motor component:

xxxxxxxxxx
bdc_motor_config_t motor_config = {
    .pwm_freq_hz = PWM_MOTOR_FREQ_HZ,          // 25KHz
    .pwma_gpio_num = PWM_GPIO_M1B,             // M1's PWMA is connected to GPIO14
    .pwmb_gpio_num = PWM_GPIO_M1A,             // M1's PWMB is connected to GPIO13
};

bdc_motor_mcpwm_config_t mcpwm_config = {
    .group_id = PWM_MOTOR_TIMER_GROUP_ID_M1,    // Timer group ID (M1 and M2 are both group 0)
    .resolution_hz = PWM_MOTOR_TIMER_RESOLUTION_HZ, // 10MHz
};

bdc_motor_new_mcpwm_device(&motor_config, &mcpwm_config, &motor);
bdc_motor_enable(motor);

M2's pin configuration is PWMA=GPIO12, PWMB=GPIO11, consistent with the A/B phase order of M1.

Speed control function (PwmMotor_Apply_To_Device):

The low-level speed setting function, with parameters bdc_motor_handle_t and the speed value:

xxxxxxxxxx
static void PwmMotor_Apply_To_Device(bdc_motor_handle_t motor, int speed)

Processing flow:

  1. PwmMotor_Limit_Speed — limits to [-PWM_MOTOR_DUTY_TICK_MAX, PWM_MOTOR_DUTY_TICK_MAX]

  2. speed > 0: call bdc_motor_forward for forward rotation + bdc_motor_set_speed to set the speed

  3. speed < 0: call bdc_motor_reverse for reverse rotation + bdc_motor_set_speed to set the speed (absolute value)

  4. speed == 0: choose bdc_motor_brake (brake) or bdc_motor_coast (coast) according to the stop_brake flag

Dead zone filtering (PwmMotor_Ignore_Dead_Zone):

There is a dead zone near a speed value of 0; the motor cannot rotate when the PWM duty cycle is too low. The code automatically adds PWM_MOTOR_DEAD_ZONE (200) to the speed value to ensure the speed command can effectively drive the motor:

xxxxxxxxxx
static int PwmMotor_Ignore_Dead_Zone(int speed)
{
    if (speed > 0) return speed + PWM_MOTOR_DEAD_ZONE;
    if (speed < 0) return speed - PWM_MOTOR_DEAD_ZONE;
    return 0;
}

Logic direction mapping (PwmMotor_Apply_Logic_Direction):

Apply the logic direction sign according to the motor ID; M1 is positive (+1) and M2 is negative (-1):

xxxxxxxxxx
static int PwmMotor_Apply_Logic_Direction(motor_id_t motor_id, int speed)
{
    int logic_sign = 1;
    if (motor_id == MOTOR_ID_M1)      logic_sign = PWM_MOTOR_LOGIC_SIGN_M1;
    else if (motor_id == MOTOR_ID_M2) logic_sign = PWM_MOTOR_LOGIC_SIGN_M2;
    return speed * logic_sign;
}

API functions:

FunctionDescription
void PwmMotor_Init(void)Initialize the two-channel motor driver
void PwmMotor_Set_Speed_All(int speed_1, int speed_2)Set the speeds of M1 and M2 simultaneously
void PwmMotor_Set_Speed(motor_id_t motor_id, int speed)Set the speed of the specified motor
void PwmMotor_Stop(motor_id_t motor_id, bool brake)Stop the specified motor; true for brake, false for coast

A positive speed value indicates forward rotation (forward), and a negative value indicates reverse rotation (backward). The speed range is [-200, 200] (after dead zone filtering, the actual PWM duty cycle is 0~400).

Common Problems

ProblemCauseSolution
Motors do not rotateBattery not connected or poor motor wiringConfirm the battery is connected to the control board power interface and check whether the motor wiring is plugged in firmly
Motors only rotate in one directionWrong logic direction configuration or M1/M2 wiring reversedCheck the value of PWM_MOTOR_LOGIC_SIGN_M2 and whether the motor wires are inserted in reverse
Motors jitter or make sound without rotatingDead zone filtering value too small or insufficient battery voltageCheck the PWM_MOTOR_DEAD_ZONE value, or use a freshly charged battery
Motor forward direction is opposite to expectedLogic direction constants need adjustmentModify the signs of PWM_MOTOR_LOGIC_SIGN_M1 and PWM_MOTOR_LOGIC_SIGN_M2
Drive Pwm Servo
Read Motor Encoder Data

COMPANY

  • About us
  • Team Style
  • Blog

LEARNING & EXPLORATION

  • Tutorials
  • Edge AI hardware
  • Educational robots
  • Embedded intelligent hardware

WHERE TO BUY

  • Yahboom Online Store
  • Amazon
  • Alibaba
  • AliExpress
  • Mercado

TECHNOLOGY SUPPORT

  • Email: support@yahboom.com

BE A DISTRIBUTOR

  • Email: sales@yahboom.com
QR Code
QR Code

Copyright © 2017-2026 Yahboom. All Rights Reserved.

EN/中文