基于STM32的职场清洁机器人设计
摘要
为了促进科技与生活的结合,以及结合我的工作环境,我对目前市场上已有的扫地机器人进行了一个简单的调查。
近几年来,安杰公司基于“人机结合&整体运营&品质提升&成本降低”的服务理念,先后推出人机整体运营服务,各行各业各种代表着不同领域的机器人,通过不同方式的提供的服务,满足物业管理行业多样化的应用和部署要求,加速物业服务企业服务创新升级。这些智能机器人不论是哪一种都离不开低速SLAM技术,移动系统、感知系统、控制系统和吸尘系统,集合了传感检测、信息处理、运动控制、电源等多学科研究。
针对我的工作环境,我设计了一款可以适用于多种大型的人员密集的职场使用的清洁机器人。主要是利用STM32单片机对其整体进行控制,并加入两路红外传感器和一个风扇系统,以及利用Keil进行软件的程序编写。
经实验后,将硬件部分与软件程序结合起来,整个系统在工作时能够彻底脱离人工控制,在室内工作遇到墙壁,桌子椅子等障碍物时能够自动检测出来,然后能够自动进行躲避,做出左转、右转或后退的反应按下开关后电机启动,可完全脱离人工控制,达到自动清洁的效果。
设计内容
2.1整体方案设计
本次研究的产品基于结构和系统的设计。对于前者来讲,主要是运用Solidwords3D制图软件来绘制零件,后者主要是电路的焊接以及之后对于程序的设计和调试,对于硬件的角度电路,指示灯,光耦电路等等;大量数据采集的应用来处理电动机的转速,具体的框架以及思路如图2.1所示:

图2.1 系统方案框图
专业课中接触最多的单片机就是AT89C51和STM32,所以在两种单片机中的选择上,我做出了以下比较:
方案一:用C51单片机为核心的主要机器人,基于红外线功能和声波的模块的构成,使扫地机器人具有避障,和可以遥控的这两个核心和功能,通过各个功能的配合,可以使小车通过系统内部的计算来实现精准的避开大部分障碍,使其沿着设定好的轨道工作,即设计小车按照预设黑线循环打扫,LCD实时显示了离障碍距离和运行状态。
方案二:根据各种模块传感的集中交互来完成高效率情节以及保持正确路径的机器人,提高底盘稳定性,在此基础上增加数据之间的计算,这样得以使传感器得到的数据能够更加高效的计算给动力系统,减少对于路面以及障碍物的凹凸不平的表面等带来的误差[4],保证这些,在清洁能力上要有稳定的执行,根据需要清扫的对象的大小形态做出正确的判断之后然后做出相应的对策来完成高成效的对策。同时也在耗能和成本两个关键部分得到舒缓。
对此情况来看的话,STM32其外设更加多样化,也就可以满足各项功能的实施,相比其他单片机而言,增加了更多的定时系统以及多个外部链接的中断功能、PWM模式等一些输入相关的模式[5],使作用范围大大提高,但是C51这种比较传统的老牌单片机,相对比只能控制高低电平而言就更加局限了。
所以,方案二,采用STM32单片机是更好的选择。
2.2整体模块及功能介绍
本系统由STM32F103C8T6单片机核心板、2路红外避障模块、2路按键、风扇驱动、电机驱动、升压模块、锂电池充电模块及电池盒供电组成。
按下启动按键后,小车启动,同时,风扇转动吸尘;按下停止按键后,小车停止转动,同时,风扇停止转动。
小车在运行过程中,当一侧的检测障碍的红外传感检测到有障碍的时候,系统立刻接受到数据然后将其向另一侧转动,如果两侧同时感觉到障碍物的存在的时候(小车可能走不动了),则小车后退然后旋转调头。
原理图

程序清单
#include "led.h"
#include "math.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include <stdio.h>
#include "timer.h"
#include "key.h"
#include "pwm.h"
#include "mycar.h"
#define VALUE_TIME_IR 200//红外检测到障碍物达到指定时间则任务小车被挡住走不动了 VALUE_TIME_IR*10ms
#define speed_perset 80
char dis_temp[18]; //显示暂存数组
unsigned char i;
int main(void)
{
NVIC_Configuration();
delay_init(); //延时函数初始化
USARTx_Init(USART1,9600); //串口初始化为9600
// USARTx_Init(USART2,9600); //串口初始化为9600
TIM3_Int_Init(99,7199);//10ms
TIM4_PWM_Init(PWM_PER-1,0);
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //按键初始化
while(1)
{
KeyScan();//扫描所有按键
if(KeyIsPress(key_start)){//启动按键
state_car |= 0x80;//设置小车状态为启动(使用state_car的最高位标记)
fan = 1;//打开风扇
delay_ms(500); //
Car_Go_Forward(speed_perset,speed_perset);//小车前进
}
if(KeyIsPress(key_stop)){//停止按键
state_car &= 0x7f;//设置小车状态为停止(使用state_car的最高位标记)
Car_Stop();//小车停止
fan = 0;//关闭风扇
}
if(state_car&0x80){//小车启动
if(KeyIsPressed(key_ir_left) && KeyIsPressed(key_ir_right)){//两边都检测到障碍物
if(count_ir_left>VALUE_TIME_IR && count_ir_right>VALUE_TIME_IR){//如果两边检测到障碍物都超过了一定时间,则可能是小车被卡住动不了了
Car_Go_Backward(speed_perset,speed_perset);//小车后退
delay_ms(300); //延时一段时间,让小车后退足够的距离
Car_Go_Rotation(Car_Dir_TernRight,100);//小车全速向右旋转
delay_ms(300); //延时一段时间,让小车旋转足够的角度
}
else{
if(count_ir_left<count_ir_right){//如果右边检测到障碍物的时间超过了左边
Car_Go_Rotation(Car_Dir_TernLeft,100);//小车全速向左旋转
}
else{
Car_Go_Rotation(Car_Dir_TernRight,100);//小车全速向右旋转
}
delay_ms(100); //延时一段时间,让小车旋转足够的角度
}
}
else if(KeyIsPressed(key_ir_left)){//左边检测到障碍物
if(count_ir_left>VALUE_TIME_IR){//如果检测到障碍物超过一定时间,可能是小车被卡住动不了了
Car_Go_Backward(speed_perset,speed_perset);//小车后退
delay_ms(300); //延时一段时间,让小车后退足够的距离
Car_Go_TernLeft(Car_Dir_Backward,100);//向左倒车
delay_ms(300); //延时一段时间,让小车后退足够的角度
}
else{
Car_Go_TernRight(Car_Dir_Forward,100);//向右转弯
delay_ms(100); //延时一段时间,让小车转弯足够的角度
}
}
else if(KeyIsPressed(key_ir_right)){//右边检测到障碍物
if(count_ir_right>VALUE_TIME_IR){//如果检测到障碍物超过一定时间,可能是小车被卡住动不了了
Car_Go_Backward(speed_perset,speed_perset);//小车后退
delay_ms(300); //延时一段时间,让小车后退足够的距离
Car_Go_TernRight(Car_Dir_Backward,100);//向右倒车
delay_ms(300); //延时一段时间,让小车后退足够的角度
}
else{
Car_Go_TernLeft(Car_Dir_Forward,100);//向左转弯
delay_ms(100); ////延时一段时间,让小车转弯足够的角度
}
}
else{//都没检测到障碍物
Car_Go_Forward(speed_perset,speed_perset);//小车直行
}
}
}
资源获取
下方名片联系我即可!!
博主联系方式:点击我获取资料->->进我个人主页–>获取博主联系方式
大家点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式👇🏻
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)