基于RaspberryPI的履带式机械臂智能小车分析研究 电气自动化专业_第1页
基于RaspberryPI的履带式机械臂智能小车分析研究 电气自动化专业_第2页
基于RaspberryPI的履带式机械臂智能小车分析研究 电气自动化专业_第3页
基于RaspberryPI的履带式机械臂智能小车分析研究 电气自动化专业_第4页
基于RaspberryPI的履带式机械臂智能小车分析研究 电气自动化专业_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于RaspberryPI的履带式机械臂智能小车摘要:近几年来,科学家在智能汽车领域越来越喜欢用RaspberryPI开发平台,这个开发平台凭借着它具有吸引力的价格、比较娇小的尺寸、超强的感应接口和强大的编程功能不断的吸引了国内和国外的开发行业的关注,同时,也为智能小车的开发提供了良好的环境和创造了巨大的商业潜力,同时这项技术在高等教育领域也有很好的应用和推广前景。本文是将RaspberryPI技术在详细分析移动侦测系统原理过程中,改变工作模式,基于实现机制的基础上,设计了履带式机械臂智能小车系统的总体结构,并阐述了各个关键模块的具体实现过程。关键词:RaspberryPI;履带式;机械臂;物联网;智能小车CrawlermanipulatorintelligentcarbasedonRaspberryPIAbstract:Inrecentyears,scientistsareincreasinglyfondofusingRaspberryPIdevelopmentplatforminthefieldofsmartcars.Withitsattractiveprice,relativelysmallsize,super-strongsensinginterfaceandpowerfulprogrammingfunction,thisdevelopmentplatformhasattractedtheattentionofdomesticandforeigndevelopmentindustries.Atthesametime,italsoprovidesagoodenvironmentandcreatesgreatcommercialpotentialforthedevelopmentofsmartcars.Atthesametime,thistechnologyhasgoodapplicationandpromotionprospectsinthefieldofhighereducation.Inthispaper,RaspberryPItechnologyisusedtochangetheworkingmodeduringthedetailedanalysisoftheprincipleoftheMotiondetectingsystem.Basedontheimplementationmechanism,theoverallstructureofthetrackedmanipulatorintelligenttrolleysystemisdesigned,andthespecificimplementationprocessofeachkeymoduleisdescribed.Keywords:RaspberryPI;;Crawlertype;Mechanicalarm;Internetofthings;Intelligentcar

目录引言 31.背景和意义 31.1rasberrypi平台概述 31.2履带式机器人手臂智能车系统的发展及现状 41.3履带式机械臂智能小车训练控制系统的意义 52.履带式机械臂智能小车硬件设计 52.1履带式机械手智能小车供电方案 72.2履带式机械手智能小车控制中心 102.3履带式机械手智能小车电机驱动模块设计。 113.履带式机械臂智能小车软件设计 113.1履带式机械手智能小车路径规划设计 133.2履带式机械手智能小车驱动设计 143.2程序代码 144.机械手臂的运动理论和总结展望分析 35致谢 38参考文献 39

