1. 项目背景与核心功能
这个基于STM32F103ZE的扫地机器人项目,本质上是在正点原子精英版开发板上实现的智能清洁设备控制系统。作为嵌入式开发者,我们经常需要将开发板的功能扩展到实际应用场景,这个项目恰好展示了如何把一块标准开发板改造成具备实用功能的智能设备。
核心功能模块包括:
- 自动弓字形路径规划
- 超声波避障系统
- WiFi远程控制
- 自动回充功能
- 步进电机精确控制
提示:选择正点原子精英版作为开发平台,主要考虑其STM32F103ZET6芯片具有足够的GPIO和定时器资源,且配套资料完善,特别适合作为教学级项目开发。
2. 硬件架构设计
2.1 主控系统选型
STM32F103ZET6作为主控芯片具有以下优势:
- 72MHz主频足够处理实时控制任务
- 3个USART接口(WiFi、调试、备用)
- 8个定时器(用于PWM生成和电机控制)
- 64KB RAM可存储地图数据
实际开发中发现,芯片的GPIO分配需要特别注意:
- PE2~PE5用于步进电机控制
- PA6~PA7接超声波模块
- PC10~PC11用于ESP8266通信
- PB12~PB15用于状态指示灯
2.2 运动系统实现
采用4个28BYJ-48步进电机的方案,这种5线4相电机虽然扭矩不大,但胜在价格低廉(单价不到10元),且通过ULN2003驱动板可以方便地实现控制。
电机控制的关键在于相位时序和脉冲精度:
c复制// 步进电机8拍驱动序列
const uint8_t phase_seq[8] = {0x09,0x08,0x0C,0x04,0x06,0x02,0x03,0x01};
实测中发现,直接使用延时函数控制步进会导致速度不稳定,最终采用定时器PWM输出方案:
c复制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%占空比
}
2.3 感知系统搭建
避障系统采用HC-SR04超声波模块配合SG90舵机实现环境扫描,这种方案成本不到30元,但需要解决几个关键问题:
- 黑色物体检测补偿:
c复制// 原始距离值
sonar_val = HAL_GPIO_ReadPin(TRIG_GPIO_Port, TRIG_Pin);
// 深色物体补偿
if(sonar_val > 300 && color_sensor_val < 50) {
sonar_val *= 1.2;
}
- 扫描算法优化:
c复制for(int angle=0; angle<=180; angle+=15){
Set_Servo_Angle(angle);
HAL_Delay(50);
Get_Distance();
}
3. 软件系统实现
3.1 路径规划算法
弓字形路径规划是扫地机器人的核心算法,实现要点包括:
- 状态机设计:
c复制typedef enum {
FORWARD_MODE,
TURN_RIGHT_MODE,
TURN_LEFT_MODE,
ESCAPE_MODE,
HOME_MODE
} Robot_Mode;
- 运动控制逻辑:
c复制void Path_Planner(void) {
static uint32_t step_count = 0;
if(step_count % 100 == 0) {
// 每100步检测一次障碍
if(obstacle_detected) {
Mode_Switch(ESCAPE_MODE);
} else {
Mode_Switch(FORWARD_MODE);
}
}
step_count++;
}
3.2 WiFi控制实现
ESP8266模块通过AT指令与STM32通信,关键实现包括:
- 指令解析设计:
c复制void ESP8266_IRQHandler(void) {
static char rx_buf[128];
static uint8_t idx = 0;
rx_buf[idx++] = USART3->DR;
if(strstr(rx_buf, "+++HOME")) {
Mode_Switch(HOME_MODE);
memset(rx_buf, 0, sizeof(rx_buf));
idx = 0;
}
}
- 一键回充算法:
c复制void Home_Mode_Handler(void) {
static int home_steps_x = 0;
static int home_steps_y = 0;
// 根据陀螺仪数据计算偏差
if(ABS(gyro_x) > 5) {
Motor_Turn_Right(10);
home_steps_x += 10;
}
// 其他方向处理...
}
4. 电源系统设计
4.1 供电方案优化
项目初期遇到的最大问题是电机启动时的电压跌落,解决方案包括:
- 电容阵列设计:
- 4个4700μF电解电容并联
- 0.1μF陶瓷电容去耦
- 布局尽量靠近电机驱动板
- 电源监控实现:
c复制void Power_Check(void) {
float voltage = ADC_Read() * 3.3 / 4096 * 2;
if(voltage < 3.0) {
Motor_Stop();
LED_Alert();
}
}
4.2 低功耗处理
虽然本项目没有严格功耗要求,但仍做了优化:
- 空闲时关闭不必要的外设时钟
- 降低扫描频率(从10Hz降到5Hz)
- 使用PWM休眠模式
5. 调试与优化
5.1 常见问题排查
- 电机失步问题:
- 检查ULN2003驱动电压是否足够
- 增加步进脉冲间隔时间
- 添加机械减震措施
- WiFi连接不稳定:
- 确保天线远离电机线路
- 增加AT指令重试机制
- 添加软件看门狗
5.2 性能优化技巧
- 运动控制优化:
c复制// 差速转向算法优化
void Differential_Control(int left_speed, int right_speed) {
__HAL_TIM_SET_AUTORELOAD(&htim3, 1000000/left_speed);
__HAL_TIM_SET_AUTORELOAD(&htim4, 1000000/right_speed);
}
- 内存优化:
- 使用位域存储状态标志
- 将地图数据存储在const区域
- 启用编译器优化选项-O2
6. 项目扩展方向
6.1 功能增强建议
- 添加边刷电机控制
- 实现地图记忆功能
- 增加电池管理系统
- 支持多房间清扫
6.2 商业级改进思路
- 改用直流无刷电机
- 采用LDS激光雷达
- 增加视觉识别模块
- 开发配套手机APP
这个项目最让我惊喜的是,用不到200元的成本就实现了商业扫地机器人的基础功能。虽然精度和可靠性还有差距,但作为教学项目和创客原型已经足够。建议有兴趣的开发者可以尝试用RTOS重构代码,这将大大提升系统的实时性和可维护性。
