||
AVR机器人编程
自从接触车型机器人以来,现在再用AVR 学机器人编程,感觉以前好多东西没注意到。以前玩宝贝车是用AT89S52 做主控芯片,模块是现成的,编程调试都顺风顺水,哪怕出错也是些小问题,现在自己搭外围电路,好多以前没注意的问题马上就出来了,不过虽然一路坎坷,可喜的是最终还是顺利完成了任务。
第一次课,老师详细介绍了下鸥鹏公司车型机器人上的主控芯片及其外围器件的使用,然后开始进入AVR单片机编程。老师首先介绍的是Make File 文件的创建和程序目标文件的烧写,紧接着开始讲编写程序时头文件的包含,头文件里各种功能函数的调用以及简单介绍了程序编写的注意事项和如何编写自己的功能函数也即子函数来精简程序。到了实践动手阶段,则布置了用函数调用和使用数组的方法实现机器人走正方形的任务。任务要求比较简单,单纯的就是使用子函数调用以及使用数组的方法实现小车直走、拐弯、直走..回到起点停止。咋一看任务很简单,可实际走起来才发现不是那么一回事。我们都知道,理想的情况下两个轮子的转速保持一致时,走出来路径是标准的直线,可现实中,这种情况发生的概率几乎为零,不管舵机调零还是程序校正都无法避免两个轮子的转速有差异,也就是说小车实际跑的时候我们要不断的进行角度校正,否者它就会跑偏,走得距离越长,偏的越明显,哪怕你刚开始跑得很正。跑直线的问题解决后,接下来我们要考虑的是小车转弯,小车转弯有两种方式,一种是绕轴转,另一种是绕定点转。所谓的绕定点转就是一个轮子不动,另一个轮子转实现转弯,这种方式转弯的幅度大,角度到位,不过虽然稳,但它抖动的厉害,不够灵活。而绕轴转则是两个轮子同时顺或逆时针转动实现拐弯,这种转法动作幅度小,够稳,虽然角度转的不够正,但它在小空间内活动很是灵活。转弯的问题也解决后,再把这些想法用编程实现,整合成一个能让小车走一段距离后左拐或右拐的子函数,当然里面还要包含小车不断校正的代码段,然后在主函数里调用该子函数四次后停止,任务完成。下面是在小车实际场地跑的视频:
经过前面跑AVR机器人的热身,慢慢的又找回当初调试小车的状态,接下来又到了再次上课的时间,这次讲课的内容是利用I/O口实现机器人的触觉导航。所谓的触觉导航就是给它搭建外围电路用于探测外界环境实现避障。而这次实现避障功能用的是触须,机器人的触须起源猫的胡须,猫抓老鼠时敏捷的身影很大一部分归功于它的胡须,它利用胡子判断自己的身躯是否能通过狭窄的通道和夹缝。而机器人利用触须避障基本上也是这个原理。完成这些要求我们首先要给机器人安装弹性较好的触须,触须与主控板上的地直接相连,触须自然伸张宽度微大于车身的最大宽度,然后在小车自带的面包板上插入两个三脚排针,排针分别连接相应的I/O引脚。当小车在行走过程中碰壁时,触须受压与排针接触,这样就相当于把与排针直接相连的I/O引脚电位置低,主控芯片检测到某个引脚状态反转后,便会执行相应的代码段,如左边触须碰壁,则小车执行向右转绕开障碍物。讲完这些基础性原理后,老师开始布置任务,任务是小车在行走时先走出一段'U'形,以检测小车的避障功能,然后自己跑,自主避开后面的障碍物,到达出口结束。任务要求是换掉障碍物的摆放位置后小车仍旧能到达出口。下面是完成该任务的视频:
视频1
视频2
完成机器人触须导航后,接下来进入光敏电阻导航章节。和触须导航的不同之处是光敏电阻很难实现避障,它的主要作用是循迹跑固定路线。光敏电阻顾名思义就是这种电阻对光线敏感,它的阻值随入射光线强弱的变化而变化,在光照射条件下,它的光电阻(简称亮阻)仅有几百至数千欧姆,而在黑暗状况下,它的暗电阻(简称暗阻)可达1~10M欧。那么,如果利用白色物质反射一切光线,而黑色物质吸收所有光线的原理,我们在小车两侧各搭建一组向下的光线探测模块,让小车在贴有黑色电工胶布的跑道上行走,跑道宽度要小于光线模块探测头的直线距离,当小车左边探测头没有检测到光线,说明探测头探测到的地方的黑色电工胶布做成的跑道范围,小车偏离轨道,这时编程让小车小角度右转,直到探测头再次检测到光线,右边探测头参照左边,这样我们便实现了小车按固定路线行走的功能。而这次的任务是编程实现小车在正方形和圆形的跑道上行走,要求是顺或逆时针都能回到原点。用光敏电阻做循迹电路比较难调试的地方就是其灵敏度的调节,首先光敏电阻得给它固定好,不然小车运动时会有较大的晃动,对检测有不小的干扰,光敏电阻离地面的距离不宜太高也不能太低,高了外界光线的影响大,低了过于灵敏,一个人影的晃动都会让它误认为是检测到黑色电工胶,导致错误。下面是小车在实际场地跑的视频:
视频1
视频2
AVR 一共三周的课程,现在进入最后一周,接下来的15节,我们将进入红外导航章节。
红外导航,其利用的原理跟光敏及触须导航的方法从一定的角度上来说是相通的,比如红外循迹和光敏电阻一样都是利用对检测光线来达到循迹的目的。黑色物质吸收光线包括红外,白色物质则是反射,我们只要利用一个红外发射管和一个红外接收头以及相关电子原件搭建一组红外模块,通过主控芯片为红外发射管提供一定频率的脉冲,使发射管向外界环境发射能让与其配对的红外接收管接收的频率的红外线,当发射的红外照射在非黑色物质上时,红外接收管接收到红外线,而红外线照射到黑色物质比如黑色的电工胶布时,红外被吸收,造成红外接收管没有接收到一定频率段上的红外线,这时相应的I/O引脚被置低,单片机执行相应的程序段,直到接收管再次检测到红外,这样便实现了红外循迹功能。而红外避障,我们只要让当红外接收管没有接收到红外时(说明前方没有障碍物)前进,当左边接收管接收到红外时小角度右转直到接收管接收不到红外(右边的接收管参照左边)再前进(当然还有两个接收管同时检测到红外的情况,这时让小车直接转180度的情况),这样就实现了红外避障。同一组红外模块,把发射管和接收管调整与地面平行,烧入相应的程序能实现红外避障,而把发射管和接收管调整到红外发射与接收方向与地面成一定角度则又成了红外循迹。在调试过程中要注意的是一般红外发射管正常状态下工作时是以散射的方式向周围发射红外,这样会让接收管做出错误的判断,以致程序跑飞,所以我们得对发射管进行相应的处理,一般这种情况的解决办法是用热缩管把发射管包起来,使红外只能向一个小圆点的方向发射红外。这次红外的任务是编程实现小车只能在用黑色电工胶布围起来的圆形区域内运动、在桌面上行走避开危险区域以及小车沿黑线运动。下面是小车在实地跑的视频:
视频1
视频2
可以看得出,导航不管是用光敏电阻还是红外,都能轻松实现循迹,不同的是用红外的话看起来更智能、高端上档次些,相比之下光敏电阻就是个土鳖。
视频3
到此,AVR机器人课程已经上完,本来还有一章是在小车运动时使用1602液晶显示小车的运动状态,比如小车左转时液晶上显示字符串“case:F”,第二行则显示字符串“Forward”,可是由于软件、硬件上各种问题,老师决定这一章仅了解便可,写完这篇博文,再上交实验报告册,AVR单片机课程完满结束。