扫地机器人 基于stm32f103ze扫地机器人程序,基于整点原子精英版例程修改。 本产品主要实现的是机器人自动弓字形前进,遇到障碍物避障并继续,WiFi控制整个过程,同时可一键回到初始位置。 步进电机+超声波避障+弓字形行进+WIFI控制+一建启动一建回到初始位置。 包含的电子资料见图(不含实物)。
这个扫地机器人项目用STM32F03ZE折腾了半个月终于跑通了。现在这货能像强迫症一样在屋里走工整的弓字形路线,遇到椅子腿能自己绕开,手机APP点一下就能让它滚回充电座——虽然偶尔会卡在拖鞋堆里转圈,但整体还算能打。
硬件上用了正点原子的精英板当大脑,四个28BYJ-48步进电机配ULN2003驱动板(淘宝9.9包邮那种)。避障主力是HC-SR04超声波模块,装在可180度旋转的舵机上实现环境扫描。WiFi模块选了ESP8266,直接挂在串口3上吃灰多年的引脚终于派上用场。
路径规划是项目的灵魂。核心代码在motor_ctrl.c里搞了个状态机,Y轴步进电机负责前进后退,X轴的两个电机差速控制转向。这里有个骚操作——用定时器3的PWM输出直接怼电机驱动板,比delay函数优雅多了:
// 步进电机相位序 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); // 启动PWM __HAL_TIM_SET_AUTORELOAD(htim, pulse); // 设置脉冲周期 __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, pulse/2); // 50%占空比 }这段代码让电机转速稳定在200RPM左右,实测走直线误差不超过2cm。遇到转向时,通过动态调整两侧轮子的脉冲频率实现差速,比用延时函数精准得多。
扫地机器人 基于stm32f103ze扫地机器人程序,基于整点原子精英版例程修改。 本产品主要实现的是机器人自动弓字形前进,遇到障碍物避障并继续,WiFi控制整个过程,同时可一键回到初始位置。 步进电机+超声波避障+弓字形行进+WIFI控制+一建启动一建回到初始位置。 包含的电子资料见图(不含实物)。
避障系统在超声波.c文件里搞事情。舵机每15度停一下扫描环境,超过40cm就大胆往前走。这里有个防抖机制——连续三次检测到障碍才触发避障:
if(sonar_val < 400) { // 单位mm obstacle_count++; if(obstacle_count >= 3) { Mode_Switch(ESCAPE_MODE); // 切换逃生模式 BEEP_Alert(3); // 哔哔哔叫三声 } } else { obstacle_count = 0; }实际测试中发现这货对黑色物体识别距离会缩水,后来在算法里给深色物体加了20%的距离补偿。
WiFi控制部分用AT指令硬怼,在uart3的中断服务函数里憋了个指令解析器。最实用的是一键回家功能——每次启动时记录初始坐标,长按KEY0键触发:
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); // 到家提示灯 } }实测回充成功率大概80%,剩下20%的情况会怼墙——后来发现是地磁干扰导致陀螺仪漂移,加了个软件校准才算解决。
这个项目最坑的是供电系统——电机一启动整个系统电压就掉到3V,最后不得不在电机电源线上并了四个4700μF的电容才稳住。现在这货能连续工作半小时,足够把我家客厅扫两遍。虽然离商业产品还差得远,但拿来在创客比赛装逼已经够用了。