|
【S076】智能避障运输机器人
作品说明 |
美国将发展智能网联汽车作为美国发展智能交通系统的一项重点工作内容,通过制定国家战略和法规,引导产业发展。2016年发布了《美国自动驾驶汽车政策指南》,引起行业广泛关注。日本:较早开始研究智能交通系统,政府积极发挥跨部门协同作用,推动智能网联汽车项目实施。计划2020年在限定地区解禁无人驾驶的自动驾驶汽车,到2025年在国内形成完全自动驾驶汽车市场目标。欧盟:支持智能网联汽车的技术创新和成果转化,在世界保持领先优势。通过发布一系列政策,以及自动驾驶路线图等,推进智能网联汽车的研发和应用,引导各成员国智能网联汽车产业发展。目前,许多技术已经广泛使用。在很多应用中智能技术也显露出它的重要地位,尤其是运用在智能汽车方面。这些年以来,例如电子、传感器和自动控制等技术联系紧密,多种技术的融合推动着汽车行业的进步。智能自动驾驶无人小车未来可能会作为自动无人驾驶汽车机器人的一个重要典型应用代表。利用人工智能技术驾驶自动小车通过自动感知驾驶小车上的导引线和周围的交通障碍物,可以实现小车自动识别正常行驶的路线,并选择正确的行进路线,当遇到交通障碍物时自动减速停车进行躲避。
在环境探测、险情排除、工程爆破、工程施工等工程领域,也有很多智能设备的影子。传统的工程机械多设计为作业机械和操作人员操控室为一体,驾驶操控室中的视线受限,不能高效完成作业,特别是因对工程机械周围环境不能完全可视,而发生意外事故。在作业过程中发生紧急意外事故时,因驾驶操作人员不能及时脱身,导致工作人员的生命安全受到威胁。在一些特殊环境下作业,这时就需要现场辅助人员指挥完成作业。而无线遥控操控和驾驶操控室和作业机械可以自由分离结合的方式,便可以有效避免以上问题。电力工程中,近年来研发的拉线架线、巡线、巡塔无人机、喷火除异物无人机,改变了电力工人工作方式,大大减轻了人工的工作难度。军事中的智能小车可以通过运用各种人工智能技术帮助作战车辆快速进行故障扫除引爆炸弹、销毁爆炸地雷。其它的应用方面,可以用于帮助人们探测各种有害化学物和泄漏物的介质,进行防灾灭火,废墟中进行挖掘和帮助寻找其他生命体等。人们每天都会接触的交通工具家用汽车,就是智能小车的升级加强版,就比如家用汽车的倒车防撞雷达,原理就和本课题研究的避障原理相同,它们都是根据传感器识别障碍物,然后把信号反馈给汽车中的驾驶者,预判出距离障碍物的位置,防止发生碰撞的事故。同样近年来研发出的无人驾驶机动车、无人驾驶送快递小车,都是智能小车的升级加强版,升级更智能更可靠的CPU、更多更稳定精确的传感器、更多强大的执行机构、更强劲的动力系统,当然还有更先进强大的程序算法[2]。本次设计适合刚接触智能机器人领域的初学者,对培养兴趣、提升思维还是很有帮助的。之所以智能汽车技术引起人们的关注,是因为该技术可以改变人们的生活方式,并可以应用在日常环境下的多种情况。
以上述内容为背景,本论文构建出一种智能小车,它可以实现循迹、避障报警等功能。这种小车用单片机来处理传感器检测出的信号,所以因此得名。为它有必要的业余时间利用去深入研究学习和认真研究如何开发应用该产品系列新型单片机,以更好地能够满足实际工业应用和相关产品开发的实际应用需要,也无疑是我国单片式整机行业适应目前当今社会的工业智能化、自动化等新技术要求的重要发展趋势。可以识别黑色轨迹和障碍物,无需人工控制即可自动驾驶。此设计中完成的工作可帮助我们初步了解自动驾驶技术,并为自动驾驶技术提供合理可行的解决方案。
以探索者ATMEGA328P为主控模块,再结合信号检测和电机驱动等模块电路,实现循迹避障功能。通过这次设计,我深刻领会到把专业的理论知识与实际相结合的重要性。
2. 机器人本体技术路线说明
我们所说的智能小车事实上就属于机器人的一类。智能小车大体有信号检测、主控模块、电机驱动和机械零件四个部分组成。信号检测可以使用超声波传感器,在单片机的选择上主控芯片使用ATMEGA328P单片机,电机驱动部分选择驱动芯片来控制直流步进电动机,至于车轮的方案可以选用三轮或者四轮车,这样就大体上完成了本设计的要求。通过与软件编程配合,可以实现自动循迹和避障功能和测速的功能。
2.2 设计方案和主要模块的选用避障小车要实现的功能有:小车按照黑线进行循迹,当前方有障碍物时,可以报警,并且躲避障碍物,重新回到黑线上;当前方不需要循迹但仍有障碍物时,仍可以报警,并躲避障碍物。
系统的主控模块选择使用 探索者 ATMEGA328P,除此之外,还要有避障模块,报警模块,控制模块,以及电机驱动模块等组成。避障中的传感器检测到信号输出到 ATMEGA328P单片机,电机驱动模块改变电机的状态,实现智能行驶。为了更好地完成此设计任务,我们使用了三轮车,该三轮车由两个直流电机进行驱动,后面的万向轮调节方向从而调节后面个轮子的速度以启动和停止。其中,在同一侧的轮子的电机状态保持一致,达到控制转向的目的。由软件程序控制,并结合硬件体系结构,这样就实现了循迹和避障的功能。
2.2.2 主要模块的选择单片机具有很多的优点,比如单片机质量小,体积低,成本廉价,容易获取,方便人学习和进行开发。而且它的应用范围也很广泛,与智能化的联系十分紧密。随着科技和时代进步,单片机的种类和性能也逐渐强大起来,本次采用的单片机的选择也特别多。
备选一为STC89C52单片机,这款单片机是由国内的芯片公司所设计生产的典型芯片之一。
作者:唐金宇 李晓淞 黄茜 李博君
单位:辽宁工程技术大学
指导老师:李逃昌
作品说明
标准功能 | STC89C52 |
单片机序存储空间 | 8KB |
数据存储空间 | 512B |
EEPROM存储空间 | 内带4KB |
是否可以直接使用串口下载 | 可以 |
标准功能 | ATMEGA328P |
单片机核心处理器 | AVR |
闪存容量 | 32KB |
EEPROM存储空间 | 1KB |
接口类型 | I2C,SPI,USART |
工作电压 | 5V |
工作电流 | 15mA |
工作频率 | 40kHz |
最远射程 | 4m |
最近射程 | 2cm |
测量角度 | 15 度 |
输入触发信号 | 10uS 的 TTL 脉冲 |
输出回响信号 | 输出 TTL 电平信号 |
void setup() { analogWrite(5, 120);//设置引脚 PWM 输出为120 120 analogWrite(6, 0); analogWrite(9, 120); analogWrite(10, 0); } void loop() { if (((urm10.getDistanceCM(A1, A0))<=20)) {//读取超声波传感器距离 analogWrite(5, 0); analogWrite(6, 120); analogWrite(9, 0); analogWrite(10, 120); delay(600);//延时转弯 if (((urm10.getDistanceCM(7, 4))<=25)) { if (((urm10.getDistanceCM(A4, A5))<=25)) { analogWrite(5, 0); analogWrite(6, 120); analogWrite(9, 0); analogWrite(10, 120); delay(600); } else { analogWrite(5, 0); analogWrite(6, 120); analogWrite(9, 0); analogWrite(10, 0); delay(600); } } else { analogWrite(5, 0); analogWrite(6, 0); analogWrite(9, 0); analogWrite(10, 120); delay(600); } } else { analogWrite(5, 120); analogWrite(6, 0); analogWrite(9, 120); analogWrite(10, 0); } |
void setup() { analogWrite(6, 0); analogWrite(10, 0); } void loop() { while (!(analogRead(A0)>450)) {//设置光返回值为 450 analogWrite(5, 0);//设置引脚 PWM 输出为 0 analogWrite(9, 68); } while (!(analogRead(A2)>450)) { analogWrite(5, 68); analogWrite(9, 0); } analogWrite(5, 70); analogWrite(9, 70); } |
void setup() { } void loop() { digitalWrite(12, HIGH);//定义蜂鸣器引脚 } for (int index = 0; index < 8; index++) { DFTone.play(8, 880, 125);//改变蜂鸣器频率 } DFTone.play(8, 880, 0) |
// 主程序开始 void setup() { mind_n_a = 0; } void loop() { if ((mind_n_a==0)) {//定义引脚 a analogWrite(5, 135);//设置引脚 PWM 输出为 120 analogWrite(9, 90); analogWrite(6, 0); analogWrite(10, 0); if (((urm10.getDistanceCM(A1, A0))<=20)) {//读取超声波传感器距离 DFTone.play(8, 784, 500);//改变蜂鸣器频率 if (((urm10.getDistanceCM(7, 4))<=25)) { for (int index = 0; index < 2; index++) { DFTone.play(8, 784, 250); } if (((urm10.getDistanceCM(A5, A4))<=25)) { for (int index = 0; index < 3; index++) { DFTone.play(8, 784, 500); } analogWrite(5, 135);//设置引脚 PWM 输出为 135 analogWrite(10, 90); analogWrite(6, 0); analogWrite(9, 0); delay(700);//定义转角延时 } else { analogWrite(5, 0); analogWrite(10, 0); analogWrite(6, 0); analogWrite(9, 90); delay(700); } } else { analogWrite(9, 0); analogWrite(10, 0); analogWrite(6, 0); analogWrite(5, 135); delay(700); } } } if ((mind_n_a==1)) { while (!((urm10.getDistanceCM(A1, A0))<=10)) {//读取灰度传感器距离 while (!(analogRead(A2)>500)) { analogWrite(9, 0); analogWrite(5, 65); } while (!(analogRead(A3)>500)) { analogWrite(9, 50); analogWrite(5, 0); } analogWrite(5, 75); analogWrite(6, 0); analogWrite(9, 50); analogWrite(10, 0); if ((digitalRead(3) && (mind_n_a==1))) { delay(20); if (digitalRead(3)) { mind_n_a = 0; delay(200); } } A0))<20))) { if ((((urm10.getDistanceCM(A1, A0))>15) && ((urm10.getDistanceCM(A1, DFTone.play(8, 220, 500); while (!(analogRead(A2)>500)) { analogWrite(9, 0); analogWrite(5, 65); } while (!(analogRead(A3)>500)) { analogWrite(9, 50); analogWrite(5, 0);
} analogWrite(5, 75); analogWrite(6, 0); analogWrite(9, 50); analogWrite(10, 0); if ((digitalRead(3) && (mind_n_a==1))) ( delay(20); if (digitalRead(3)) { mind_n_a = 0; delay(200); } } } A0))<15))) { if ((((urm10.getDistanceCM(A1, A0))>10) && ((urm10.getDistanceCM(A1, DFTone.play(8, 440, 250); while (!(analogRead(A2)>500)) { analogWrite(9, 0); analogWrite(5, 65); } while (!(analogRead(A3)>500)) { analogWrite(9, 50); analogWrite(5, 0); } analogWrite(5, 75); analogWrite(6, 0); analogWrite(9, 50); analogWrite(10, 0); if ((digitalRead(3) && (mind_n_a==1))) { delay(20); if (digitalRead(3)) { mind_n_a = 0; delay(200); } } } } analogWrite(5, 0); analogWrite(6, 0); analogWrite(9, 0); analogWrite(10, 0); for (int index = 0; index < 8; index++) { DFTone.play(8, 880, 125); } DFTone.play(8, 880, 0); analogWrite(5, 85); analogWrite(6, 0); analogWrite(9, 0); analogWrite(10, 0); delay(1800); analogWrite(5, 85); analogWrite(9, 60); delay(1000); analogWrite(5, 0); analogWrite(9, 65); delay(2200); while (!(analogRead(A2)<500)) { analogWrite(5, 73); analogWrite(9, 51); } while (!(analogRead(A3)>500)) { analogWrite(5, 70); analogWrite(9, 0); } } if ((digitalRead(3) && (mind_n_a==1))) { delay(20); if (digitalRead(3)) { mind_n_a = 0; delay(200); } } if ((digitalRead(3) && (mind_n_a==0))) { delay(20);//防抖 if (digitalRead(3)) { mind_n_a = 1; delay(200); } } } |
表1 STC89C52单片机的标准功能
这款单片机有 32 个 I/O 端接口,3 个定时器等结构,接在 5V 电源下,需要有时钟电路和复位电路才能正常工作。
备选二为ATMEGA328P单片机,其功能全面,但价格比52单片机贵一点。
本次设计采用的是 ATMEGA328P 单片机,与 STC89C52 单片机相比,其具有高性能、低功耗 AVR 的 8 位微控制器具有先进的 RISC 体系结构,高耐力非易失性内存段, 微控制器的特殊功能,上电复位和检测,内部校准的振荡器,外部和内部中断源。
② 电源模块电池的选择方案也有很多种,开始考虑用四节 1.5V 干电池,因为单片机在约为 5V 的电压下就可以正常使用。另外电机驱动器需要更高一点的电压来驱动直流电机以及增大 PWM 调速空间,所以采用 7.4V 直流锂电池使用的方案,不仅减轻了机身的重量, 而且携带方便,电压稳定,无需任何升压和降压处理,操作简单。
③ 电机驱动模块对于小车电动机的选择上,本设计决定使用可以在直流电压的驱动下,转速更稳定, 几乎不会发生变化,而且硬件电路相对容易的直流电动机。此外,直流电动机可以承受反复的冲击,并且在快速转弯或反复来回旋转时,对小车具有良好的适应性。就调速特性而言,直流电动机可轻松调节速度,并且速度范围宽。对于小车的行驶,可以很好地控制它。
本次设计所用到的电机驱动芯片是L9170 芯片,其特点为:微小的待机电流,小于2 μA,工作电压范围宽 3.0V-15V, 有紧急停止功能,有过热保护功能,有过流嵌流及短路保护功能。L9170 是一款 DC 双向马达驱动电路,它可以适用于玩具等类的电机驱动, 自动阀门电机驱动,电磁门锁驱动等。它有两个逻辑输入端子用来控制电机前进,后退及制动。该电路有很好的抗干扰性,微小的待机电流,低的输出内阻,同时还具有内置极管能释放感性负载的反向冲击电流。
④ 避障模块在智能小车避障中,运用的传感器更多的是红外传感器或者超声波传感器。超声波传感器是将超声波信号转换成其它能量信号的传感器。超声波具有频率高、波长短、绕射现象小,方向性好、能够成为射线而定向传播等特点。超声波对液体、固体的穿透本领很大。超声波碰到杂质或分界面会产生显著反射从而形成反射回波,碰到活动物体能产生多普勒效应。超声波传感器广泛应用在工业、国防、生物医学等方面。而红外线传感器是一种能够感应目标辐射的红外线,利用红外线的物理性质来进行测量的传感器。按探测机理可分成为光子探测器和热探测器。红外传感技术在现代科技、国防和工农业等领域应用广泛。
本产品在设计时采用超声波传感器进行避障,结合ATMEGA328P单片机达到检测障碍物的目的。若使用红外传感器,缺点是因为光具有穿透性,因此红外对管不能用来检测透明物体。而HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm。如下图所示:
超声波传感器
表3为超声波传感器的一些参数:
表3 超声波传感器的参数
在智能小车循迹中,可以选用光电传感器,利用黑白线对红外线反射能力的不同。然后通过光敏二极管或光敏三极管,接收反射回的不同光强信号,把不同光强转换为电流信号,最后通过电阻,然后转换为单片机可识别的高低电平。选用的是灰度传感器, 灰度传感器利用不同颜色的检测面对光的反射程度不同,光敏电阻对不同检测面返回的光其阻值也不同的原理进行颜色深浅检测。在环境光干扰不是很严重的情况下,用于区别黑色与其它颜色,它有比较宽的工作电压范围,在电源电压波动比较大的情况下仍能正常工作。它输出的是连续的模拟信号,因而能很容易地通过 A/D 转换器或简单的比较器实现对物体反射率的判断,是一种实用的机器人巡线传感器。下图所示为灰度传感器:
灰度传感器
本次设计中为了更好的检测到障碍物,选用了蜂鸣器,当超声波传感器检测到障碍物时,蜂鸣器报警。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器。本次我选用的是电磁式蜂鸣器,电磁式蜂鸣器是由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。蜂鸣器工作原理:I/O 口定时翻转电平驱动蜂鸣器方式。下图所示为蜂鸣报警器:
蜂鸣报警器
为了更好的控制两种模式的转换,我选用了一个按钮开关,当不按动按钮时,小车可以完成避障;当按下按钮时,小车可以完成循迹,当循迹路线有障碍物时,小车可以绕开障碍物,继续循迹。按钮开关是指利用按钮推动传动机构,使动触点与静触点按通或断开并实现电路换接的开关。按钮开关是一种结构简单,应用十分广泛的主令电器。在电气自动控制电路中,用于手动发出控制信号以控制接触器、继电器、电磁起动器等。
2.3 避障过程实现
利用超声波传感器检测前方是否有障碍物,当只检测到前方有障碍物时,蜂鸣器报警,小车向左转;当检测到前方与左面有障碍物时,小车向右转;当检测到前方与右面有障碍物时,小车左转。流程图如下所示:
避障过程流程图
避障程序如下:
循迹程序的设计首先要定义灰度传感器引脚,当左边的传感器检测到光线强度的返回值小于450 时,小车向左转;当右边传感器检测到光线强度返回值小于450时,小车向右转。从而达到小车沿着黑线循迹的效果。流程图如下所示:
循迹过程流程图
循迹程序如下:
2.5 报警程序实现
首先定义蜂鸣器引脚,当超声波传感器检测到障碍物时,引脚8为高电平,蜂鸣器报警。程序如下:
将小车的循迹和避障模块,电机驱动模块,单片机核心板,还有电池盒的接线焊接以及连接完成以后,开始进行系统的组装。首先组装亚克力板材料的底盘以及车轮,同时,把两个个直流电机与两个车轮相连。避障传感器平行放置在小车底盘上的最前面, 小车的前面,左面与右面安装三个超声波传感器,中间则放置电池盒,小车的后面放置单片机核心板,小车的右后方放置蜂鸣报警器,在小车的左后方放置开关,这样可以平衡底盘上的重量。
3.2 系统的硬件部分调试在系统各模块的连接和组装完成以后,然后进行系统的硬件部分调试。系统的硬件部分调试主要是对单片机的最小系统中复位电路和时钟电路是否正常工作进行调试。还有就是循迹模块和避障模块输出端与单片机的输入引脚相连,电机驱动模块的输入端与单片机的输出端引脚相连,电机驱动模块的输入端与直流电机相连,这些互相连接的位置是否出现引脚没有对应等情况。
将万用表的档位旋至欧姆档进行测量每一条连接线,检查连接线是否有上述提到的问题。如果万用表显示的测量值很小,说明这条线路没有问题。如果显示的测量值很大, 说明这条线路出现虚焊或者断路的情况,需要重新连接这条导线。对于单片机最小系统中时钟电路的检查主要是在给单片机通上电时,将万用表的档位更换,检测反相放大器的输入端引脚和输出端引脚的电压是否正常。对于单片机最小系统中复位电路的检查主要是当单片机正常运行的时候,RST 引脚的电压应该为低电平。而且当按下复位开关按钮的时候,RST 引脚的电压应该为高电平。
3.3 系统的软件部分调试系统的软件部分调试主要是对程序代码的正确编译以及将编译好的程序代码烧入到单片机的芯片中去。打开软件并新建工程。然后选择单片机的型号,之后新建程序编辑完保存,后用 USB 连接电脑与小车,然后进行烧录,如果上传成功,小车按照程序运行,那么程序代码编译就没有问题。
3.4 系统的调试结果和问题本系统在调试小车循迹和避障功能时,本系统最初选用了四节1.5V干电池作为供电模块,理论上符合各元器件和模块的电压范围,但是在实际调试过程中发现,小车行驶时不够顺滑,考虑到原因可能是电池供电时电压不够稳定,改用与其电压相仿的7.4V锂电池以后,这个问题得到了显著的改善解决。
由于电动机转速存在误差,导致小车不能跑直线,由于这个误差无法避免,所以只能多次更改 PWM 以达到电动机转速接近。
3.5 实物显示实物展示图
实物展示底部图
在本次设计中主要完成了以下几方面:
① 分析了系统的设计方案,并对方案进行了论证,将系统设计分为控制模块、外避障模块、驱动模块、循迹模块等。
② 对系统的各个硬件进行了介绍,对硬件原理进行分析,作出了相应的主电路图和控制电路图。
③ 进行了系统的软件设计,根据软件的控制流程图在编程软件中进行梯形图的编写,编写相应程序,进行相关参数设置。
④ 对整个控制系统进行了调试,制作出了小车实物。
5. 示例程序
* 本项目未获得作者开源授权,无法提供资料下载。