• 2.83 MB
  • 2022-04-22 11:23:22 发布

智能小车毕业论文(1)--2015-05-28-2.docx

  • 52页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'专业:电子信息工程学号:0414110117HebeiNormalUniversityofScience&Technology本科毕业论文(设计)(自然科学)题目:智能玩具小车的控制系统设计院(系、部):机电工程学院学生姓名:吴博强指导教师:王枫职称讲师2015年05月24日河北科技师范学院教务处制 河北科技师范学院本科毕业论文(设计)智能玩具小车的控制系统设计院(系、部)名称:机电工程学院专业名称:电子信息工程学生姓名:吴博强学生学号:0414110117指导教师:王枫2015年05月24日河北科技师范学院教务处制 学术声明本人呈交的学位论文,是在导师的指导下,独立进行研究工作所取得的成果,所有数据、图片资料真实可靠。尽我所知,除文中已经注明引用的内容外,本学位论文的研究成果不包含他人享有著作权的内容。对本论文所涉及的研究工作做出贡献的其他个人和集体,均已在文中以明确的方式标明。本学位论文的知识产权归属于河北科技师范学院。本人签名:日期:指导教师签名:日期: 摘要机器人的研究是一项具有良好前景的科研项目,而智能小车的研究可以说是机器人研究的一个小入门。智能小车虽然功能不如机器人的强大,但是其所具备的功能一方面是机器人的基本功能或基础原理,另一方面又有很大的发展空间。通过对智能小车的深入研究,也能为机器人的发展助一臂之力。本次设计的智能小车主要是基于52单片机实现自动循迹、避障和无线操控功能,这三个功能是一个智能小车应具备的基本功能。对每个功能的实现分别依靠TCRT5000传感器、超声波传感器和nRF24L01+无线模块实现。这些模块收到的信号,由单片机进行处理后,控制驱动模块来实现对小车的控制。本次设计制作出的小车能够很好地完成这些功能,达到了设计的要求。且可通过无线操控在小车的行进过程中进行不同工作模式的切换,这使小车的行动更加灵活。更能在遇到突发状况时,能够继续正常工作或避免损坏,增强了小车的可靠性。关键词:智能小车;单片机;TCRT5000传感器;超声波传感器;nRF24L01+AbstractTheresearchofrobotisapromisingresearchproject.Andtheresearchofsmartcarcanbesidetoberudimentsofrobot.Throughin-depthstudyofthesmartcar,alsocanhelpweresearchtherobot.Thedesignofintelligentcarismainlybasedon52’smicrocontrollertorealizeautomatictrackingandobstacleavoidanceandwirelesscontrolfunction,thesethreefunctionsisasmartcarshouldhavethebasicfunctions.ToachievethefunctionsofeacharedependedontheTCRT5000sensor,ultrasonicsensorandnRF24L01+wirelessmodule.Thesemodulesreceivesignal,thensendtomicrocontroller.Microcontrollerprocessthesignal,tocontroldrivemoduletorealizethecontrolofthecar.Madeoutofthecarisabletocompletethesefunctions,meetthedesignrequirements.Andthroughwirelesscontrolinthecarintheprocessofmovingtodifferentworkmodeswitch,whichmakesthecarmoreflexible.Moreinthefaceofunexpectedsituations,thecarcancontinuetoworkortoavoiddamage.Itenhancesthereliabilityofthecar.Keywords:smartcar;microcontroller;TCRT5000sensor;ultrasonicsensor;nRF24L01+ 目录目录摘要IAbstractI目录II1绪论11.1研究背景及意义11.2研究目的和设计构思12系统工作原理23硬件系统设计23.1供电模块设计与介绍23.1.1LM2576和LM2596介绍与应用方案23.1.27805芯片介绍与应用方案53.2驱动模块介绍63.3自动循迹传感器介绍83.4避障传感器介绍和选择103.5无线模块介绍和选择114软件系统设计134.1自动循迹程序设计134.2自动避障程序设计154.3无线操控程序设计175小车调试与制作21结论23参考文献24致谢24附录24II 河北科技师范学院2015届本科毕业设计1绪论1.1研究背景及意义随着科技的发展,尤其是计算机技术和网络技术的高速发展,使得智能化开始与各种产品进行融合,衍生出功能更加强大的新一代产品。其中无人驾驶成为了一项重要研究方向。目前,Apple已开始着手研究智能汽车iCar或AppleCar。其他公司也有相关方面的研究计划。在军事领域,无人机也一直是一项具有重要战略意义的研究项目。无论是智能汽车,还是无人机都是移动机器人中的一种[1]。而智能小车则是移动机器人研究的基础,所以智能小车的研究可以推动智能汽车和无人机的发展。而且智能小车一直被各大高校重视,其中飞思卡尔智能小车竞赛是智能小车研究中的一项重要赛事,且对智能小车技术的进步做出了巨大贡献。之所以说智能小车是移动机器人中的基础,是因为智能小车所能实现的功能是一个移动机器人都能完成也都应该具备的功能[2]。可以说机器人的强大功能都是在小车功能的基础上,进行更深入研究后实现的。而为机器人开发一个新的功能,也可以在小车上进行一定的测试,并且成本要比直接在机器人上开发的低。因此,目前继续深入研究智能小车,对于移动机器人乃至所有机器人研究工作有着重要意义。除此之外,智能小车也是一名电子专业大学生有能力掌握的电子技术。其难度适中,设计思路灵活,很适合用来测试大学生的电子技术。通过制作智能小车有助于巩固电子技术的基础知识,加强实践能力。1.2研究目的和设计构思此次设计的小车将要完成自动循迹、自动避障、无线操控功能,并能够在小车行进过程中进行功能的切换,即能通过遥控器实现小车的工作模式。这些功能使小车能完成更复杂的工作,具有更大的容错率。比如在自动循迹时,如果因车速过快,导致小车离开轨迹且不能自动重回轨迹时。可以使其切换到无线操控模式,通过人为操控使其重回轨道后,再切换为自动循迹模式继续循迹工作。再如当小车在自动避障过程中,如果突然在无效距离内出现障碍,也可同样利用无线操控其避开障碍后,再继续进行自动避障。这种人为操控方式加智能操控方式,在智能汽车和无人机上也采用如此方式,因此制作出的小车可以在一定的程度上模拟他们在工作时如何处理问题[3]。如汽车遇到信号灯时,需要一个交通网络或车主来控制车辆的行驶。设计的核心便是利用不同功能的感测器和无线收发模块,来提供信号或命令给单片47 河北科技师范学院2015届本科毕业设计机,由单片机处理后控制小车的移动或感测器的工作。通过利用不同的感测器可以使小车具备不同的功能,也可以使小车的功能更强、精度更高。不同的无线模块也可以使小车接收信号范围更远、通道更多。本次设计中使用的TCRT5000传感器、超声波传感器和nRF24L01+无线模块,性能上满足设计要求。且小车还留有一定的扩展空间,能添加新的或更换更好的感测器,提升小车的性能。2系统工作原理本设计使用52单片机作为核心处理器,通过外接循迹传感器、障碍感测器、无线收发模块,来给单片机提供信号。单片机接收到信号后,按照其内部程序进行信号识别并处理各种信号。之后控制电机所接电压的有无、大小和正负,实现对电机转速和转动方向的控制,从而控制小车的移动。通过编程使单片机知道应如何处理各传感器传输的信号,以及何时处理。对无线操控功能,使用两片单片机和两个无线收发模块。一片单片机和一个模块组装成遥控器,进行操控指令的发送。另一片单片机与无线模块安装在小车上,进行操控指令的接收,和对小车的控制。循迹传感器与障碍感测器,顾名思义是进行轨迹检测与障碍检测。分别服务于自动循迹功能和自动避障功能。单片机识别其传送的信号,来控制小车实现这两个功能。3硬件系统设计3.1供电模块设计与介绍首先,电源的选择有蓄电池和一般干电池。设计中用到的各种感测器、无线模块与单片机,均要求有4~5V的输入电压[4]。所以两种电源提供的电压,虽然大于电压要求,但可以通过变压后,得到符合电压范围的伏值。因此都可以使用。由于制作的无线操控时,需要再制作一个遥控器,因此需要两个电源。而在购买小车底板时,附带一个4节5号电池盒,且已拥有一个12V蓄电池。考虑到小车上不仅要给单片机供电,还需给各感测器、无线模块以及直流电机供电,因此在小车上用蓄电池供电,遥控器用4节干电池供电。3.1.1LM2576和LM2596介绍与应用方案选好供电电源后,还需要考虑的就是变压的问题。蓄电池的额定输出电压最大为12V,所以使用LM2576或LM2596芯片进行变压。LM2576可提供降压稳压功能,可47 河北科技师范学院2015届本科毕业设计驱动3A的负载,有优异的线性和负载调整能力。其输出电流可以为连续型或非连续型,这取决于选取的电感的直流通流量。LM2596是LM2576的升级版,加大了待机电流,增加了自我保护电路[5]。设计中分别使用了一片LM2576和LM2596。如此选择的原因有两个,第一、两种芯片的使用原理和方法相同,皆是通过连接为反馈电路,达到降压稳压效果。而且所使用的外接元件也相同且容易购买。因此使用任意一种芯片,没有太大的区别。第二、在使用之前,已有一片LM2576。而购买另一片时,价格低导致不能单独购买,所以只好购买做好的使用LM2596的降压稳压模块。使用的反馈电路原理相同,均是采用一个极性输入电容CIN,一个肖特基二极管,一个电感,一个极性输出电容COUT。构成如下电路:图1反馈电路图图中的CIN、L1和COUT可以使用不同的参数,但要根据情况进行选择。本次设计中,LM2576需要自己进行外接反馈电路。设计中,输入电压电压源为4节5号干电池,最大6V直流电压。输出电压要求为5V。所以CIN使用100μF,COUT使用470μF,L1使用100μH,R1使用1kΩ。其余元件参数与上图一致。并增加了一只六角开关和RF16700保险丝[6]。47 河北科技师范学院2015届本科毕业设计(a)正面(b)背面图2LM2576电路经测试,该电路可实现1到5.8V范围内的电压输出。调节后稳定在5V输出。另一模块如下图:47 河北科技师范学院2015届本科毕业设计图3LM2596降压模块该模块供电电源为蓄电池,使用时输出电压调节到6.2V。此电压不能直接给单片机和感测器供电,但可以给L298N驱动模块供电。给单片机供电还需经下述的7805芯片稳压。这就同时解决了单片机与L298N驱动模块的供电问题,7805芯片稳压后的电压还能给L298N的逻辑电平供电[7]。3.1.27805芯片介绍与应用方案7805内部电路具有过压保护、过流保护、过热保护功能。能够实现1A以上的输出电流,具有良好的温度系数,输出电压误差精度分为±3%和±5%。使用时连接电路如下:图47805电路图47 河北科技师范学院2015届本科毕业设计实际连接时,还应该在两片7805的VIN和VOUT的端分别连接一个瓷片电容,如102,104等。这是此次设计的一个失误。不过由于输入电压低——只有6.2V,所以经实际测试后发现也可以使用,不会对小车产生影响。VCC端接LM2596降压模块的输出电压,该电压值不能低于6V,不能高于36V。输出端将自动稳压到5V左右,实际检测其输出电压为4.97V,满足单片机与各模块的供电要求。两片7805中,一片单独给单片机供电,一片给各模块供电。这样做是因为单片机对电压的稳定性要求高,而所接模块较多[8]。如果只用一片7805,会使7805的负载过重,热量升高。进而导致稳压性能变坏,甚至造成7805芯片的损坏。下图为实际焊接电路,该图拍摄时还未添加电源开关。添加的开关位于两片7805中间,没有拍摄是因为已经固定在小车上,不便于拍摄。电路板左上方左起第一根排针为左方7805的输出端,单独为单片机供电。第四根排针为电压输入端,第五和第六根排针为GND端。下方左起前四根排针为GND端,后八根排针为右方7805的输出端,为各个感测器供电。剩余排针未接通,没有使用意义。图57805稳压电路板以上便完成了电源供电设计。实际测试证明得到的电压稳定,能满足单片机及其余元器件的电压要求。3.2驱动模块介绍小车车体的设计要求使用左右两个电机驱动,外加一个后万向轮,形成三点结构,以稳定小车的行驶。电机有直流电机与步进电机两种选择。步进电机是通过对各相绕组按合适的时序通电,控制电机步进转动。可以利用单片机的定时功能,或外接定时设备,对供电时序经行控制,从而达到控制步进电机的转速。如此方法,能精确地控制小车的速度,以及转弯时的角度。但是步进电机比直流电机的价格昂贵,且编程难度大。此次设计中,对小车的行驶速度与转弯角度没有高精度要求,所以采用直流电机进行驱动。47 河北科技师范学院2015届本科毕业设计使用直流电机驱动时,需要利用减速齿轮按一定的减速比减速后,才可以作为小车的驱动电机。否则,会因小车的速度过快,导致单片机来不及处理接收到的信号,失去对小车的控制。另外小车的运动方向,需要利用电机的不同转速和转向来实现。因此须利用L298N驱动模块来实现对电机的控制。L298N驱动模块是依靠L298N芯片来实现对电机的控制。L298N芯片内部核心是一个双H桥,如下图所示:图6H桥电路原理图当Q1和Q4导通时,电机顺时针转动;当Q2和Q3导通时,电机逆时针转动。在L298N中,有两个如此的H桥,分别控制两个电机。其中每一个H桥的Q1和Q4的基极相连接,Q2和Q3的基极相连。发射极正极与驱动电压相连,负极与GND相连。L298N中除须连接一个驱动电压外,还须连接一个逻辑电压。单片机就是负责控制各基极的电平,来实现对电机转动的控制。L298N还有两个使能端,分别控制H桥的开启。利用L298N控制电机转速,就是利用PWM时序脉冲控制使能端开启的时间,达到控制电机导通的时间,进而实现了控制电机的转速。L298N在使用时会产生大量的热量,因此还需要使用散热片进行散热。将电机连接在驱动模块上后,便可以按照前述进行对电机的控制。实际测试表明该模块能及时地进行H桥导通方向的切换,对两个使能端的PWM脉冲控制能明显地控制电机转速。下图为所购买的L298N驱动模块:47 河北科技师范学院2015届本科毕业设计图7L298N驱动模块控制方式如下表所示:表1驱动控制表ENAINA1INA2电机状态0XX停止100制动110前进101后退111制动3.3自动循迹传感器介绍自动循迹功能的实现时依靠TCRT5000光电传感器来实现。设计要求是小车能自行识别一个环形黑色轨迹并沿着轨迹移动,且能在循迹过程中进行无线操控,切换小车的运行模式。关于无线操控部分,将在无线操控功能设计时进行说明,现在先说明自动循迹功能的设计方案。本人购买的用于循迹功能的感测器为一路循迹传感器,如下图所示:47 河北科技师范学院2015届本科毕业设计图8循迹传感器其三根引脚分别是OUT、VCC、GND。当传感器检测到黑色轨迹时,OUT端输出低电平,其余颜色轨迹,OUT端输出高电平。如果传感器因高度无法进行检测时,OUT端输出低电平。该模块核心是利用TCRT5000实现对轨迹的检测。TCRT5000工作原理是通过红外发射二极管发射红外线,当红外线遇到黑色轨迹时,由于黑色会吸收所有光线。导致红外线没有返射足够的强度给光敏三极管,光敏三极管便处于关闭状态,于是输出为低电平[5]。而当轨迹远离传感器时,也会导致红外线无法反射回来,使传感器输出低电平。下图为该模块的电路原理图:图9循迹模块电路图该模块缺点是不能调节检测距离,其固定检测距离为1cm左右。设计一共使用4个该循迹模块,分为前后两排,一排两个对称安装。前排靠内,后排靠外。这是使前排确定轨迹的最大宽度——测量为5cm——并提前检测到小车是否驶出轨迹。后排是预防因小车速度过快,导致前排来不及检测小车驶出轨迹。是一种增加循迹可靠性的方案。47 河北科技师范学院2015届本科毕业设计3.4避障传感器介绍和选择对于自动避障功能设计,有红外避障方案和超声波避障方案两种选择。对于红外避障方案,购买到的YS-29红外避障模块,具有易编程、易调节检测距离的特性。但是考虑到,红外线在实际中容易受到环境光线强度的影响,且大多数障碍物表面不光滑,会产生漫反射现象。这些都将影响检测的稳定性和可靠性。最重要的是,该模块不是利用编程来控制避障距离,而是通过调节电位器来控制检测距离。而其检测距离就是避障距离。这也就意味着不能通过该模块,来实时检测距离,影响了小车功能的扩展性。所以最终采用超声波避障方案。超声波避障方案与红外避障方案相比较,其优点是能进行实时检测障碍物到小车的距离,可将避障功能扩展成测距功能和避障功能于一体,以满足更多工作需求。但是考虑到负载过多,不能再外接1602或数码管显示所测距离,所以小车检测到的距离数据没有显示。测距功能只能为避障服务,不能满足其余工作需求。超声波的反射也比红外线稳定,能增强自动避障的稳定性。而其缺点则是不能应对在2cm内突然出现的障碍,容易受到温度的影响,导致检测的距离不如红外线的精确。障碍物受测面要尽量平整,否则会影响测距效果。下图分别是所购买的红外模块和超声波模块。图11红外避障模块47 河北科技师范学院2015届本科毕业设计(a)正面(b)背面图12超声波避障模块超声波避障模块上有一个发射口和一个接收口,其检测原理是通过按一定的时间间隔发送一个超声波,当超声波遇到障碍物时,便会反射回来,由接收口接收返回的超声波。这时接收端的输出就会由高电平变为低电平。而从发送超声波开始,到检测到接收端变为低电平的这段时间,就是超声波从小车开始,移动到障碍物的并返回到小车的往返时间。也就是一次测距的时间。进过如下公式计算,就可得到小车到障碍物的距离[9]。(1)公式中的声速,通常使用声音在空气中的传播速度340ms来计算。实际上在超声波往返于小车和障碍物间时,小车处于移动状态的。所以为了避免因小车的移动造成的误差,要控制小车保持低速行驶,使声波的速度远大于车速,就可以忽略小车移动的影响。而且低速行驶也能在前方障碍物,没有被检测到时,减低碰撞时的冲击力,避免小车的损坏。3.5无线模块介绍和选择无线功能是本次设计的核心功能,其余的功能都需要利用无线来进行切换。无线操控功能在设计时,也有两种方案。一种是使用网上已调制好的遥控设备,另一种是使用NRF24L01+模块。已做好的遥控设备,使用简单。但不可以对其按键进行编程,也就是说起按键功能固定,导致无线功能扩展受限。而且此种方式接收端只能接收,发送端只能发送,两者不能相互通信。所以决定采用NRF24L01+模块设计无线功能。NRF24L01+模块具有功耗低、抗干扰性高的特点。且发送时会自动添加CRC校验码与字头,接收时会自动去掉。发送时,先将数据送人收发队列,再高速发送。如此可47 河北科技师范学院2015届本科毕业设计以节能、降低系统费用、增加抗干扰性[10]。在使用NRF24L0+时,还购买了一块转接模块。该转接模块提供一个降压稳压功能,将5V降压到3.3V左右,再给NRF24L01+供电。对于无线模块程序的设计,主要是调用模块配送的收发程序来实现设计要求,而不是设计全部程序。有关该模块的配置程序与收发程序,购买模块时会由商家提供,网上也有不少现成程序,可以直接调用。在各程序代码中也有详细的注释说明,因此不在论文中提及,相关内容可见附录中的小车整体代码。而在本文中重点说明设计的思路,和调用程序段的目的。下面是NRF24L01+与转接模块的实物图。图14NRF24L01+模块图15无线转接模块4软件系统设计4.1自动循迹程序设计程序设计流程图如下:47 河北科技师范学院2015届本科毕业设计图10循迹程序流程图循迹模式启动后,小车便会一直沿着轨迹行进,直到无线操控切换小车工作模式。对于特殊的十字交叉轨迹,小车将保持直行。如果轨迹上出现障碍,则可以切换小车为无线操控模式,避开障碍并回到轨迹后,再切换为循迹模式继续工作。小车自动循迹功能的实现如上面的流程图所示。当左边的传感器输出低电平时,表明小车的左方过界,即小车如继续行驶将驶离轨迹。而要避免此情况发生,此时需要进行左转。左转时,控制左轮减速行驶,右轮速度不变,便可完成左转。控制左轮减速是通过对左轮的H桥,进行PWM脉冲控制实现。同理当右传感器输出低电平时,实现小车的右转。对于十字交叉轨迹,会使小车的左右传感器同时输出低电平,此时保持小车行驶路线就可以通过该轨迹。下面是自动循迹的循迹部分代码。INA1=1;INA2=0;INB1=1;INB2=0;for(i=0;i<200;i++)47 河北科技师范学院2015届本科毕业设计{delay(15);ENA=~ENA;ENB=~ENB;if(!INTERTRAL&&!INTERTRAR&&!EXTERTRAL&&!EXTERTRAR){continue;}if(INTERTRAL==0||EXTERTRAL==0)Left();if(INTERTRAR==0||EXTERTRAR==0)Right();}代码中的INTERTRAL为左前方传感器输出端,INTERTRAR为右前方传感器输出端,EXTERTRAL为左后方传感器输出端,EXTERTRAR为右后方传感器输出端。第一个if检测十字交叉轨迹,当同时输出低电平时,保持小车的行进方向。第二个if检测左传感器输出,第三个if检测右传感器输出。由于小车的速度较快,所以使用PWM进行减速控制。调用的Left函数和Right函数分别为左转函数和右转函数。由于左转和右转使用PWM控制,需要在一个死循环中执行,所以对左转函数和右转函数分别添加了如下代码:if(Mode_Flag==2&&(INTERTRAR==0||EXTERTRAR==0)){P2=0x00;delay(100);return;}if(Mode_Flag==2&&(INTERTRAL==0||EXTERTRAL==0)){P2=0x00;delay(100);return;}前两行代码是左转函数的,后两行是右转函数的。Mode_Flag是工作模式标志。Mode_Flag=2表示工作模式为自动循迹模式。第一个if语句判定工作模式为自动循迹模式,并且检测右传感器输出是否为0。如果是,则将P2口置零[11]。这是因为驱动模块的控制端与P2口相连,P2口置零后使小车停止运动。经过延时后,返回到自动循迹函数,此时右传感器依然输出低电平,小车便会右转。这一设置便避免了左转过多,导致小车右边出界,而原地停止一段时间,能让小车有时间判断下一步如何行驶。第二个if语句与第一个if语句相同,只是检测的是左传感器的输出电平。该方法的缺点是转弯角度固定,当轨迹的弧度与转弯角度差别较大时,小车的循迹会不太稳定。行驶时容易摇摆不定。要解决该问题,则应使用步进电机,并添加测速模块,形成一个闭环控速系统。但本次设计因成本和编程问题没有采取该方案,所以小车在循迹时有可能要根据不同弧度的轨迹,进行重新编程来控制PWM脉冲的时序,进而47 河北科技师范学院2015届本科毕业设计控制转弯角度。以实现在任意轨迹上的稳定循迹能力,这是设计中的一个缺陷[12]。4.2自动避障程序设计下面是程序的设计流程图:图13避障程序设计流程图自动避障与自动循迹一样,需要受到无线控制,能切换为其他工作模式。流程中检测循迹传感器输出,是考虑到在避障过程中,除了要检测前方是否有障碍外,还需要检测路面的高低落差是否过大。由于购买的循迹传感器,检测距离固定为1cm左右,所以循迹传感器离地面非常低。这也就意味着小车行进时,前方路面不能有高低落差。而当出现高低落差时,传感器会因距离远而输出低电平,因此可以用来检测前方路面是否有高低落差[13]。考虑到小车的行驶速度,只要前排或后排的传感器都输出低电平,就停止小车的行进,并退出自动避障模式,由人为手段处理该状况。之所以没有在检测到该情况时,让小车自动避开前方的高低落差路面。是因为此时小车以处于路面的边缘,如果原地旋转90度,虽然能够避开,但也存在小车旋转时产47 河北科技师范学院2015届本科毕业设计生位移,从而掉落的可能。有些情况不会有太大的影响,但有时会造成小车的损毁,而这是由前方高低落差大小决定的。但是小车的循迹传感器不能调节检测距离,所以不能区分前方的高低落差大小,因此只好在出现高低落差时,强制停止小车并退出避障模式。在前两中情形没有发生时,小车的避障模式采取简单的检测前方是否有障碍,障碍物与小车的距离是否在避障距离内。如果是,则让小车右转90度来躲避障碍,并重新检测新方向上的障碍。否则小车继续直行。下面是其部分代码的说明。if((INTERTRAL==0&&INTERTRAR==0)||(EXTERTRAL==0&&EXTERTRAR==0)){P2=0X00;return;}INA1=1;INA2=0;INB1=1;INB2=0;for(i=0;i<200;i++){if((INTERTRAL==0&&INTERTRAR==0)||(EXTERTRAL==0&&EXTERTRAR==0)){P2=0X00;return;}delay(20);ENA=~ENA;ENB=~ENB;if(distance<=12&&distance>0){P2=0x00;Right90();delay_ms(100);}}小车进入避障模式后,用第一个if语句是检测是否可以在当前位置开启自动避障功能,不能则退出自动避障模式。之后的for循环是PWM控制,并在其中进行检测前方高低落差检测与障碍检测。其中distance变量储存测量的距离,单位是厘米,当其不大于12时。表明小车到障碍的距离小于12cm,此时进行右转90度处理。之后的延迟100ms,是由于超声波的发送不能是连续的,需要一定的时间间隔。本模块的推荐是每60ms发送一个10μs以上的超声波,所以延迟100ms等待新方向的测距。而右转90度后小车会进入制动状态,如此在等待新一轮测距时,也不会因小车移动,使其与障碍的距离不足2cm——超声波最小有效距离——而导致无法自动避障。超声波的发送与距离的测量,使用了单片机的定时器0和定时器1进行时序控制。其中定时器0工作模式为方式1,用于测量超声波的往返时间。定时器1工作模式也为方式1,用于定时60ms发送超声波。下面是超声波测距程序说明:voidmeter_distance(){Trig=1;47 河北科技师范学院2015届本科毕业设计delay_ms(12);Trig=0;while(!Echo);TR0=1;while(Echo);TR0=0;distance=TH0*256+TL0;TH0=0;TL0=0;distance=distance/53;}其中的Trig是超声波发送端,通过给其高电平进行发送。代码中发送一个12μs的超声波。发送完成后开始计时,通过检测Echo端——超声波接收端,当超声波发送完成后会自动置为高电平——来判断超声波是否返回。返回后Echo将会变为低电平,此时停止计时,得到的就是超声波的往返时间。将该时间除以53就能得到小车与障碍的距离。这里运用了公式(1),计算过程如下:(2)其中时间单位为s,长度单位为m,速度单位为m/s。经过公式2的换算后得到时间t(s)=0.0053*s(m),即s(cm)=t(μs)/53。所以distance(μs)除以53后便得到距离(cm)。定时器0计时后清零,并当计时溢出后,进入定时中断将Echo端置为低电平。这是防止距离过远,导致Echo端一直处于高电平状态,影响后续的测量效果。4.3无线操控程序设计程序设计流程图:47 河北科技师范学院2015届本科毕业设计图16无线接收流程图图17发送程序流程图设计中发送端采取自动重发机制,当接收端没有按时传回应答信号时,发送端便会重发之前的命令。发送端还外接一个4×4键盘,键盘扫描程序来自单片机100例。当有按键按下,扫描出是第几个按键,然后发送对应的命令[14]。每次发送前,将会清空收发队列,以免有以前未发送命令还存在队列中,干扰当前命令的发送。接收函数在每一个功能函数中都要调用,以此来切换工作模式。特别地在左转函数47 河北科技师范学院2015届本科毕业设计与右转函数中也要调用。上文已说明这两个函数是如何实现左右转的,而该实现使用了一个死循环。当小车工作于无线操控模式时,需要在左右转时也能接受新的命令并执行。这就必须在这两个函数中调用接收函数,以使其在收到新的命令时,能够退出函数并执行当前命令。下面将说明部分代码。intI=-1;inerDelay_us(100);init_io();//初始化NRF24L01+的IOTX_Mode();//配置发送模式SPI_RW_Reg(WRITE_REG+STATUS,0xff);//清空状态为SPI_RW_Reg(FLUSH_TX,0xff);//清空收发队列while(1){i=Keys_Scan();//按键扫描,返回按键的编号if(i!=-1&&i<10){SPI_RW(FLUSH_TX);nRF24L01_TxPacket(TX_BUF[i]);while(IRQ);sta=SPI_Read_Data(STATUS);//读取状态信息while(!TX_DS){if(MAX_RT){SPI_RW_Reg(FLUSH_TX,0xff);break;}sta=SPI_Read_Data(STATUS);}SPI_RW_Reg(WRITE_REG+STATUS,sta);//清除TX_DS或MAX_RT标志SPI_RW_Reg(FLUSH_TX,0xff);IRQ=1;delay_ms(20000);i=-1;}}因为一共设置了10个命令,按键编号重0开始,所以第一个if语句检测i是否小于10。发送完一个命令后,IRQ会由高电平变为低电平,所以检测IRQ就可以知道命令是否发送完毕。之后读取芯片状态信息,检测TX_DS位,当接收端发送回应答信号后,该位会从低电平变为高电平,便可以发送下一条命令。在接收到应答信号前,每隔4086μs重发一次该命令。最大重发5次,超过后,会产生MAX_RT中断,即MAX_RT变为高电平。此时将清空收发队列,跳出应答检测循环,清除TX_DS或MAX_RT标志后,就可以发送新命令了。47 河北科技师范学院2015届本科毕业设计UCHARRX_BUF;RX_Mode();while(1){flag=nRF24L01_RxPacket(&RX_BUF);//接收命令至RX_BUF并返回1sta=SPI_Read_Data(STATUS);if(flag==1){switch(RX_BUF){caseSTOP:INA1=0;INA2=0;INB1=0;INB2=0;break;caseFRONT:INA1=1;INA2=0;INB1=1;INB2=0;ENA=1;ENB=1;break;caseBACK:INA1=0;INA2=1;INB1=0;INB2=1;ENA=1;ENB=1;break;caseLEFT:Left();break;caseRIGHT:Right();break;caseLEFT_90:Left90();break;caseRIGHT_90:Right90();break;caseMODE2:P2=0x00;Mode_Flag=2;return;caseMODE3:P2=0x00;Mode_Flag=3;return;default:P2=P2;}}SPI_RW_Reg(WRITE_REG+STATUS,sta);delay_ms(20);RX_Mode();//配置接收模式}接收模式主要是接收命令后,识别该命令并根据命令控制小车移动。其中各命令与发送端配置的命令内容相同。接收端的主函数主要是进行模式切换,如下是主函数的主要操作:switch(RX_BUF){caseMODE1:Mode_Flag=1;WifiControl();break;caseMODE2:Mode_Flag=2;AutoTrace();break;caseMODE3:Mode_Flag=3;AutoAvoidObstacle();break;default:P2=P2;}MODE1为无线操控模式,MODE2为自动循迹模式,MODE3为自动避障模式。调用的函数便是个模式的功能函数,如此实现工作模式的切换。代码中相关的无线配置见附录中的完整代码[15]。47 河北科技师范学院2015届本科毕业设计5小车调试与制作小车的硬件制作简单,因为使用的都是购买的模块,只需按照程序设定的接口进行接线即可。接线完后利用小车底板上的螺纹孔,将单片机与各模块固定在小车上就完成了小车实物的制作。下图是做好的小车和遥控器。图18小车实物图图19遥控器实物图调试时主要调试PWM脉冲的控制,和左右转90度时的延时长度。循迹传感器和障碍感测器的调试,实际上也是调节转动的角度,而这就是由上述两个主要调试项目来完成。虽然避障距离应该也是重要调试项,但因为没有显示模块,使用时也不能知道当前小车与障碍的距离。所以没有进行避障距离的调试,而是主要调试前述两个项目。无线模块由于使用软件复用技术,所以只需将代码烧录入单片机,就可以使用无线收发功能,不用进行调试。下面是调试好的PWM代码。for(i=0;i<200;i++)47 河北科技师范学院2015届本科毕业设计{delay(15);ENA=~ENA;}调试时,通过调节延时函数的输入值就可以了。这是实现右转的PWM,实现左转的PWM代码,只需将ENA改为ENB就可以了。减速是同时加上ENA和ENB就可实现减速操作。由于小车没有测速功能,无法得到速度值,只能凭借观察小车的转动角度来调节,不是太精确。上述PWM控制小车的转动角度大致为45度。左右转90度的调节,是控制小车左右轮相互反向转动时间,来达到90度的旋转。实际使用还要考虑地面与小车的摩擦力,对不同路面时间长短不同,越光滑时间越短。调试时的地面为普通地板砖表面,下面是左转90度代码。voidLeft90(void){ENA=1;ENB=1;INA1=1;INA2=0;INB1=0;INB2=1;delay(150);P2=0x00;}经反复调试,观察发现延时函数输入150时,能达到接近90度的转动角度。右转时也同样如此。如此便完成对小车的调试。实际使用时,对于不同弧度的轨迹,如需要小车稳定地循迹,还须重新对PWM代码内的延时函数进行时间调试。而不同的路面,因为摩擦因素的不同,也需要对左右转90度的函数,进行内部延时的调试。不过由于都是直接凭观察进行调试,精度不能得到有效保证。可以考虑以后添加测速功能,再进行精准调试。目前则只能做到一个大致的调试结果,但也满足了循迹与避障功能的需求。所以对小车的调试就到此结束。遥控器上的调试也只有对4×4键盘按键扫描的调试,而该扫描函数代码来自单片机100例,所能做的也只是调整接线顺序,使单片机能正确识别按下的按键,发送正确的命令。下面先附上键盘实物图:47 河北科技师范学院2015届本科毕业设计图20键盘实物图经调试得出,从左到右的接线顺序为P1.0、P1.1、P1.2、P1.3、P1.4、P1.5、P1.6、P1.7。如此接线后,按键编号从左到右、从上到下依次增大,左上第一个按键编号为0。如此所有的调试均已完成。结论本次设计的小车,经过测试能够达到设计的基本要求。能进行工作模式的切换、自动循迹、自动避障、无线操控。还使用了PWM控制小车的速度。不过也有一些不足之处。比如,自动避障时需要检测前方路面的高低落差,以防止小车从高处落下。但该功能是通过检测循迹传感器的输出电平,来判断前方是否有高低落差。这使得小车无法判断前方的高低落差究竟有多少,导致只要路面不平,小车就会停止。而且循迹传感器离地面太近,当路面有较低的障碍物时,就会使传感器与障碍碰撞,降低传感器的使用寿命。而且,如果小车离路面边缘稍远时,就算检测到前方有高低落差时,也会因为惯性使小车驶出路面,无法停下。无线操控没有太大的问题,能通过发送端完全实现对小车的实时控制。但由于小车车体的设计存在一些尺寸问题,导致没有一个可很好安放无线模块的位置,使得接收能力有所下降,遥控距离只有2到3米。未能体现出NRF24L01+的收发能力。但是综合而言,该小车已完整的体现设计的核心要求,即工作时进行工作模式切换。而对与三种工作模式的主要部分,也表现良好。符合循迹、避障和无线操控的需求,达到三个功能的设计要求。并且小车还留下了足够的扩展空间,比如还能再添加测速模块、47 河北科技师范学院2015届本科毕业设计显示模块等。对于PWM脉冲控制车速,也还可以得到更好的利用。比如制作行驶时加减速。总之,本次设计还是成功的制作出了一个满足设计要求的智能小车。参考文献[1]尹念东.智能车辆的研究及前景[J].上海汽车,2002.2.[2]华成英,童诗白.模拟电子技术基础[M].北京:高等教育出版社,2006.[3]郭天祥.51单片机c语言教程[M].北京:电子工业出版社,2010.[4]赵家贵,付小美,董平.新编传感器电路设计手册[M].北京:中国计量出版社,2002[5]于连国,李伟,王妍玮.基于单片机的智能小车设计[J].林业机械与木工设备,2011,4.[6]赵振德.多功能遥控智能小车的制作[J].电子制作,2011,4.[7]何立民.单片机技术的现状与未来[N].中国计算机报,1995.[8]杨加国.单片机原理与应用及C51程序设计[M].北京:清华大学出版社,2006.[9]张毅刚.单片机原理及应用[M].北京:高等教育出版社,2010.[10]胡汉才.单片机原理与接口技术[M].北京:清华大学出版社,1999.4.[11]赵海兰.基于单片机的红外遥控智能小车的设计[J].无线互联科技,2011,3.[12]周淑娟.基于单片机智能寻迹小车的设计方案[J].工业技术与职业教育,2011,9(2).[13]姚培.基于单片机控制的智能循迹避障小车[J].机电信息,2010,12.[14]DanielHuntV.Mechartronics-Japan’sNewestThreat[M].NewYork:ChapmanandHall,1987.[15]KrishnaCM,ShinGK.Real-TimeSystem[M].Columbus,OH:McCraw-HillCompanies,Inc.1997.致谢在本次设计中,由衷感谢王枫导师对我的指导。感谢老师对设计提出的建议,和设计中错误的指正。设计之所以能够完成,没有老师对我的督促是做不到的。而且在设计初期,老师给出的分步设计思路,也是设计时使用的方案。再就是感谢我的同学对我设计的帮助,多亏他们制作小车的经验,给了我很大的帮助。比如供电的设计,没有他们提供的元件和设计建议,是不能让小车得到有效且稳定的供电电源。而这将影响小车的实际运行。最后再次由衷的感谢你们的帮助。附录47 河北科技师范学院2015届本科毕业设计发送端完整代码。#include#include#includetypedefunsignedUINT;typedefunsignedcharUCHAR;#defineTX_ADR_WIDTH5//5字节宽度的发送/接收地址#defineTX_PLOAD_WIDTH1//数据通道有效数据宽度UCHARcodeTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//定义一个静态发送地址UCHARRX_BUF[TX_PLOAD_WIDTH];UCHARTX_BUF[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};UCHARbdatasta;sbitRX_DR=sta^6;sbitTX_DS=sta^5;sbitMAX_RT=sta^4;sbitCE=P2^5;sbitCSN=P2^4;sbitSCK=P2^3;sbitMOSI=P2^2;sbitMISO=P2^1;sbitIRQ=P2^0;voiddelay(UINTz);UCHARcodeKeyCodeTable[]={0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88};/**************************************************函数:delay_ms()描述:延迟x毫秒/**************************************************/voiddelay_ms(UCHARx){UCHARi,j;i=0;47 河北科技师范学院2015届本科毕业设计for(i=0;i0;n--)_nop_();}//****************************************************************************************/********************键盘扫描函数**********************/intKeys_Scan(){UCHARsCode,kCode,i,k;//低4位置0,放入4行P1=0xf0;//若高4位出现0,则有键按下if((P1&0xf0)!=0xf0){delay_ms(5);if((P1&0xf0)!=0xf0){sCode=0xfe;//行扫描码初值for(k=0;k<4;k++)//对4行分别进行扫描{47 河北科技师范学院2015届本科毕业设计P1=sCode;if((P1&0xf0)!=0xf0){kCode=~P1;for(i=0;i<16;i++)//查表得到按键序号并返回if(kCode==KeyCodeTable[i])return(i);}elsesCode=_crol_(sCode,1);}}}return(-1);}/**************************************************//**************************************************函数:init_io()描述:初始化IO/**************************************************/voidinit_io(void){CE=0;//待机CSN=1;//SPI禁止SCK=0;//SPI时钟置低IRQ=1;//中断复位}/**************************************************//**************************************************47 河北科技师范学院2015届本科毕业设计函数:SPI_RW()描述:根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01读出一字节/**************************************************/UCHARSPI_RW(UCHARbyte){UCHARi;for(i=0;i<8;i++)//循环8次{MOSI=(byte&0x80);//byte最高位输出到MOSIbyte<<=1;//低一位移位到最高位SCK=1;//拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据byte|=MISO;//读MISO到byte最低位SCK=0;//SCK置低}return(byte);//返回读出的一字节}/**************************************************//**************************************************函数:SPI_RW_Reg()描述:写数据value到reg寄存器/**************************************************/UCHARSPI_RW_Reg(UCHARreg,UCHARvalue){UCHARstatus;CSN=0;//CSN置低,开始传输数据status=SPI_RW(reg);//选择寄存器,同时返回状态字SPI_RW(value);//然后写数据到该寄存器CSN=1;//CSN拉高,结束数据传输return(status);//返回状态寄存器}/**************************************************/47 河北科技师范学院2015届本科毕业设计/**************************************************函数:SPI_Read_Data(UCHARreg)描述:从reg寄存器读一字节/**************************************************/UCHARSPI_Read_Data(UCHARreg){UCHARreg_val;CSN=0;//CSN置低,开始传输数据SPI_RW(reg);//选择寄存器reg_val=SPI_RW(0);//然后从该寄存器读数据CSN=1;//CSN拉高,结束数据传输return(reg_val);//返回寄存器数据}/**************************************************//**************************************************函数:SPI_Write_Buf()描述:接收/发送地址/**************************************************/UCHARSPI_Write_Buf(UCHARreg,UCHAR*pBuf,UCHARbytes){UCHARstatus,i;CSN=0;//CSN置低,开始传输数据status=SPI_RW(reg);//选择寄存器,同时返回状态字for(i=0;i#include#includetypedefunsignedintUINT;typedefunsignedcharUCHAR;#defineRX_ADR_WIDTH5//5字节宽度的接收地址#defineRX_PLOAD_WIDTH1//数据通道有效数据宽度#defineMODE10x00//无线操控模式#defineMODE20x01//自动寻迹模式#defineMODE30X02//避障模式#defineSTOP0x0347 河北科技师范学院2015届本科毕业设计#defineFRONT0x04#defineBACK0x05#defineLEFT0x06#defineRIGHT0x07#defineLEFT_900x08#defineRIGHT_900x09UCHARcodeRX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//定义一个静态发送地址UCHARTX_BUF[RX_PLOAD_WIDTH];UCHARMode_Flag;UCHARflag=0;UINTdistance;bitsucceed_flag;//测量成功标志sbitCE=P0^5;sbitCSN=P0^4;sbitSCK=P0^3;sbitMOSI=P0^2;sbitMISO=P0^1;sbitIRQ=P0^0;sbitINA1=P2^0;sbitINA2=P2^1;sbitINB1=P2^2;sbitINB2=P2^3;sbitENA=P2^4;sbitENB=P2^5;sbitINTERTRAL=P1^0;sbitEXTERTRAL=P1^1;sbitINTERTRAR=P1^2;sbitEXTERTRAR=P1^3;sbitTrig=P1^4;//产生脉冲引脚sbitEcho=P3^2;//回波引脚UCHARbdatasta;sbitRX_DR=sta^6;sbitTX_DS=sta^5;47 河北科技师范学院2015届本科毕业设计sbitMAX_RT=sta^4;/**************************************************秒延时函数***************************************************/voiddelay(UINTz){UINTx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/**************************************************//**************************************************//*微秒延时函数/******************************************************************************************/voidinerDelay_us(unsignedcharn){for(;n>0;n--)_nop_();}/*****************************************************************************************//**************************************************函数:init_io()描述:初始化IO接口/**************************************************/voidinit_io(void){CE=0;//待机CSN=1;//SPI禁止SCK=0;//SPI时钟置低IRQ=1;//中断复位}47 河北科技师范学院2015届本科毕业设计/**************************************************//**************************************************函数:delay_ms()描述:时间延迟/**************************************************/voiddelay_ms(UCHARx){UCHARi,j;i=0;for(i=0;i0){P2=0x00;Right90();delay_ms(100);}}}}/*************************************************//*************************************************定时器0中断,回波清零**************************************************/voidtimer0()interrupt1{Echo=0;47 河北科技师范学院2015届本科毕业设计}/*************************************************//*************************************************定时器1中断,发送超声波**************************************************/voidtimer1()interrupt3{meter_distance();}/*************************************************//**************************************************函数:main()描述:主函数/**************************************************/voidmain(void){UCHARRX_BUF;inerDelay_us(100);init_io();RX_Mode();P2=0x00;while(1){flag=nRF24L01_RxPacket(&RX_BUF);sta=SPI_Read_Data(STATUS);if(flag==1){switch(RX_BUF){caseMODE1:Mode_Flag=1;WifiControl();break;caseMODE2:Mode_Flag=2;AutoTrace();break;caseMODE3:Mode_Flag=3;AutoAvoidObstacle();break;47 河北科技师范学院2015届本科毕业设计default:P2=P2;}}SPI_RW_Reg(WRITE_REG+STATUS,sta);delay_ms(20);RX_Mode();}}/**************************************************/头文件api完整代码。#ifndef_API_DEF_#define_API_DEF_//DefineinterfacetonRF24L01//SPI(nRF24L01)commands#defineREAD_REG0x00//Definereadcommandtoregister#defineWRITE_REG0x20//Definewritecommandtoregister#defineRD_RX_PLOAD0x61//DefineRXpayloadregisteraddress#defineWR_TX_PLOAD0xA0//DefineTXpayloadregisteraddress#defineFLUSH_TX0xE1//DefineflushTXregistercommand#defineFLUSH_RX0xE2//DefineflushRXregistercommand#defineREUSE_TX_PL0xE3//DefinereuseTXpayloadregistercommand#defineNOP0xFF//DefineNoOperation,mightbeusedtoreadstatusregister//SPI(nRF24L01)registers(addresses)#defineCONFIG0x00//"Config"registeraddress#defineEN_AA0x01//"EnableAutoAcknowledgment"registeraddress#defineEN_RXADDR0x02//"EnabledRXaddresses"registeraddress#defineSETUP_AW0x03//"Setupaddresswidth"registeraddress#defineSETUP_RETR0x04//"SetupAuto.Retrans"registeraddress47 河北科技师范学院2015届本科毕业设计#defineRF_CH0x05//"RFchannel"registeraddress#defineRF_SETUP0x06//"RFsetup"registeraddress#defineSTATUS0x07//"Status"registeraddress#defineOBSERVE_TX0x08//"ObserveTX"registeraddress#defineCD0x09//"CarrierDetect"registeraddress#defineRX_ADDR_P00x0A//"RXaddresspipe0"registeraddress#defineRX_ADDR_P10x0B//"RXaddresspipe1"registeraddress#defineRX_ADDR_P20x0C//"RXaddresspipe2"registeraddress#defineRX_ADDR_P30x0D//"RXaddresspipe3"registeraddress#defineRX_ADDR_P40x0E//"RXaddresspipe4"registeraddress#defineRX_ADDR_P50x0F//"RXaddresspipe5"registeraddress#defineTX_ADDR0x10//"TXaddress"registeraddress#defineRX_PW_P00x11//"RXpayloadwidth,pipe0"registeraddress#defineRX_PW_P10x12//"RXpayloadwidth,pipe1"registeraddress#defineRX_PW_P20x13//"RXpayloadwidth,pipe2"registeraddress#defineRX_PW_P30x14//"RXpayloadwidth,pipe3"registeraddress#defineRX_PW_P40x15//"RXpayloadwidth,pipe4"registeraddress#defineRX_PW_P50x16//"RXpayloadwidth,pipe5"registeraddress#defineFIFO_STATUS0x17//"FIFOStatusRegister"registeraddress#endif/*_API_DEF_*/47'