在科学探索和应急救援中,常常需要探测一些危险或人类无法直接到达的区域,这就需要用到机器人。 自动避障是机器人在复杂地形行驶时必不可少的基本功能。 避障功能在日常生活中也比较常见。 比如现在流行的自动清洁机器人,只要放在地上一会儿就可以把你的房子打扫干净。 这里最基本的功能就是避障。 当它检测到前方有障碍物时,就会绕过。 这样您就可以避开家具并清理地板。 因此,自动避障系统的发展应运而生。
MCS-51《单片机原理与接口技术》是中等职业院校电气自动化专业的必修课程。 本课程主要通过单片机内部结构、相关外围电路和编程语言的学习,使学生掌握单片机的使用。 具有开发和设计一些实用电子电路的能力。 自动避障小车就是基于该系统开发的。 自动避障小车可作为区域探索机器人、应急救援机器人的运动系统,使机器人在行驶时自动避障。
一、设计任务及主要内容
本设计是以单片机STC89C52RC为核心,根据传感模块传输的前方道路信息来控制小车行驶方向的系统的软硬件设计与开发。 系统必须能够准确、及时地监测前方路面信息并传输至主控模块,根据前方路面信息及时调整汽车行驶方向,并显示汽车行驶方向和行驶方向。汽车行驶的距离。
护栏车的主要功能有:
① 传感模块实时监测路况,并将障碍物位置及时传输给单片机;
②单片机核心模块根据传感模块给出的信息控制小车两个电机的转动;
③电机驱动模块驱动两个电机旋转,实现转向和行走。
2、系统主要硬件电路设计
根据设计要求,我们的自动避障小车主要由五个模块组成:车体框架、电源稳压模块、主控模块、检测模块、电机驱动模块。 各模块说明如下:
图1 系统模块框图
2.1 小车避障原理分析
车前部安装了三个红外探头。 中间的一个光电开关朝前,两侧的红外探头两侧间隔30度(如图2所示)。 当汽车行驶时,红外探头向前发射红外线。 当红外线遇到障碍物时,发生漫反射,反射光被光电开关接收。 汽车根据三个探头接收到的信号判断前方障碍物的分布并采取相应的行动。
图2 自动避障车体及避障原理图
所使用的红外探头是E12-D15NK红外避障传感器,它是一款集发射和接收于一体的光电传感器。 发射光经调制后发射,接收头将反射光解调并输出。 有效避免可见光的干扰。 分别检测前方、前方右侧、前方左侧障碍物信息。 在特殊地形(如障碍物密集的地形)下,可以将前面的光电开关移到后面进行检测。 E12-D15NK光电开关平均有效检测距离0~30cm可调,抗外界背景光干扰能力强,在阳光下也能正常工作(理论上应避免直接暴露在阳光和强光源下) )。 我们的车在换档调速后的最大制动距离不超过30cm,一般在10~20cm左右。 因此,该检测距离满足我们汽车的需求,示意图如下:
图4 红外避障传感器示意图
电气特性:
红色:VCC; 黑色:接地; 黄色:信号输出; 白色:将外部电位器与红线连接在一起。
工作电压:5VDC
工作电流:10-15mA
驱动电流:100mA
感应距离:1-15CM
机械性能:
颜色: 橙黄色
直径:12MM
长度:35MM
引线长度:25CM(不含连接器)
2.2 电源模块
方案一:直流稳压后采用交流电供电。 采用交流电提供直流稳压电源,电流驱动能力和电压稳定性最好,负载对电源的影响最小。 但由于需要电线为汽车提供动力,使得护栏车的机动性和适应地形的能力受到很大影响。 而且,护栏车很容易将地上拖着的电线识别为障碍物,人为地增加了不必要的障碍物。 所以我放弃了这个计划。
选项 2:使用电池供电的电池。 电池电流驱动能力强、电压稳定性好、成本低。 电池经过7812芯片稳压后可以用来给电机供电,然后通过降压连接到7805芯片,为单片机和其他逻辑单元供电。 但电池体积较大,重量过大,导致电机负载过大,不适合我们使用的车架(玩具电动车车架)。 所以我放弃了这个计划。
方案3:使用干电池组供电。 使用四节干电池将电压降至5V,然后为单片机和其他逻辑单元供电。 另外六节干电池用于为电机和光电开关供电。 这样,电机启动和制动时的短暂电压干扰就不会影响逻辑单元和单片机的运行。 干电池封装在电池盒内,体积小,重量轻。 同时,玩具车的底座上可以安装四节干电池,可以为微控制器和其他逻辑单元供电。 稳压方面,我们最初考虑使用7805芯片来降压稳定6V电池电压。 但考虑到这会导致7805芯片消耗大量能量并降低电池寿命; 同时,由于STC89C51、光电开关、汽车电机等对供电电压没有严格的要求,所以我们将6V电池电压接一个二极管,直接给单片机等逻辑单元供电。 电机和光电开关的电源不稳压。 这样,您只需在汽车主板上添加两个调速按钮,并根据电池电量选择合适的功率即可。 您甚至可以直接在软件中设置自动换档。 综合考虑,我选择了方案三。
2.3 主控模块 3.1、STC89C52RC单片机最小系统
我用的是STC的51核单片机STC89C52RC。 单片机的最小系统及概述如下: STC89C52RC单片机简介
STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰单片机。 指令代码与传统8051单片机完全兼容。 可以随意选择12个时钟/机器周期和6个时钟/机器周期。
主要特点如下:
1、增强型8051单片机,6个时钟/机器周期和12个时钟/机器周期任意选择,指令代码与传统8051完全兼容。
2、工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)
3、工作频率范围:0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz
4、用户申请空间8K字节
5. 片内集成512字节RAM
6、通用I/O口(32个),复位后:P1/P2/P3/P4为准双向口/弱上拉,P0口为开漏输出。 用于总线扩展时,无需添加上拉电阻。 ,作为I/O口使用时,需要加上拉电阻。
7. ISP(In-System Programmable)/IAP(In-Application Programmable),无需专用编程器或专用仿真器,可直接通过串口(RxD/P3.0、TxD/P3.1)下载用户程序)在几秒钟内完成一件作品
8.具有EEPROM功能
9.具有看门狗功能
10、共3个16位定时器/计数器。 即定时器T0、T1、T2
11. 4个外部中断,下降沿中断或低电平触发电路,Power Down模式可通过外部中断低电平触发中断模式唤醒
12.通用异步串口(UART),也可以使用定时器软件实现多个UART
13、工作温度范围:-40~+85℃(工业级)/0~75℃(商业级)
14. PDIP封装
检测模块与单片机中断接口之间、独立按钮与单片机中断接口之间的连接需要通过电平逻辑处理进行连接。 它主要涉及一个三输入或非门和一个二输入与门。 我们直接使用74HC系列的集成芯片来实现这两种逻辑关系。 由于三输入或非门在市场上很难买到,所以我们用两个二输入或非门和一个二输入与门来完成三输入或非门。 由于我们使用的74HC08(四二输入与门)和74HC02(四二输入或非门)都是四二输入,各自提供四个二输入与门和四个二输入或非门,所以我们使用每个单片机就可以实现所需的逻辑功能。
2.4 电机驱动模块
本系统采用L298N芯片来驱动电机。 L298N是一款高电压、大电流的全桥驱动芯片。 输出电压最高可达50V。 输出电压可直接通过电源调节。 可直接利用单片机的IO口提供信号。 它还具有一个使能端子,方便 PWM 速度调节。 电路简单、性能稳定、使用方便。 L298N芯片可以驱动2个两相电机或1个四相电机,正好满足我们汽车的两个两相电机的驱动要求。 经过综合考虑,我使用L298N芯片来驱动汽车电机。
最终方案如下:采用干电池组为系统供电,改造一辆玩具电动车作为汽车底座,采用STC89C52RC作为主控芯片,采用E12-D15NK光电开关进行障碍物检测,采用L298N进行驱动直流电机。 逻辑关系处理采用74HC系列芯片完成。
2.5 通用电路图
图5 整体电路图设计
3.系统软件设计
3.1 程序流程图
系统设计流程图如下
图6 系统软件主流程图
3.2 系统程序列表
#包括
#定义uchar无符号字符
#定义 uintunsigned int
/************************
端口定义
**********************/
sbit IN1=P1^0; //P10接电机驱动IN1
sbit IN2=P1^1 //P11接电机驱动IN2
sbit IN3=P1^2; //P12接电机驱动IN3
sbit IN4=P1^3; //P13接电机驱动IN4
uchar INS=P2; //P2口的^0、P2^1、P2^2分别连接左、中、右红外模块输出信号线。
uint D=200;//定义延时函数的参数
/************************
各子功能定义
**************************/
无效Go(无效)
IN1=0;
IN2=0;
IN3=1;
IN4=0;
无效返回(无效)
IN1=0;
IN2=0;
IN3=0;
IN4=1;
无效Go_left(无效)
IN1=1;
IN2=0;
IN3=1;
IN4=0;
无效Go_right(无效)
IN1=0;
IN2=1;
IN3=1;
IN4=0;
无效停止(无效)
IN1=IN2=IN3=IN4=0;
/***
无效后左(无效)
IN1=1;
IN2=0;
IN3=0;
IN4=1;
无效后右(无效)
IN1=0;
IN2=1;
IN3=0;
IN4=1;
***/
无效延迟(uint n)
uint i,j;
i=j=n;
for(;i>0;i–)
for(;j>0;j–);
无效Be_move(无效)
乌恰尔温度;
温度=INS&0x07;
开关(温度)
案例 0x01:Go_right();Go();延迟(D);break;
案例0x02:
案例0x03:
案例 0x07:Back();延迟(D);Go_right();Go();延迟(D);中断;
case 0x06:Back();Delay(D);Go_left();Go();Delay(D);break;
案例 0x04:Go_left();Go();Delay();break;
案例 0x05:Go();Delay();break;
默认值:停止();延迟();中断;
无效主()
乌恰尔温度;
同时(1)
温度=INS&0x07;
if(temp==0x00) Go();
否则 Be_move();