1. 项目概述:基于STM32的智能扫地机器人开发实录
去年夏天我突发奇想,决定用吃灰已久的STM32开发板做个扫地机器人。这个看似简单的项目实际涉及电机控制、传感器融合、路径规划等多个技术难点。经过半个月的折腾,最终实现了弓字形路径覆盖、超声波避障、WiFi遥控和自动回充等核心功能。整个系统硬件成本不到200元,但实现了商业扫地机器人80%的基础功能。
这个项目特别适合想要进阶STM32开发的工程师,或是参加电子设计竞赛的学生群体。通过本项目你可以掌握:
- 步进电机的精确控制与调速技术
- 多传感器数据融合的避障算法
- 基于状态机的路径规划实现
- 低功耗WiFi通信模块的集成应用
2. 硬件架构设计与选型解析
2.1 主控板选型与配置
我选用正点原子精英版开发板作为主控,核心是STM32F103ZET6芯片。选择这款芯片主要基于三点考虑:
- 充足的GPIO资源(112个引脚)可同时驱动多个电机和传感器
- 内置硬件PWM生成器(8个定时器)适合电机控制
- 3个USART接口可同时连接WiFi模块和调试终端
注意:STM32F103的GPIO驱动能力有限(最大25mA),必须通过驱动芯片控制电机,否则可能烧毁IO口。
2.2 运动系统实现方案
运动系统采用四轮差速转向设计:
- 4个28BYJ-48步进电机(5V/64步每转)
- ULN2003驱动板(淘宝单价9.9元)
- 电机布局采用两两并联方式:
- 左侧两个电机并联控制左轮
- 右侧两个电机并联控制右轮
这种设计的优势在于:
- 差速转向算法简单可靠
- 步进电机可实现精确的位置控制
- 并联设计提升扭矩,防止单电机动力不足
2.3 感知系统搭建
避障系统由以下组件构成:
- HC-SR04超声波模块(检测距离2cm-400cm)
- SG90舵机(180度旋转平台)
- 组合安装方式:
- 超声波模块固定在舵机转盘上
- 扫描角度设置为-90°到+90°
- 每15°停顿采集一次距离数据
实际测试发现超声波对黑色物体检测距离会缩短约20%,解决方案是在算法中加入颜色补偿系数:
c复制// 距离补偿算法
float get_real_distance(float raw_dist, uint8_t color_level) {
return raw_dist * (1.0 + 0.2 * (255 - color_level)/255);
}
3. 核心功能实现细节
3.1 步进电机控制技术
步进电机驱动采用硬件PWM方案,相比传统的delay延时驱动有以下优势:
- 速度控制更精确(误差<±5RPM)
- 不占用CPU资源
- 可实现平滑加减速
关键代码实现:
c复制// 步进电机相位序(8拍模式)
const uint8_t phase_seq[] = {0x09,0x08,0x0C,0x04,0x06,0x02,0x03,0x01};
void STEP_Motor_Run(TIM_HandleTypeDef* htim, uint16_t pulse) {
HAL_TIM_PWM_Start(htim, TIM_CHANNEL_1);
__HAL_TIM_SET_AUTORELOAD(htim, pulse); // 设置脉冲周期
__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, pulse/2);
}
参数计算示例:
- 目标转速200RPM = 3.33转/秒
- 电机64步/转 → 213步/秒
- 定时器时钟72MHz,分频系数72
- 自动重载值 = 1MHz/213 ≈ 4695
3.2 弓字形路径规划算法
路径规划采用有限状态机实现,主要状态包括:
- FORWARD:直线前进
- TURN_LEFT:左转90度
- TURN_RIGHT:右转90度
- ESCAPE:避障模式
状态转换逻辑:
mermaid复制graph TD
A[FORWARD] -->|前方障碍| D[ESCAPE]
A -->|到达边界| B[TURN_LEFT]
B --> C[FORWARD]
D -->|避开障碍| A
实际实现时发现纯转向算法存在累计误差,后来加入陀螺仪校正:
c复制void Gyro_Correct(void) {
if(ABS(gyro_z - target_z) > 5) {
// 差速补偿算法
left_speed += (gyro_z - target_z) * 0.1;
right_speed -= (gyro_z - target_z) * 0.1;
}
}
3.3 超声波避障系统优化
原始避障方案存在两个问题:
- 单次检测容易误触发
- 狭窄空间容易陷入死循环
改进后的避障流程:
- 三级检测确认障碍物(连续3次检测)
- 动态调整检测频率(近距时提高采样率)
- 逃生策略分级:
- 小障碍:减速绕行
- 大障碍:后退转向
关键代码片段:
c复制if(sonar_val < 400) { // 单位mm
obstacle_count++;
if(obstacle_count >= 3) {
Mode_Switch(ESCAPE_MODE);
BEEP_Alert(3);
}
} else {
obstacle_count = 0;
}
4. 通信与控制系统实现
4.1 WiFi通信模块集成
选用ESP8266模块通过串口3连接,通信协议设计要点:
- 帧格式:$CMD,PARAM1,PARAM2#
- 支持指令:
- START:开始清扫
- STOP:急停
- GO_HOME:返回充电座
- SET_MODE:设置清扫模式
实际开发中遇到的坑:
- AT指令响应超时问题:增加重试机制
- 数据粘包问题:添加帧头和帧尾校验
- 信号干扰问题:在模块电源端并联100μF电容
4.2 一键回充功能实现
回充功能实现步骤:
- 启动时记录初始坐标(0,0)
- 运行时通过编码器记录位移
- 触发回充时:
- 计算当前位置到原点的向量
- 先转向对准原点方向
- 沿直线移动直到坐标接近(0,0)
关键算法:
c复制void Calculate_Home_Vector(void) {
float dx = -current_x;
float dy = -current_y;
home_angle = atan2(dy, dx) * 180 / PI;
home_distance = sqrt(dx*dx + dy*dy);
}
5. 电源系统设计与优化
5.1 供电方案选型
最初尝试的方案:
- 2节18650电池(7.4V)
- AMS1117降压到5V
- 结果:电机启动时电压骤降到3V导致MCU复位
改进后的方案:
- 电源分级设计:
- 电机电源:7.4V直接供电
- 控制系统电源:通过DC-DC降压到5V
- 增加储能电容:
- 电机端:4个4700μF电解电容并联
- MCU端:100μF钽电容+0.1μF陶瓷电容
5.2 低功耗优化技巧
通过以下措施延长续航:
- 动态调整电机功率:
- 直线行驶:全功率
- 转向时:降低内侧电机功率
- 智能休眠机制:
- 静止超30秒进入低功耗模式
- 检测到震动或收到指令时唤醒
- 电源监控:
- 实时监测电池电压
- 电量低于20%时自动回充
6. 常见问题与解决方案
6.1 电机控制问题排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 电机不转 | 驱动板供电不足 | 检查电源线径≥0.75mm² |
| 转向不准确 | 脉冲计算错误 | 重新校准编码器参数 |
| 异常振动 | 相序设置错误 | 检查phase_seq数组 |
6.2 避障系统异常处理
-
检测距离突然变短:
- 检查超声波模块透镜是否脏污
- 确认供电电压稳定在5V±0.2V
-
舵机卡死:
- 增加机械限位保护
- 软件设置最大转动角度(±95°)
-
误避障:
- 调整检测阈值(建议30-40cm)
- 添加软件滤波(中值滤波+均值滤波)
7. 项目优化方向与进阶建议
这个基础版本完成后,还可以进一步扩展:
-
增加地图构建功能
- 使用SLAM算法
- 添加光电编码器提升定位精度
-
改进清扫效率
- 实现往复式清扫路径
- 根据灰尘密度动态调整速度
-
增强越障能力
- 改用直流电机+编码器方案
- 增加悬挂系统
-
添加自动充电功能
- 在充电座安装红外信标
- 机器人底部增加充电触点
这个项目最让我意外的是,原本以为最难的是电机控制,实际开发中发现最棘手的反而是电源设计。那些商业扫地机器人能保持稳定运行,背后的电源管理系统肯定下了大功夫。建议后续开发者可以重点研究开关电源设计,这对任何移动机器人项目都是关键基础。