引言随着现在计算机行业的高速发展,让嵌入式高端技术也得到了迅猛的发展,RaspberryPI开发平台从欧洲传入中国就以其小巧玲珑的体积以及丰富多样的传感器接口与强大的编程功能,引起了的强烈反应。。在各类履带式机械臂智能小车中,智能运输类应用是当前非常热门的应用之一。自动感应运输物体是各类机械臂智能小车中非常广泛的应用之一,在这个应用上,主要的功能就是将物品搬运放置但情况很大程度上节省了我们的人力和物力。1.背景和意义1.1rasberrypi平台概述RaspberryPI是一种嵌入式计算机硬件的平台,他的内存大,占用体积小,由英国慈善组织“拉斯伯瑞皮基金会”发布成立。该基金会建立这个的目的是在“改善学校的里面的计算机科学和相关的一些学科教育,使计算机的学习与使用更加有趣”。计算机平台使用ARM11架构处理器,开始使用简化的Linux操作系统。基本使用平台的硬件的尺寸大致在80mm×50mm(也就类似于普通集成电路卡上面的尺寸)。RaspberryPI系统被称为“世界上最微型的桌面”。该平台提供了极极其的使用成本(新版RaspberryPI3售价竟低于为35美元)。并且,它还配备了强大的开发工具以及各种各样类型的接口,支持SD的卡支持以太网、支持USB、支持视音频接口等等。目前,RaspberryPI在各种各样嵌入式平台开发中具有超级高的性价比。与此同时,系统中PI体积小,编程功能相当强大,尤其适合各种物联网或者高新技术的应用的开发。它广泛的应用于国内各种物联网发展和学校里面的计算机教育事业。自发布以来,全球销量已超过1250万台。下面直接给出了RaspberryPi的构件图,好让我们有个直观的印象。图1.1RaspberryPi的构件图平台位最新的系统加上了3456处理系统、还有80个端口,不仅如此,还可以提供WIFI和蓝牙的功能以及其他的一些多媒体的端口。开发环境与语言作为拉斯伯瑞皮平台的标准编程开发语言部署在Linux系统中。它包含自己的一套标准库,不仅功能十分完善,语法也十分简单明了,内存自我恢复功能强大。因此它非常适合系统过程管理和网络程序开发利用。通过平台提供的各种各样输入/输出端口,Python语言也可以轻松的控制各种其他电子设备以及传感器,并收集外部环境的大数据。1.2履带式机器人手臂智能车系统的发展及现状遥控机械臂的设计和制造旨在培养我们的开发能力和实践动手能力,以及思考问题和处理问题的能力,并且旨在将电子信息的各种各样专业的理论知识经过思考转化为实践,通过理论联系实际,并且可以能有效提高我们的各方面综合素质和能力。此外,各种传感器、感应器的开发和使用、计算机技术的飞速发展和芯片集成度的迅猛提高使得自动化技术在我们的生活中日益成熟,生活方式朝着人工智能的方向快速前进。因此,我们大可以认为该机械臂小车的设计大概是基于电子信息的发展技术,通过我们各种传感器的充分利用应用以及与计算机还有通信网络的高速结合。这使得智能汽车可以通过各种各样的网络中的声音来判断和控制。首先,它适用于我们当今的自动控制自动技术。其次,它为智能化的发展未来研究做好了准备铺平了道路。1.3履带式机械臂智能小车训练控制系统的意义随着科学技术水平的发展,我们的生活越来越智能化,人手相对大脑而言有太多的限制,例如,人手没有太多的力量,不能在高温、重伤风、深海、外太空等特殊环境中工作。此外,随着高科技时代的发展,一切都不是由人手完成的。因此,有必要设计一种机械臂来代替人的手臂。此外,大多数机械臂控制系统并不完美,控制起来也不复杂。为了使机器人爪到达某个目的地,需要几条控制指令,超远程控制不能通过网络进行。基于这些问题,我们团队计划设计这种智能机器人手臂。当我们的控制系统发出命令以后,手机上面的应用程序就可以根据我们的命令处理语音指令,然后再通过系统将命令发送给机械臂小车,小车在这种情况下就会自己识别程序命令,然后处理指令,并根据指令与周围的环境咨询相对应的一些动作,在这个过程中,不需要人类的参与,小车会自己动作完成。图1.2信号传输机械臂的设计给人们带来了极大的便利,生活中也越来越多的情况下,会使用机械臂帮助我们在非常困难的情况下缓存一些难以完成的事情,2.履带式机械臂智能小车硬件设计本课题旨在设计一种智能小车,硬件设计是整个系统设计的基础,而需求分析是系统硬件设计的前提,根据需求分析对硬件进行模块化的设计,整个系统分为RaspberryPi平台系统、电源转换电路、JTAG调试电路、数据采集电路、电机驱动电路、无线通信电路等,模块化设计不仅使系统对硬件资源的分配更合理,同时方便系统调试,下面具体介绍智能小车的硬件设计。该小车能够检测环境温度和烟雾浓度,并将采集到的数据发送到计算机,实现计算机的在线监测;同时小车还具有避障功能。根据系统的设计需求,本智能小车实现以下功能。(1)运动功能——智能小车可以进行后退、前进、左右拐弯的运动(2)避障功能——可以避开障碍物,选择一条无碰路径,其中涉及到传感器的选择和路径规划算法;(3)测温功能——可以知晓温度的变化,达到测量的程度;(4)烟雾报警功能——可以用来测量环境中的烟雾及有害气体,浓度超标时具有报警功能。(5)通信数据功能——用无线通信数据来建立和计算机的连接。(6)上位机显示功能——计算机能够清晰的显示智能小车采集到的数据,将小车的位置还有运动轨迹以及各种数据进行上传。智能小车的硬件设计是以需求分析为基础,选择合适的控制器和传感器,其中包括传感器超声波传感器、温度传感器、烟雾检测传感器、电源电路与控制器接口电路、电机驱动电路、调试接口电路等,而这些功能模块,现在的RaspberryPi平台都已具备。(1)电源转换电路由于各元器件的工作电压不尽相同,为了保证系统的正常运行,需要设计出不同数值的电压,而超声波传感器、温度传感器、气体传感器的工作电压范围是+5V,这就需要通过用系统电路模块设计的要求来研制出不一样的电压值,这才能与系统的需求相挂钩。因此,电源电路是系统设计的基础。在这里RaspberryPi采用的是5V,2A的MicroUSB供电。(2)无线通信模块通信模块设计采用RS-232电平转换和CC1101无线收发芯片。通信模块可以将智能小车采集到的数据实时地传输到计算机,同时短距离抗外干扰性强、可靠性比较高、地理环境因素限制少、实用方便快捷。(3)JTAG接口电路JTAG电路的主要作用就是用于烧写FLASH,由于PC机上是没有JTAG接口的,同时JTAG接口还可以用来调试程序,而调试程序为了通过JTAG接口去调试目标板上的程序,同样是使用PC的并口转JTAG接口来实现与目标板的通信。(4)温度采集电路温度传感器输出信号有三种模式:数字式温度传感器、逻辑输出温度传感器、模拟式温度传感器。此传感器外围配加的模数用电路表示较为复杂,精确度比较低,本课题中选用数字温度传感器DS18B20,数字温度传感器准确度非常高、接线简单、性能稳定的优点。(5)气体检测传感器气体检测模块用于检测环境中有毒气体的浓度,当气体浓度超过设定值时,模块会报警提示。(6)超声波测距传感器超声波测距传感器主要有红外线、激光以及超声波测距传感器三种。红外的探测距离较短,只有几十厘米,一般与其他传感器结合使用。激光能够实现远距离测量,具有速度快、精确度高、抗干扰能力强、量程大,光线集中等优点,但其视场窄,难以覆盖必需的测量范围,再加上它的价格较贵,所以不是很适合用在小车上。课题中的智能小车用超声波传感器来测量距离。(7)驱动电路模块驱动电路是小车运动的基础,主要负责将来自控制器的控制信号转化为能够驱动电机的信号模块,电机的驱动电路使用分立元件构成的驱动电路还有采用专业电机驱动芯片,分立元件构成的驱动电路,这种芯片结构较为简单、价格便宜,电路工作性能表现的不稳定,所以选用专用芯片构成驱动电路。(8)智能小车车体结构移动机器人的车体结构主要有足步、轮式以及履带式三种类型。足步式机器人从机械结构设计到控制算法都比较复杂,主要应用在崎岖不平的路面,但是其机动性相比自然界的节肢动物,还是有很大差距。履带式的实际支撑面积比较大,作业于松软土地和泥场,越野性能好,但是履带机器人的体积和重量都很大,控制算法也有待发展和完善。轮式机器人的运动速度还有方向易控制,操作容易。轮式机器人的总类也有很多,一般为三轮或四轮,三轮车的所有的车轮与地面都能保持良好的接触,可满足一般的使用要求,但稳定性和承受能力较差。四轮结构是最常见的结构形式,具有良好的稳定性和承受能力。但是转向结构有所不同,一种是前两轮由转向电机控制负责转向,后两轮由驱动电机控制负责前进和后退,这种结构的车体转向的角度不容易控制,而且转向半径也较大。另一种如图2-2左右两轮A、B由两个电机单独控制来实现小车的前行、后退,前后两个为万向轮C、D辅助支撑作用,两个驱动轮之间差速来实现转向功能,这种结构的小车转向更加灵活,控制精度较高,采用差速转向的方式。2.1履带式机械手智能小车供电方案硬件系统整个工作基础是电源,地位较高,人们很容易忽视,电源系统如果注意得当,整个系统的故障将会大大降低,设计电源的整个过程就是是一个权衡的过程,必须考虑如下因素:电源的功率;芯片及系统的散热;输出纹波;安全因素;电磁兼容和电磁干扰;体积限制及成本限制。智能小车控制系统有多种电源需求,MiniARM工控板需要+5V和+3.3V电压,无线通信模块是+5V和+3.3V电源,超声波传感器和气体传感器是+5V电源,所以要设计不同电压值的电源。由于系统对A/D功能要求不高,所以模拟电源与数字电源没有分开供电。考虑到小车的本身的移动性,所以交流转直流的电压开关模块不方便使用,所以选用了9V(6节1.5V的直流电池)直流电源,9V电源经过7805变压芯片,得到+5V电压,电路图如3-3所示:其中LED6为电源指示灯,R27为限流电阻,T2、T4为电路测试点,C4、C5为输入端滤波电容,C6、C7为输出端滤波电容。7805是大多情况下使用的三端稳压集成芯片,最高输入极限电压为36V,最低输入电压为7V,最佳的工作状态是输入电压与输出电压间的压差为3~4V左右,输出电压为5V,电路内有过热或者是调整管的电路保护,用起来实用、方便,而且便宜。在实际应用中,如果输出的功率很大,要在稳压电路上安装比较大一点的散热器。+5V既是末级电源,也是+3.3V电源的前级电源。MiniARM控制器需要的+3.3V电压为+5V电压通过SPX1117-3.3稳压芯片来达到效果的,电压转换的电路如下图。图2.1电压转换电路图SPX1117为一个低功耗、低压差正向电压调节器,其输出电压有3.3V、3.0V、2.85V、1.8V、1.5V等,800mA的稳定输出电流,800mA时低压差为1.1V。SPX1117有多种封装,本设计选用TO-220。一个10μF输出电容可有效地保证稳定性,同时还具有电流限制和热保护功能,经常用于高效率、低功耗设计中。电源去耦电路的作用是去除电路间的相互干扰信号,从而减小PCB上的各种噪声,使电源能够稳定工作。高频器件运转时,它们的电流是不连续的,间断的,频率还很高,在很短的距离内,线路产生的感抗会非常大,会导致器件在需要电流的时候,不能及时的供给,当用大电容滤波时,由于电解电容器绕层很多,因此有明显的寄生电感,也会干扰用电设备的正常运行,此时小电容就非常适合,所以要用多个小电容并联起来使用。电源去耦电路如图图2.2电源去耦合电路图核心板上设计了复位电路,如图3-6所示。按下按键后,会强制将CPU的复位引脚拉低,从而达到使系统复位的目的。M2005-NU11工控板含有ISP功能,因此可以设计一个ISP电路,如图3-6所示。LPC2200芯片内有一段引导程序,上电后被执行,主要用来检查P0.14引脚电平,如果是低,则进入ISP程序,如果为高,则检查用户代码部分的中断向量和是否为0,如果校验正确,则执行用户代码;如果无有效用户代码,则执行ISP程序。在本设计中如果程序调试完毕后要脱机运行,JP1跳线必须要断开。图2.3ISP及复位电路图2.2履带式机械手智能小车控制中心(一)控制系统。机器小车所采用的控制平台是RaspberryPi,RaspberryPI是一种嵌入式计算机硬件的平台,他的内存大,占用体积小,由英国慈善组织“拉斯伯瑞皮基金会”发布成立。该基金会建立这个的目的是在“改善学校的里面的计算机科学和相关的一些学科教育,使计算机的学习与使用更加有趣”。计算机平台使用ARM11架构处理器,开始使用简化的Linux操作系统。基本使用平台的硬件的尺寸大致在80mm×50mm(也就类似于普通集成电路卡上面的尺寸)。可以将树莓派连接电视、显示器、键盘鼠标等设备使用。(二)远程控制技术。本文选择蓝牙技术进行远程控制,HC-06蓝牙模块。在机器小车的制造中蓝牙模块的作用主要是接收Android手机发出的信号,然后作用于单片机控制系统,从而实现Android手机对机器小车的运行遥控。(三)驱动电路仿真。机器小车的底盘是由四个电机组成,行走时只需要控制四个电机的启停和正反转即可。在本课题中是将左右两边的两个电机分别串联在一起,然后与驱动模块连接。机器小车上配有机器臂,机器臂工作时应处于慢速状态,而将两个电机串联的方法刚好满足了这一要求。驱动模块使用的是L298N驱动芯片,其仿真效果如下图。图2.3L298N驱动芯片仿真效果图2.3履带式机械手智能小车电机驱动模块设计。使用单片机实现复位,I/O控制,PWM调速等功能。目前大多采用开关型驱动方式驱动直流电机,最常见的驱动方式是脉冲宽度制(PWM)。本系统电机驱动芯片采用L298N,采用单片机PWM调速,L298N驱动两组直流电机,其单组驱动电流可达2A。电机驱动模块原理如图所示。图2.4电机驱动模块原理如图Openwrt是一个小型Linux系统,路由器安装上Openwrt后,其功能将变为异常强大,可作为一台小型服务器,安装好数据转发和监控软件,即可以实现与单片机的串口通信,并用WIFI传输视频信号,实现视频监控功能,本系统安装的视频监控软件为MJPG。摄像头通过USB接口与路由器相连接,安装好驱动和视频监控软件后即可通过开发路由的WIFI功能传输视频信号。3.履带式机械臂智能小车软件设计语音指令由移动应用接收并通过网络发送到汽车的ARM9处理器。ARM9通过网络将机器人手臂周围的环境和汽车的状态返回给操作者,从而实现数据交互。如何使两台机器在不同的内部网中进行通信一直是一个难以解决的问题。一般的解决方案是:使用服务器作为中介,首先将信息发送到外部网络服务器,然后将其转发到另一个局域网计算机,或者通过虚拟局域网。然而,由于目前通信软件的数量众多,借用这些通信软件的服务器是一个很好的选择。我们的解决方案是利用微信开源软件,将自己开发的应用模块以插件的方式嵌入到微信中。此外,汽车平台还配备了ARM9处理器,可以作为安卓操作系统使用,因此我们可以安装一个微信软件。在本项目中,我们主要使用控制器的语音信息来操作机器人车,但我们需要远程控制(不同网络中的通信控制),因此不建议使用硬件设备来实现语音控制指令识别转换,因此在这里我们使用我们自己的应用插件来执行语音识别C。翻转。在此之前,应用程序将语音信息识别为文本,然后通过网络将文本信息发送给机器人臂车。机器人臂车接收到文本指令后,将其转换为机器指令,最终达到语音控制。从软件系统的角度,介绍了我们的智能车。众所周知,软件是所有硬件的灵魂。没有它,无论硬件设计多么精致,都很难充分发挥它的作用。智能小车系统有三个组成部分:环境感知、决策规划还有控制执行。环境感知的输出可以作为决策规划的输入。决策规划的输出是控制执行的输入。控制执行的输出控制智能车辆适应环境状态的变化,从而形成实时闭环。随着智能车的发展,单智能车处理问题的能力有限,往往只处理简单的单辆车。很难适应连续的多任务。其次,它们适应有限的环境,通常在特定的场景中。此外,尽管不同的智能车可以处理不同的任务,但是在一定程度上,它满足了我们的需求,但是机器人协作仍然没有什么突破,我们无法处理复杂的策略。第三,不同的机器人可以执行不同的任务,收集大量的信息,但它们不能共享信息。他使用机器人。基于以上问题,我们将服务器作为智能车的服务控制中心,利用服务器作为智能小车系统的控制中心,有以下好处:(1)信息共享:智能汽车共享服务器知识库中所有环境的信息,因此当汽车在不熟悉的环境中工作时,您可以在工作前访问数据库,询问环境中是否有任何环境字母。如果服务器具有当前的环境信息,则环境信息将传输到智能车。获取环境信息当汽车直接根据获得的信息进行任务处理后,汽车就保存了对环境信息的探索,肯定了。这只是个别车的很多,如果车的数量增加,效益就不能低估。(2)多车协作:当智能车处理任务相对困难时,需要多辆智能车的配合。例如,在A房间,有一件货物需要智能车A运到B房间,距离A房间2公里,如果是单个智能车A运到,可能需要10分钟,而A车的动力只能支持运行5分钟才能到达C位置,在这种情况下,只有A车不能完成任务。智能车A把任务加状态信息发送置服务器,服务器用收到的数据在C处搜索可使用智能小车。这个发现发现发现在C点附近的智能车B中有足够的电力,然后服务器将信息发送给智能车B,这样它就可以在智能车B处提货,并来完成A没有完成的任务。(3)远程监控:这是智能系统的控制中心,要对所有的智能小车进行实时监控。该方法的优点是能及时检测智能车的故障,避免不必要的损失。此外,当汽车不知道如何处理复杂的道路条件时,智能汽车的运动可以手动和远程控制。(4)知识存储:知识库是服务器的核心模块当中十分重要的一个。现在处在数据时代。数据就像地雷。数量和内容越多,包含的价值就越大。此软件系统设计用C语言模块化结构,包括主程序、pwm调速子程序、电机驱动子程序、中断子程序、、循迹行驶子程序、无线遥控子程序、避障行驶子程序、、按键切换子程序等。系统主程序流程图如下图所示。图3.1系统主程序流程图3.1履带式机械手智能小车路径规划设计系统是用集成型红外对管对寻迹单元的作为传感器使用,红外线发射红外线后,红外线二极管再进行接收数据。使用红外线进行发射,可见光对接收信号几乎没有影响,用射极输出器对信号屏蔽。小车底部的一处红外线收发对管遇到黑带时,还能检测到输入电平为高电平,反过来是低电平。3.2履带式机械手智能小车驱动设计智能小车的电机选用的是直流减速电机,即齿轮减速电机,是在普通直流电机的基础上,加上配套齿轮减速箱。齿轮减速箱的作用是,提供较低的转速,较大的力矩。同时,齿轮箱不同的减速比可以提供不同的转速和力矩。电机的工作电压为3-6V,电压为6V时,无负载时转速为100转/分钟,无负载时电流为70mA,减速比为1:48。电机驱动电路连接图[25]如如3-15所示,主要包括光电耦合器件、电机驱动芯片、整流电路三个部分。光电耦合器件选用的是TLP521-4,其内部含有四组光耦管,用来将控制信号与负载完全隔离,可以增加安全性,减小信号之间的干扰;电机驱动芯片选用的是L298N,为15脚Multiwatt封装,其中IN1、IN2、IN3、IN4为控制信号输入端,VS为电源电压,最大可接36V,VSS为工作电压,最小4.5V,最大36V,在应用中根据实际情况选择5V电压。整流电路选用8个二极管IN4007。图3.2整流电路图测试分析:控制驱动电路的输入电平,然后用万用表测试输出电压的大小,检验与预定的结果一致时,接通电机,编写电机驱动程序,小车能够实现前进、后退、左转、右转的功能。3.2程序代码1.初始化以及模式控制/***Functionmain*@brief对串口发送过来的数据解析,并执行相应的指令*@param[in]void*@retvalvoid*@parHistory无*/intmain(){g_modeSelect=1;//wiringPi初始化wiringPiSetup();digitalWrite(OutfirePin,HIGH);//初始化电机驱动IO为输出方式pinMode(Left_motor_go,OUTPUT);pinMode(Left_motor_back,OUTPUT);pinMode(Right_motor_go,OUTPUT);pinMode(Right_motor_back,OUTPUT);//创建两个软件控制的PWM脚softPwmCreate(Left_motor_pwm,0,255);softPwmCreate(Right_motor_pwm,0,255);//定义左右传感器为输入接口pinMode(AvoidSensorLeft,INPUT);pinMode(AvoidSensorRight,INPUT);//定义寻迹红外传感器为输入模式pinMode(TrackSensorLeftPin1,INPUT);pinMode(TrackSensorLeftPin2,INPUT);pinMode(TrackSensorRightPin1,INPUT);pinMode(TrackSensorRightPin2,INPUT);//定义光敏电阻引脚为输入模式pinMode(LdrSensorLeft,INPUT);pinMode(LdrSensorRight,INPUT);//初始化蜂鸣器IO为输出方式pinMode(buzzer,OUTPUT);digitalWrite(buzzer,HIGH);//初始化超声波引脚模式pinMode(EchoPin,INPUT);//定义超声波输入脚pinMode(OutfirePin,OUTPUT);//初始化RGB三色LED的IO口为输出方式,并初始化pinMode(LED_R,OUTPUT);pinMode(LED_G,OUTPUT);pinMode(LED_B,OUTPUT);softPwmCreate(LED_R,0,255);softPwmCreate(LED_G,0,255);softPwmCreate(LED_B,0,255);//初始化舵机引脚为输出模式pinMode(FrontServoPin,OUTPUT);//初始化舵机引脚为输出模式pinMode(FrontServoPin,OUTPUT);pinMode(ServoUpDownPin,OUTPUT);pinMode(ServoLeftRightPin,OUTPUT);//舵机位置初始化servo_init(); //打开串口设备,如若失败则会打印错误信息 return-1;}while(1){//调用串口解包函数serialEvent();if(NewLineReceived){ printf("serialdata:%s\n",InputString);serial_data_parse();//调用串口解析函数 NewLineReceived=0;}//切换不同功能模式switch(g_modeSelect){case1:break;//暂时保留case2:Tracking_Mode();break;//巡线模式}//舵机云台的控制Servo_Control_Thread();//让串口平均每秒发送采集的数据给上位机if(g_modeSelect==1){ serialtime--; if(serialtime==0) { count--; serialtime=5000; if(count==0) { serial_data_postback(fd); serialtime=5000; count=20; } }}usleep(10);}serialClose(fd);//关闭串口return0;}2.舵机旋转一定的角度/***Functionservo_pulse*控制0-180度*@param[in1]ServPin:舵机控制引脚*@param[in2]myangle:舵机转动指定的角度*@param[out]void*@retvalvoid*@parHistory无*/voidservo_pulse(intv_iServoPin,intmyangle){intPulseWidth;//定义脉宽变量delayMicroseconds(PulseWidth);//延时脉宽值的微秒数*@param[in]pos:指定的角度*@param[out]void*@retvalvoid*@parHistory无*/voidservo_appointed_detection(intpos){inti=0;3.超声波测距函数/***FunctionDistance*@brief超声波测一次前方的距离*@param[in]void*@param[out]void*@retvalfloat:distance返回距离值*@parHistory无*/floatDistance(){ floatdistance; structtimevaltv1; structtimevaltv2; structtimevaltv3; structtimevaltv4; longstart,stop; digitalWrite(TrigPin,LOW); delayMicroseconds(2); start=tv3.tv_sec*1000000+tv3.tv_usec; while(!digitalRead(EchoPin)==1) { { return-1;//超时返回-1 } } start=tv1.tv_sec*1000000+tv1.tv_usec; while(!digitalRead(EchoPin)==0) { gettimeofday(&tv3,NULL);//超时重测机制开始计时 stop=tv3.tv_sec*1000000+tv3.tv_usec; if((stop-start)>30000) { return-1; } }//超时重测机制结束计时 gettimeofday(&tv2,NULL);//当echo脚电平变低时结束计时 start=tv1.tv_sec*1000000+tv1.tv_usec; stop=tv2.tv_sec*1000000+tv2.tv_usec; distance=(float)(stop-start)/1000000*34000/2; printf("distance:%f\n",distance); returndistance;}4.小车前进、后退、刹车、左拐、右拐等运行函数/***Functionrun*@brief小车前进*@retvalvoid*@parHistory无*/voidrun(unsignedintLeftCarSpeedControl,unsignedintRightCarSpeedControl){//左电机前进softPwmWrite(Left_motor_pwm,LeftCarSpeedControl*0.95);//右电机前进softPwmWrite(Right_motor_pwm,RightCarSpeedControl);}/***Functionbrake*@brief小车刹车*@param[in]void*@param[out]void*@retvalvoid*@parHistory无*/voidbrake(){digitalWrite(Left_motor_go,LOW);digitalWrite(Left_motor_back,LOW);digitalWrite(Right_motor_go,LOW);digitalWrite(Right_motor_back,LOW);}/***Functionleft*@parHistory无*/voidleft(unsignedintLeftCarSpeedControl,unsignedintRightCarSpeedControl){//左电机停止softPwmWrite(Left_motor_pwm,LeftCarSpeedControl);//右电机前进softPwmWrite(Right_motor_pwm,RightCarSpeedControl);}/***Functionspin_left*@brief小车原地左转(左轮后退,右轮前进)*@retvalvoid*@parHistory无*/voidspin_left(unsignedintLeftCarSpeedControl,unsignedintRightCarSpeedControl){//左电机后退softPwmWrite(Left_motor_pwm,LeftCarSpeedControl);//右电机前进softPwmWrite(Right_motor_pwm,RightCarSpeedControl);}/***Functionright*@brief小车右转(左轮前进,右轮不动)*@param[out]void*@retvalvoid*@parHistory无*/voidright(unsignedintLeftCarSpeedControl,unsignedintRightCarSpeedControl){//左电机前进digitalWrite(Left_motor_go,HIGH);//左电机前进使能digitalWrite(Left_motor_back,LOW);//左电机后退禁止softPwmWrite(Left_motor_pwm,LeftCarSpeedControl);//右电机停止softPwmWrite(Right_motor_pwm,RightCarSpeedControl);}/***Functionspin_right*@brief小车原地右转(右轮后退,左轮前进)*@param[out]void*@retvalvoid*@parHistory无*/voidspin_right(unsignedintLeftCarSpeedControl,unsignedintRightCarSpeedControl){//左电机前进softPwmWrite(Left_motor_pwm,LeftCarSpeedControl);//右电机后退softPwmWrite(Right_motor_pwm,RightCarSpeedControl);}/***Functionback*@brief小车后退*@param[out]void*@retvalvoid*@parHistory无*/voidback(unsignedintLeftCarSpeedControl,unsignedintRightCarSpeedControl){//左电机后退softPwmWrite(Left_motor_pwm,LeftCarSpeedControl);//右电机后退softPwmWrite(Right_motor_pwm,RightCarSpeedControl);}5.小车巡线模式函数/***********模式2巡线模式*************//***FunctionTracking_Mode*@brief巡线模式*@param[in1]void*@param[out]void*@retvalvoid*@parHistory无*/intg_trackstate=0;voidTracking_Mode(){char*p=ReturnTemp;memset(ReturnTemp,0,sizeof(ReturnTemp));track_test();//在巡线过程中发送巡线传感器效果serialtime--;if(serialtime==0){ count--; serialtime=5000; if(count==0) { strcat(p,"4WD,CSB0,PV8.4,GS0,LF"); strcat(p,infrared_track_value); strcat(p,",HW00,GM00#"); serialPrintf(fd,p); serialtime=5000; count=20; }}//四路循迹引脚电平状态//00X0//10X0//01X0//以上6种电平状态时小车原地右转,速度为250,延时80ms//处理右锐角和右直角的转动if((TrackSensorLeftValue1==LOW||TrackSensorLeftValue2==LOW)&&TrackSensorRightValue2==LOW){ g_trackstate=1;spin_right(200,200);//luz250,250delay(80);}//四路循迹引脚电平状态//0X00//0X01//0X10//处理左锐角和左直角的转动elseif(TrackSensorLeftValue1==LOW&&(TrackSensorRightValue1==LOW||TrackSensorRightValue2==LOW)){ g_trackstate=2;spin_left(200,200);//luz250,250delay(80);}//0XXX//最左边检测到elseif(TrackSensorLeftValue1==LOW){ g_trackstate=3;spin_left(160,160);//luz200,200//delay(10);}//XXX0//最右边检测到elseif(TrackSensorRightValue2==LOW){ g_trackstate=4;spin_right(160,160);//luz200,200//delay(10);}//四路循迹引脚电平状态//X01X//处理左小弯elseif(TrackSensorLeftValue2==LOW&&TrackSensorRightValue1==HIGH){ g_trackstate=5;left(0,176);//luz0,220}//四路循迹引脚电平状态//X10X//处理右小弯elseif(TrackSensorLeftValue2==HIGH&&TrackSensorRightValue1==LOW){ g_trackstate=6;right(176,0);//luz220,0}//四路循迹引脚电平状态//X00X//处理直线elseif(TrackSensorLeftValue2==LOW&&TrackSensorRightValue1==LOW){ g_trackstate=7;run(204,204);//luz255,255}else{ switch(g_trackstate) { }}//当为1111时小车保持上一个小车运行状态}6.摄像头舵机根据超声波测距距离的动作函数/***Functionservo_color_carstate*@brief舵机转向超声波测距避障行驶,led根据车的状态显示相应的颜色*@param[in]void*@param[out]void*@retvalvoid*@parHistory无*/voidservo_color_carstate(){floatdistance;//定义舵机位置变量和小车前方,左侧,右侧距离intiServoPos=0;intLeftDistance=0;//左方距离值变量LeftDistanceintRightDistance=0;//右方距离值变量RightDistanceintFrontDistance=0;//前方距离值变量FrontDistancecolor_led_pwm(255,0,0);//开红灯back(80,80);//避免突然停止,刹不住车delay(80);brake();//舵机旋转到0度,即右侧,测距servo_appointed_detection(0);delay(500);distance=Distance_test();//测距RightDistance=distance;//所测的右侧距离赋给变量RightDistance//printf("rightdistance:%d\n",RightDistance);//舵机旋转到180度,即左侧,测距servo_appointed_detection(180);delay(500);distance=Distance_test();//测距LeftDistance=distance;//所测的左侧距离赋给变量LeftDistance//printf("leftdistance:%d\n",LeftDistance);//舵机旋转到90度,即左侧,测距servo_appointed_detection(90);delay(500);distance=Distance_test();FrontDistance=distance;//所测前侧距离付给变量FrontDistance//printf("FrontDistance:%d\n",FrontDistance);if(LeftDistance<30&&RightDistance<30&&FrontDistance<30){//亮品红色,掉头color_led_pwm(255,0,255);spin_right(200,200); delay(700);}elseif(LeftDistance>=RightDistance)//当发现左侧距离大于右侧,原地左转{//亮蓝色color_led_pwm(0,0,255);spin_left(200,200); delay(350);}elseif(LeftDistance<RightDistance)//当发现右侧距离大于左侧,原地右转{//亮品红色,向右转color_led_pwm(255,0,255);spin_right(200,200); delay(350);}}7.小车根据超声波测距距离的运动控制/************模式3:超声波避障模式*************//***FunctionUltrasonic_avoidMode*@brief超声波避障模式*@param[in]void*@param[out]void*@retvalvoid*@parHistory无*/voidUltrasonic_avoidMode(){LeftSensorValue=digitalRead(AvoidSensorLeft);RightSensorValue=digitalRead(AvoidSensorRight);if(LeftSensorValue==HIGH&&RightSensorValue==LOW){spin_left(200,200);//右边探测到有障碍物,有信号返回,原地向左转 delay(200);}elseif(RightSensorValue==HIGH&&LeftSensorValue==LOW){spin_right(200,200);//左边探测到有障碍物,有信号返回,原地向右转 delay(200);}elseif(RightSensorValue==LOW&&LeftSensorValue==LOW){spin_right(200,200);//当两侧均检测到障碍物时调用固定方向的避障(原地右转)delay(200); }//距离大于50时前进,亮绿灯run(180,180);//250,250color_led_pwm(0,255,0);}elseif((distance>=30&&distance<=50)){LeftSensorValue=digitalRead(AvoidSensorLeft);RightSensorValue=digitalRead(AvoidSensorRight);if(LeftSensorValue==HIGH&&RightSensorValue==LOW){spin_left(200,200);//右边探测到有障碍物,有信号返回,原地向左转delay(200); }elseif(RightSensorValue==HIGH&&LeftSensorValue==LOW){spin_right(200,200);//左边探测到有障碍物,有信号返回,原地向右转delay(200); }elseif(RightSensorValue==LOW&&LeftSensorValue==LOW){spin_right(200,200);//当两侧均检测到障碍物时调用固定方向的避障(原地右转)delay(200); }//距离在30-50之间时慢速前进run(120,120);//180,180}elseif(distance<30)//当距离小于30时调用舵机颜色控制程序{servo_color_carstate();} }8.通过串口通信接收蓝牙微信控制程序的控制指令/***Functionserial_data_parse*@brief串口数据解析并指定相应的动作*@param[in]void*@param[out]void*@retvalvoid*@parHistory无*/voidserial_data_parse(){//解析上位机发过来的模式切换指令 if(StringFind((constchar*)InputString,(constchar*)"MODE",0)>0) { if(InputString[10]=='0')//停止模式 { brake(); g_CarState=enSTOP; g_modeSelect=1; BeepOnOffMode(); } else { switch(InputString[9]) { } delay(1000); BeepOnOffMode(); } memset(InputString,0x00,sizeof(InputString));NewLineReceived=0;return; } //非apk模式则退出// if(g_modeSelect!=1)// {// memset(InputString,0x00,sizeof(InputString));// NewLineReceived=0;// return;// } //解析上位机发来的舵机云台的控制指令并执行舵机旋转//如:$4WD,PTZ180#舵机转动到180度 if(StringFind((constchar*)InputString,(constchar*)"PTZ",0)>0) { intm_kp,i,ii;//寻找以PTZ开头,#结束中间的字符 i=StringFind((constchar*)InputString,(constchar*)"PTZ",0); ii=StringFind((constchar*)InputString,(constchar*)"#",i); if(ii>i) { charm_skp[5]={0}; memcpy(m_skp,InputString+i+3,ii-i-3); m_kp=atoi(m_skp);//将找到的字符串变成整型 servo_appointed_detection(180-m_kp);//转动到指定角度m_kp NewLineReceived=0; memset(InputString,0x00,sizeof(InputString)); return; } }//解析上位机发来的七彩探照灯指令并点亮相应的颜色//如:$4WD,CLR255,CLG0,CLB0#七彩灯亮红色 if(StringFind((constchar*)InputString,(constchar*)"CLR",0)>0) { intm_kp,i,ii,red,green,blue; charm_skp[5]={0}; i=StringFind((constchar*)InputString,(constchar*)"CLR",0); ii=StringFind((constchar*)InputString,(constchar*)",",i); if(ii>i) { memcpy(m_skp,InputString+i+3,ii-i-3); m_kp=atoi(m_skp); red=m_kp; } i=StringFind((constchar*)InputString,(constchar*)"CLG",0); ii=StringFind((constchar*)InputString,(constchar*)",",i); if(ii>i) { memcpy(m_skp,InputString+i+3,ii-i-3); m_kp=atoi(m_skp); green=m_kp; } i=StringFind((constchar*)InputString,(constchar*)"CLB",0); ii=StringFind((constchar*)InputString,(constchar*)"#",i); if(ii>i) { memcpy(m_skp,InputString+i+3,ii-i-3); m_kp=atoi(m_skp); blue=m_kp; color_led_pwm(red,green,blue);//点亮相应颜色的灯 NewLineReceived=0; memset(InputString,0x00,sizeof(InputString)); return; } }//解析上位机发来的通用协议指令,并执行相应的动作//如:$1,0,0,0,0,0,0,0,0,0#小车前进if(StringFind((constchar*)InputString,(constchar*)"4WD",0)==-1&& StringFind((constchar*)InputString,(constchar*)"#",0)>0){//puts(InputString);//小车原地左旋右旋判断if(InputString[3]=='1')//小车原地左旋{g_CarState=enTLEFT;}elseif(InputString[3]=='2')//小车原地右旋{g_CarState=enTRIGHT;}else{g_CarState=enSTOP;}//小车鸣笛判断if(InputString[5]=='1')//鸣笛{whistle();}//小车加减速判断if(InputString[7]=='1')//加速,每次加50{g_CarSpeedControl+=20;if(g_CarSpeedControl>200){g_CarSpeedControl=200;}}if(InputString[7]=='2')//减速,每次减50{g_CarSpeedControl-=20;if(g_CarSpeedControl<100){g_CarSpeedControl=100;}} //舵机左旋右旋判断/*if(InputString[9]=='1')//舵机旋转到180度{servo_appointed_detection(180);}if(InputString[9]=='2')//舵机旋转到0度{servo_appointed_detection(0);}*///点灯判断if(InputString[13]=='1')//七彩灯亮白色{g_lednum++;if(g_lednum==1){ color_led_pwm(255,255,255); } elseif(g_lednum==2) { color_led_pwm(255,0,0); } elseif(g_lednum==3){ color_led_pwm(0,255,0); } elseif(g_lednum==4) { color_led_pwm(0,0,255); } elseif(g_lednum==5) { color_led_pwm(255,255,0); } elseif(g_lednum==6) { color_led_pwm(0,255,255); } elseif(g_lednum==7) { color_led_pwm(255,0,255); } else { color_led_pwm(0,0,0); g_lednum=0; }}if(InputString[13]=='2')//七彩灯亮红色{color_led_pwm(255,0,0);}if(InputString[13]=='3')//七彩灯亮绿灯{color_led_pwm(0,255,0);}if(InputString[13]=='4')//七彩灯亮蓝灯{color_led_pwm(0,0,255);} if(InputString[13]=='5')//青色 { color_led_pwm(0,255,255); } if(InputString[13]=='6')//品红色 { color_led_pwm(255,0,255); } if(InputString[13]=='7')//黄色 { color_led_pwm(255,255,0); } if(InputString[13]=='8')//七彩灯灭掉{color_led_pwm(0,0,0);}//灭火判断if(InputString[15]=='1')//灭火{digitalWrite(OutfirePin,!digitalRead(OutfirePin));}//舵机归为判断if(InputString[17]=='1')//舵机旋转到90度{g_frontservopos=90;} //前后舵机前后左右转动 switch(InputString[9]) { casefront_left_servo:g_frontservopos=180;break; casefront_right_servo:g_frontservopos=0;break; caseup_servo:g_ServoState=enSERVOUP;break; casedown_servo:g_ServoState=enSERVODOWN;break; caseleft_servo:g_S

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论