这个基于STM32F103ZE的扫地机器人项目,是我花了半个月时间在正点原子精英版开发板上实现的。核心功能包括弓字形路径规划、超声波避障、WiFi远程控制和一键回充。虽然比不上商业产品,但作为创客项目已经具备了完整的扫地机器人基础功能。
硬件上采用了STM32F103ZE作为主控,搭配四个28BYJ-48步进电机负责移动,HC-SR04超声波模块实现避障,ESP8266提供WiFi连接。软件方面最核心的是路径规划算法和电机控制逻辑,通过状态机实现了稳定的弓字形行走路线。
特别说明:项目所有代码都是基于寄存器开发,没有使用HAL库,这样能更好地理解底层硬件工作原理。
选用正点原子精英版开发板作为核心控制器,主要考虑以下几点:
采用28BYJ-48步进电机配合ULN2003驱动板的方案,主要优势是:
电机参数:
| 参数 | 值 |
|---|---|
| 步距角 | 5.625° |
| 减速比 | 1:64 |
| 工作电压 | 5V |
| 相电流 | 120mA |
使用HC-SR04超声波模块实现避障,主要特点是:
模块安装在SG90舵机上,可以实现180度环境扫描,大大提高了避障效果。
软件采用模块化设计,主要分为以下几个部分:
弓字形路径的核心是状态机设计,主要状态包括:
关键代码片段:
c复制// 路径规划状态机
void Path_Planner(void) {
switch(path_state) {
case GO_FORWARD:
Motor_Forward(step_count);
if(++step_count >= max_steps) {
path_state = TURN_RIGHT;
step_count = 0;
}
break;
case TURN_RIGHT:
Motor_Turn_Right(turn_steps);
if(++step_count >= turn_steps) {
path_state = GO_FORWARD;
step_count = 0;
}
break;
// 其他状态处理...
}
}
使用定时器PWM输出控制电机,相比传统的延时方法有以下优势:
电机驱动关键代码:
c复制// 步进电机相位序
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); // 50%占空比
}
HC-SR04模块工作原理:
原始避障算法存在以下问题:
改进后的算法增加了以下特性:
避障处理代码:
c复制if(sonar_val < 400) { // 单位mm
obstacle_count++;
if(obstacle_count >= 3) {
Mode_Switch(ESCAPE_MODE); // 切换逃生模式
BEEP_Alert(3); // 哔哔哔叫三声
}
} else {
obstacle_count = 0;
}
使用AT指令与ESP8266模块通信,主要指令包括:
回充功能实现要点:
回充处理代码:
c复制void Home_Mode_Handler(void) {
static int home_steps = 0;
if(ABS(current_x) > 10 || ABS(current_y) > 10) {
Motor_Go_Backward(home_steps);
home_steps--;
} else {
Motor_Stop();
LED_Blink(5); // 到家提示灯
}
}
初期遇到的主要问题:
最终采用的电源优化方案:
电源电路参数:
| 元件 | 参数 | 数量 |
|---|---|---|
| 电解电容 | 4700μF/16V | 4 |
| 陶瓷电容 | 100nF | 10 |
| 稳压芯片 | AMS1117-3.3 | 1 |
实际测试中发现的主要问题及解决方法:
直线行走偏移:
避障误触发:
WiFi连接不稳定:
路径规划:
避障系统:
电源管理:
这个项目实现了扫地机器人的基本功能,包括自动清扫、避障和远程控制。虽然还存在一些不足,但作为学习STM32和机器人控制的实践项目已经达到了预期目标。
关键收获:
后续可以继续完善的功能: