• 10.44 MB
  • 2022-04-29 13:59:54 发布

基于开源硬件的 Wi-Fi四驱小车毕业论文.pdf

  • 35页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'学士学位论文基于开源硬件的Wi-Fi四驱小车姓名:夏熙院系:计算与应用数学系学号:PB11001114导师:刘利刚教授完成时间:二〇一五年六月 UniversityofScienceandTechnologyofChinaAdissertationforbachelor’sdegreeBasedonOpenSourceHardware’sWi-FiFour-Wheel-DriveCarAuthor:XiXiaDepartment:StudentID:PB11001114Supervisor:Prof.LigangLiuFinishedTime:June,2015 中国科学技术大学学士学位论文致谢在中国科技大学完成本科学业的四年里,我所从事的学习和研究工作,都是在导师以及系里其他老师和同学的指导和帮助下进行的。在完成论文之际,请容许我对他们表达诚挚的谢意。首先感谢导师刘利刚教授多年的指导和教诲,是他把我带到了计算机图形学的研究领域。刘老师严谨的研究态度及忘我的工作精神,刘老师认真细致的治学态度及宽广的胸怀,都将使我受益终身。感谢班主任张瑞老师多年的关怀。感谢任广斌、宋光天、谭立湘等老师,他们在本科大一、大二阶段的指导给我大三、大四阶段的研究工作打下了基础。感谢王士玮、王春雪、王康、吴美娟等师兄师姐们的指点和照顾;感谢陈典、贺烈、夏潮、路寒、高瑞良等几位同班同学,与你们的讨论使我受益良多;特别感谢实验室的孙翰同学对我提供的帮助,我们在1207实验室共同学习共同生活,一起走过了这段愉快而难忘的岁月。感谢科大,感谢一路走过来的兄弟姐妹们,在最宝贵年华里,是你们伴随着我的成长。最后,感谢我家人一贯的鼓励和支持,你们是我追求学业的坚强后盾。夏熙2015年5月29日I 中国科学技术大学学士学位论文目录致谢I目录III表格索引V插图索引VII摘要IXABSTRACTXI第一章绪论11.1项目的目的11.1.1传统的扫描方式11.1.2自动扫描机器人11.2项目的开展11.2.1项目的开展11.2.2硬件平台的要求2第二章Arduino与步进电机32.1开源硬件32.2Arduino基础32.2.1Arduino简介32.2.2输入和输出32.2.3串口通讯42.3步进电机52.3.1常见电机52.3.2步进电机的使用和调试7第三章Wi-Fi通讯与Socket编程113.1Wi-Fi通讯113.1.1红外、蓝牙和Wi-Fi对比113.1.2WiFi模块的选择113.1.3AT指令集的使用133.2Socket编程153.2.1Socket简介153.2.2Socket常用函数16III 中国科学技术大学学士学位论文第四章总结与展望174.1总结174.2展望174.2.1硬件改进174.2.2算法展望18参考文献19IV 中国科学技术大学学士学位论文表格索引3.1AT指令列表...............................15V 中国科学技术大学学士学位论文插图索引2.1ArduinoUNO主板............................42.2传统的Arduino工作方式........................42.3串口通讯.................................52.4串口通讯测试..............................52.5直流电机.................................62.6舵机....................................62.7步进电机.................................62.8A4988步进电机驱动模块........................72.9A4988驱动模块的接口.........................72.10A4988与Arduino的连接........................82.11A4988的步进模式接法.........................82.12步进电机运转测试接线.........................92.13步进电机运转测试代码一........................92.14步进电机运转测试代码二........................93.1ArduinoYun................................123.2使用模块时的连线方式.........................133.3升级固件时的连线方式.........................133.4固件升级界面..............................143.5AT指令测试一..............................153.6AT指令测试二..............................153.7AT指令测试三..............................154.1Wi-Fi四驱小车..............................17VII 中国科学技术大学学士学位论文摘要我们搭建了一个可用于搭载3D扫描设备的开源硬件平台,具体表现为能与计算机进行Wi-Fi通讯的四驱小车。为了能控制小车的运动,处理Wi-Fi通讯的数据,我们选择了开源单片机Arduino作为控制主板。它能接收到来自Wi-Fi转串口模块的指令,同时解释指令后来控制电机的转动,以此来实现小车的前进、后退以及转向。为了使小车的运动更加精确可控,我们抛弃了传统的直流电机,改用两相混合式步进电机。该电机最大的特点就是能精确控制其转动的角度,以到达对小车前进距离和转向角度的精确控制。在Wi-Fi通讯方面,我们采用了使用简便的HLK-RM04工业级Wi-Fi转串口模块,并定制了模块的底板,使得模块能与Arduino主板实现直插。在我们的工作中,HLK-RM04模块起到了建立Wi-Fi服务器,等待计算机连接的作用,同时能将计算机传来的数据转换成Arduino能够识别的串口数据。对于计算机的连接,HLK-RM04模块采用了传输层的TCP协议。计算机建立一个TCP链接,连接到服务器的8080端口,即可实现与模块的连接。我们在计算机端采用Socket编程,实现TCP连接的建立,并传输控制指令,最终控制小车按我们的想法运动。关键词:Arduino单片机,Wi-Fi转串口模块,步进电机,Socket编程,智能小车IX 中国科学技术大学学士学位论文ABSTRACTWebuiltanopensourcehardwareplatformwhichcanbeusedtocarrya3Dscan-ningdevices.Actually,itisafour-wheeldrivecarequippedwithWi-Fitocommunicatewithcomputer.InordertocontrolthevehiclemovementandprocessdateofWi-Ficom-munication,wechosetheopen-sourceArduinomicrocontrollerasthecontrolboard.ItcanreceiveordersfromWi-Fitoserialmodule,thenexplainscommandstocontroltherotationofthemotor.Inthisway,wecancontrolthecartogoforward,backwardorturnaround.Inordertomakethecar’smotionmoreprecise,weabandonedthetra-ditionalDCmotorsusingtwo-phasehybridsteppermotorstosubstitute.Oneofthebiggestfeatureofthesteppermotorsisthatthemotorcanpreciselycontroltheangleofrotation,soastomakethemovementofcarmoreprecise.IntheWi-Ficommunication,weusedtheHLK-RM04industrialWi-Fitoserialmodulewhichiseasytouse.Andwecustomizedbaseboradofmodule,soit’sabletodirectlyinsertintoarduino.Keywords:ArduinoSCM,Wi-FitoSerialModule,StepperMotor,SocketProgram-ming,SmartCarXI 中国科学技术大学学士学位论文第一章绪论随着现代电子硬件不断向高计算能力、小体积、低能耗、开源化方向发展。越来越多的创客们有能力自己设计、组装或是改造一些开源硬件,以实现一些新奇的想法和有趣的点子。作为经常与计算机打交道的计算数学专业学生,除去我们擅长的算法之外,我们同样离不开一些硬件的支持,加上近年来3D扫描和3D打印越来越有热度,开发一套可编程的硬件平台来支持3D扫描很有必要。1.1项目的目的1.1.1传统的扫描方式传统的3D扫描主要借助一些手持式的设备,对待扫描的物体进行全方位扫描。可能存在的问题包括手持的稳定性,扫描的方位和角度的无法自动判断。除此之外,对于大型的室内场景,需要较长的扫描时间。手持式的设备需要操作人员长时间的工作,一方面耗费人力,另一方面可能会随着时间较长降低稳定性和精准性。1.1.2自动扫描机器人我们希望能开发一个能自动对室内场景进行3D扫描的机器人,它能自动的智能优化扫描路径,对还需进行采集的部位重点扫描,已经有足够数据的部位则减少扫描或不需再去扫描,同时,相别与手持设备固定于其上的摄像头能较稳定的完成工作,长时间的扫描也不会降低其准确性。自动化的扫描方式更能节省人力。这个想法具有很强的实用价值。首先是在虚拟现实中的应用。想象一下如果你能在游戏中置身于你所熟悉的真实场景,那该是一件多么有趣的事情。或者是房地产商能让顾客观察到真实的室内三维模型。第二是在实用家电中的应用。例如,现在市面上的普通扫地机器人,主要通过碰撞后的随机转向来遍历整个室内。但是这样可能造成一些地方没有打扫到或者是有些地方重复扫了很多次。要是能在扫地机器人上配备有能重建室内三维场景的算法,它就能根据它走过的路线来智能的选择接下来要去打扫的地方,大大的提高了打扫的效率,并且能尽量不留死角。该设想还可能有很多应用,就不一一列举。1.2项目的开展1.2.1项目的开展为了达成这一目标,主要要开展两方面的工作:第一,搭建一个属于我们自己的可编程硬件平台,计算机能控制其运动,并在其上搭载3D扫描装置。同1 中国科学技术大学学士学位论文时这个平台必须具有一定的运动精度和稳定性。第二,通过与计算机的交互,编写算法智能的完成扫描工作并在计算机上重建出三维场景。基于以上目的,本篇毕业设计的目的,即是搭建可编程的硬件平台。扫描的算法可留待以后进一步探究。1.2.2硬件平台的要求为了完成上述工作需求,我们的硬件平台应具有以下功能:1.拥有充分的稳定性。包括轮子与底盘的稳定性、运动的稳定性以及在其上固定的扫描装置的稳定性。2.能与计算机之间进行稳定可靠的通讯。3.计算机能对其运动进行精确控制。鉴于上述功能,我们决定设计一个能与计算机进行Wi-Fi通讯的四驱小车,以后可以在其上安装我们的扫描设备。在考察市面上常见的单片机后,我们选择了Arduino作为我们的控制主板,用来控制电机的工作并处理通讯数据。Arduino具有开源、价格低廉、有良好的社区支持等特点,非常适合没什么电路基础的人开发项目。电机方面为了精确运动的需要,采用能精确控制转动角度的工业级步进电机。与步进电机相对应的是常见的直流电机,其特点为一旦接上电源就会不断的朝某个方向转动,直到停止供电为止。这样,装有直流电机的小车的运动距离只与通电时间有关,不易精确控制小车前进的距离。与之不同的是,步进电机能根据脉冲信号的频率和脉冲数决定电机的转速和停止的位置。故可以通过控制脉冲个数来控制角位移量,通过控制脉冲频率来控制电机转动的速度和加速度。串口是串行接口的简称,是指把数据位一位一位地按顺序传送的通讯方式,其结构简单,仅需一根线就能实现双向通讯,但是传送数据较慢。Arduino由于结构简单只能通过串口通信,为了使Arduino的串口能与计算机进行通讯,我们采用HLK-RM04Wi-Fi转串口模块将计算机端的Wi-Fi通讯数据转换能被Arduino处理的串口数据。下面将分章节介绍上述硬件的搭建与使用,并简单介绍PC端软件的控制效果。2 中国科学技术大学学士学位论文第二章Arduino与步进电机2.1开源硬件开源硬件是指与开源软件(自由发布与开放源代码)相同方式设计的计算机和电子硬件。开源硬件旨在考虑软件之外的领域的开源,是开源文化的一种表示形式。其中,Arduino的诞生可谓是开源硬件发展历史上的一个新的里程碑。硬件的开源主要指的是开放详细的硬件设计,如电路图、使用的材料、电路板的布局等。除此之外,开源硬件通常采用开源软件来驱动。开源硬件能让人们更容易开发自己的产品。例如一些工业产品的雏形设计,早期并不用考虑硬件的定制,即可利用开源硬件来验证产品的可行性。而像我们这样的学生也能尝试到DIY硬件带来的乐趣,特别是在遇到某些不知原因的问题时,能从硬件设计中找到答案,这对我们的学习和研究无疑都有很多好处。2.2Arduino基础2.2.1Arduino简介作为开源硬件的代表之一的Arduino,拥有庞大的社区资源,大量的在线教程和示例,以及丰富的外部模块能对其进行扩展。虽然其本身计算能力和内存都有不足,但是能通过Wi-Fi模块的扩展将数据存储和计算工作都交由计算机完成。由于Arduino的设计初衷就是希望能方便的与不同传感器进行交互,而不需要再额外的设计其他复杂的电路,故而不需要太多电路知识就能上手,非常适合非专业的数学系学生,并且其本身的功能就已经足够支撑我们的项目了。图2.1是市面上最常见的Arduino主板。Arduino作为一个单片机,有自己的CPU、内存以及输入输出。它能从传感器处获得数据,进行简单的运算,并且将计算结果通过输出口传递给一些能发生状态改变的器件,如LED灯、蜂鸣器、电机等。图2.2是传统的Arduino工作方式,即从继电器读取电压来控制控制LED闪烁的频率。2.2.2输入和输出在数字电子的时间里,输入和输出是最基本也是使用最多的功能。Arduino同样也能完成常见的输入和输出功能。常见的ArduinoUNO主板上有14个数字I/O口,6个模拟数据读入口。其中的数字输出口类似于开关,你可以将其打开或者关闭。打开所对应的状态为高电平(5V),而关闭所对应的状态为低电平(0V)。电子器件能捕获到高电平或低电平状态,例如:LED在高电平下表现为亮起,而在低电平下表现为熄灭。除了输出高低电平外,Arduino主板还能捕获3 中国科学技术大学学士学位论文图2.1ArduinoUNO主板图2.2传统的Arduino工作方式到所连电路上的高低电平状态,即为数字输入。例如:Arduino能感知到一个开关是处于高电平状态还是处于低电平状态,从而改变对LED的数字输出,起到开关控制小灯的目的。注意到,这与传统的通过断开电路使得小灯没有电流流过而熄灭的方式有所不同,存在数字输入和输出的过程,并且Arduino在其中起到了一个判断的作用。说完数字输入与输出,就该讲到模拟输入和输出。模拟信号与数字信号的不同之处就像数学中连续和离散的区别,模拟信号主要指振幅和相位都连续的信号,而数字信号是指幅度取值是离散的,并且幅值别限定在有限个数值之类。Arduino的模拟信号读入口A0A6能将所读取的电压映射到01023之间,例如,先通过光敏电阻将光照强度转化为电阻的变化,再通过测量电阻一端即可换算出当前光照强度。对于模拟信号的输出,Arduino采取了一种称为PWM调制的技术。PWM被称为脉冲宽度调制,其目的是通过数字信号输出来控制模拟电路,通过利用微处理器来改变方波占空比达到这一目的。简单的解释一下,例如我们需要输出某时刻为2.5V的数字信号,但是由于Arduino只能输出5V的高电平和0V的低电平。于是PWM即采用在一个小单位时间中5V和0V各占一半的方式,来逼近这个2.5V的信号。通过PWM调制,Arduino能连续的控制一些电子元件工作,如:可以控制LED的亮度,蜂鸣器的响度和频率,电机转动的快慢等。值得一提的是,Arduino的14个数字I/O口中,只有6个拥有PWM调制功能,其余8个口只能进行普通的数字输出功能。2.2.3串口通讯串口通讯是指计算机和外设或计算机间通过信号线,按位进行数据传输的一种方式,即数据是一位一位的传输或接收。这种通讯方式只用使用较少的数据线,可以减少通讯的成本。与串口通讯相对的是并行通讯,并行通讯能将一组数据的各个数据位分别同时在多条线上传输,提高了传输效率和传输速度。但是并行通讯也存在通讯成本高和抗干扰能力差等问题。Arduino本身只支持串口通讯,故而在涉及与Arduino通讯的时候,因尽量考虑通讯内容的简短。例如在我们的应用中,主要通过计算机向Arduino传输4 中国科学技术大学学士学位论文图2.3串口通讯图2.4串口通讯测试运动的方向和步长。方向可以用一个字节来表示,并用少数几个字节的数字来表示步长。故Arduino的串口通讯虽然速度不那么快,但是能满足我们的需求,同时结构简单方便使用。如图2.3,Arduino在初始化部分打开了串口并以波特率9600进行通讯,之后在循环部分将通讯的内容读出又重新写入了串口中,之后又向串口发送了一个OK,完成了一个回显的过程。我们可以在计算机上进行测试,打开串口与网络通讯测试软件USR-TCP232-TEST,调整好串口号和波特率,输入test,得到结果如图2.42.3步进电机通过之前的介绍可以发现,使用Arduino可以做出很多有趣的小玩意。比如:监控室内的温度、湿度,自制小乐器(根据手的位置发出不同频率的声音)等。根据我们的需求,我们需要让Arduino从计算器读入数据而不是从传感器,而处理后的数据需要传递给电机并控制其运动。我们首先考虑的是Arduino如何驱动电机运动,之后再来考虑如何用计算机控制电机运动。2.3.1常见电机Arduino上经常使用的电机主要有直流电机、步进电机和舵机。2.3.1.1直流电机直流电机是一种最常见的电机,很多玩具小车上都采用的是直流电机。其特点是结构简单,仅需接上电源就可转动。转动的方向取决于电源正负极所接的位置,而转动的快慢则取决于电源电压的高低。通过Arduino控制直流电机,5 中国科学技术大学学士学位论文图2.5直流电机图2.6舵机图2.7步进电机可使用PWM调制技术来调整电机转动的快慢,即相当于改变加载在直流电机两端的电压。很自然的,直流电机是我们考虑小车运动时的第一选择。可是实际使用后发现,直流电机有一个很大的缺点,它的转动与否完全取决于是否通电,但需要精确控制运动距离时,直流电机显得无能为力。因为,通过计算通电时间来控制运动距离是很不精确的,加上通讯可能存在的延迟,装上直流电机的小车会比我们预想的跑得更远。2.3.1.2舵机为了改进上述问题,我们曾经考虑过舵机。舵机是一种为玩具汽车和飞机设计的电机,它不会像直流电机那样一直转圈,而是能根据你的指令旋转到0至180度之间的任意一个角度停下。舵机控制方便,很容易实现,使用它和直流电机的组合曾是我们考虑过的一种解决方案。类似于汽车那样,将前轮使用舵机来控制转向,而后轮使用直流电机来驱动。可是直流电机的精确性还是无法保证,仅仅将前轮换为舵机是不够的。舵机除了可用作小车转向之外,更重要的用处应该是将来在装上3D扫描仪后用来控制扫描仪的转向,就像人的眼睛一样是扫描仪能朝向各个方向采集数据。2.3.1.3步进电机步进电机的主要特点是将电脉冲转化为角位移,当步进电机驱动模块接收到一个脉冲,它就会驱动步进电机按给定的放向转动一个固定的角度(称为步进角)。而我们可以通过控制控制脉冲的个数来控制角位移,即步进电机转过的角度,从而达到精确定位的目的。除此之外,还可通过控制脉冲的频率来控制步进电机的速度和加速度,达到对小车运动的精确控制。步进电机在很多其他的领域也有广泛应用,如我们熟悉的三维打印机上的喷头就是由步进电机控制,从而能达到对模型的精确打印。在考察市场上常见的步进电机后,我们采用了采用了四个42系列两相混合式步进电机,其步距精度为5%,步距角为1.8°,轴径为5mm,轴长为19mm,机身长度为31mm,额定电流为1.2A,电机重量约为0.3kg。6 中国科学技术大学学士学位论文图2.8A4988步进电机驱动模块图2.9A4988驱动模块的接口为了驱动步进电机,还需要有步进电机驱动模块。这里选用了能与Arduino控制板完美结合的A4988驱动模块。A4988模块是一个内置简单操作转换的微电机驱动器。它设计用以控制两相步进电机在全,半,四分之一,八分之一和十六分之一下步进模式,具有高达35V和±2A输出驱动能力。A4988包括一个固定关断时间电流稳压器,具有可在慢或混合衰减模式下工作的能力。A4988只需在一个步进输入中输入一个脉冲,即可驱动电动机产生一个微步,而无需相位顺序表,高频率控制行或复杂的界面。在一个复杂的微处理器不可用或负担过重的时候,A4988模块将是一种理想的选择。2.3.2步进电机的使用和调试要想让步进电机成功的运转,就离不开驱动模块。我们采用的A4988模块具有16个接口,可以完成不同的功能。图2.8是A4988模块的实物图,图2.9是模块的16个接口。了解了模块的接口后,我们可以按照图2.10将模块与Arduino以及步进电机连接。其中,1A、1B、2A、2B是步进电机上带有的四个接口,按顺序与模块连接即可。剩下的EN、MS1、MS2、MS3全部接地,此即为全步进模式(转一圈需要200个步进值)。如果要求更高的精度,我们可以选择1/4步进模式(转一圈需要800个步进值),此时则需将MS1接高电平,而MS2、MS3依旧接地。剩下各种接线方法可参照图2.11。了解了基础的接线之后,即可对步进电机的工作进行测试。其中使用到Arduino、A4988模块、步进电机、面包板、12V直流电源以及导线若干。实验接线如图2.12。其中模式选择为全步进模式,即MS1、MS2、MS3全部接地。步进电机的蓝线、红线、黑线和绿线依次接在A4988模块上的2A、2B、1A、1B端。Arduino端的测试代码如图2.13、图2.14所示。这个测试程序的目的和简单,即先让步进电机反转8圈step(true,1600);延7 中国科学技术大学学士学位论文图2.10A4988与Arduino的连接图2.11A4988的步进模式接法迟1秒后delay(1000);再正转8圈step(false,1600)。我们可以发现步进电机确实按照我们所设想的方式运动,对其转动圈数的控制也很准确,测试结果非常成功。8 中国科学技术大学学士学位论文图2.12步进电机运转测试接线图2.13步进电机运转测试代码一图2.14步进电机运转测试代码二9 中国科学技术大学学士学位论文第三章Wi-Fi通讯与Socket编程3.1Wi-Fi通讯在传统的Arduino的应用中,Arduino是从传感器中读入数据,并输出到LED、电机等做工原件上的。而在我们的应用中,Arduino需要从计算机的控制程序处读取控制步进电机运动的步进数已经运动方向。而传统的Arduino与计算机通讯的方法为串口通讯,需要借助串口通讯软件以及数据线。但是,为了远程控制我们的小车,数据线是显得不合适的。解决方案就是采用一些远程控制方式,如:红外遥控、蓝牙和Wi-Fi等。3.1.1红外、蓝牙和Wi-Fi对比红外遥控的发射电路采用红外发光二极管发出经过调制的红外光波;红外接收电路则由红外接收二极管、三极管或硅光电池组成,它们将红外发射器发射的红外光转换为相应的电信号,再送后置放大器。(百度百科)。红外线信息传输可靠,功耗低,成本低只需要一个很小的模块就能发射和接收。但是不具有穿过障碍去控制对象的能力,故在物品较多的室内无法对小车很好的控制。除此之外,普通计算机不带收发红外线的功能,需要外置设备也是一个缺点。蓝牙是一种无线技术标准,频段为24002483.5MHZ。蓝牙使用跳频技术,将传输的数据分割成数据包,通过79个指定的蓝牙频道分别传输数据包。每个频道的频宽为1MHz。蓝牙4.0使用2MHz间距,可容纳40个频道。第一个频道始于2402MHz,每1MHz一个频道,至2480MHz。蓝牙的主要特点有价格低廉易于使用,但是传输距离短(10米)。同红外遥控一样,有些电脑并不具有蓝牙设备需要外接蓝牙适配器。Wi-Fi是另一种常见的无线网络通信标准,它与蓝牙工作在相同的频段,相互之间有所干扰。与蓝牙不同,Wi-Fi中的AP建立真正的局域网供其他设备连接。其特点是传输速率较高(11Mbps)、传输距离长(100米)、保密性好、通信可靠(抗干扰和抗多径干扰强)。鉴于以上三种通讯技术的综合考虑,首先排除红外遥控,主要因其必须点对点的可视遥控,无法绕过障碍物。而蓝牙与Wi-Fi相比传输距离较短,可能不满足今后的需求,并且蓝牙需要另配适配器。故Wi-Fi是我们选作小车与计算机通讯的最终选择,其特点更适合我们的工作需求。3.1.2WiFi模块的选择上述三种通讯方式都不是Arduino本身带有的,都需要外接模块来实现。其中红外遥控和蓝牙由于结构简单,模块也较为简单,比较容易实现与Arduino11 中国科学技术大学学士学位论文图3.1ArduinoYun的连接。而Wi-Fi功能较复杂,结构也较复杂故Arduino开发板一般不支持Wi-Fi。市面常见的解决方案有:ESP8266、HLK-RM04、ArduinoYun等。ArduinoYun是Arduino团队官方发布的支持Wi-Fi的Arduino主板,它是基于Atmega32u4和Ar9331的微控制器。与传统的ArduinoUNO不同的是,ArduinoYun上实际运行着两个操作系统。Atmega32u4芯片运行着传统的Arduino系统,而创新的Ar9331上运行着一个名叫Linino的OpenWrtLinux系统。Yun的有线网络、Wi-Fi、USBHost、microSD等功能都由Ar9331控制,并且Ar9331拥有400MHz的主频,远超传统ArduinoAtmega32u4芯片的16MHz处理能力,使得ArduinoYun实行一些更为复杂的算法成为可能。ArduinoYun拥有以上众多好处,可是并未被本次项目采用,主要原因有:1.项目成立之初,学习和实验的主板都是ArduinoUNO,因此对ArduinoUNO非常熟悉。2.ArduinoYun的成本较高,相对于几十元就能买到的ArduinoUNO,ArduinoYun的成本大约在五百元左右。但是随着后续项目的开展,加上我们已经对其他硬件比较了解,以后换上ArduinoYun作为控制板还是很有必要的。在项目的实际进展中我们考虑了ESP8266模块和HLK-RM04模块,并将其都买了回来进行测试。OCROBOTSEED基于ESP8266芯片平台,是网上能找到的最低廉的WIFI串口解决方案模块,其结构简单,只有四根接线口,两根电源线,两根信号传输线。其工作电压为3.3V,可以直接用Arduino主板对其进行供电,另外将两根信号传输口分别接到Arduino主板的两个I/O口上,即可完成将Wi-Fi信号转换成Arduino能识别的串口信号的功能。12 中国科学技术大学学士学位论文图3.2使用模块时的连线方式图3.3升级固件时的连线方式因为ESP8266的固件版本一直在不断的快速升级中,而市面上买到的模块不可能紧跟官方的固件版本,故而在实际使用中需要更新固件。在实际测试中,我所购买的模块只有更新到0.93版本的固件后才能正确的进入AP+Station共存模式。在固件升级模式中,为了与电脑连接需要在模块上另接一个USB转串口模块,这是因为OCROBOTSEED模块也只能接受串口数据。为此,我们选择了CP2102USB转串口模块,图3.2、图3.3是接线方式。注意到,升级固件的原理就是将相应的二进制文件烧写到ROM中的相应的地址位上,要保证bin文件和地址的对应,选择好串口号和波特率即可开始烧写。图3.4显示的烧写固件的软件界面。与ESP8266模块相比,HLK-RM04增加了以太网的功能,将Wi-Fi的部分配置直接集成在了板上,可以通过浏览器访问并进行设置,避免了使用基础的AT指令,缩短了Arduino端的代码编写。两者在基础功能上基本相同,只不过HLK-RM04集成度更高,使用更简便,在实际项目中可以考虑使用HLK-RM04模块。3.1.3AT指令集的使用AT指令集是终端设备之间连接与通信的一种指令,可通过串口通讯传递给Wi-Fi模块,其基础格式为:AT+[command]=[value]例如:”AT+remoteip=192:168:11:254”,设置远端IP地址为192.168.11.254例如:”AT+netmode=3”,设置网络模式为AP模式例如:”AT+dhcpc=1”,打开DHCP协议,即自动给连接上模块的设备分配13 中国科学技术大学学士学位论文图3.4固件升级界面IP地址HLK-RM04支持的其他AT指令可参见表3.1,下面对ESP8266模块进行AT指令测试,见图3.5、图3.6、图3.7。在测试过程中,我们首先通过AT+CWMODE=3将模块设置为softAP和station共存的模式。然后,用AT+RST重启模块使设置生效,之后用AT+CWJAP=”ssid”;”password”连接已有的无线路由器。接下来利用AT+CIFSR查询模块的IP地址,用AT+CIPSTART=”TCP”;”192:168:1:104”;8080建立TCP连接。注意到我们之前已经在计算机上开启了一个监听8080端口的TCP服务器。最后我们使用AT+CIPSEND=4来传输4个字节的数据”test”,之后便可在服务器端接收到”test”。至此关于AT指令的测试已经成功,完成了数据的传输。但是我们可以发现,由于AT指令是非常底层的指令,在实际使用中显得比较繁琐。为了简化使用的过程,HLK-RM04模块已经将很多设置的部分都放在了网页端,可以通过浏览器访问来设置,大大简化了使用过程,使得我们可以在连接上模块后即开始数据通讯。这也是我们最终考虑使用HLK-RM04模块替代ESP8266模块的缘故。14 中国科学技术大学学士学位论文表3.1AT指令列表指令名说明netmode网络模式wifi_confWi-Fi配置dhcpcDHCP客户端配置net_ip网络IP地址net_dns网络DNS地址dhcpdDHCP服务器端配置dhcpd_ipDHCP服务器IP地址remoteport本地或远端端口号remotepro网络协议类型timeout网络超时时间mode网络模式uart串口配置uartpacklen串口组帧长度uartpacktimeout串口组帧时间default恢复出厂设置rebot重启模块ver模块版本图3.5AT指令测试一图3.6AT指令测试二图3.7AT指令测试三3.2Socket编程在之前的测试中我们使用了USR-TCP232-Test软件自带的建立TCP服务器和TCP客户端的功能。但是在我们今后的应用当中,需要自己编写程序来连接Wi-Fi模块。因此,在之前的基础上,我们需要进一步学习C语言的Socket编程,以实现网络通讯。3.2.1Socket简介Socket又叫套接字,是指网络上的两个进程通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个Socket。Socket类似于电话插座,电话通信的双方即不同计算机上的两个进程,任何人在通话之前首先要占用一个电话,相当于申请了一个Socket;同时要知道对方的电话号码,即知道对方Socket的地址,之后才能进行呼叫。对方拿起话筒后,连接正式建立,之后就15 中国科学技术大学学士学位论文是Socket之间的数据传输。当通话结束后,一方挂上电话,即关闭Socket,之后连接断开。Socket使网络通讯设施对用户透明,用户不用关心数据通讯的细节,只用知道对方的Socket并建立连接就可以了。所以,Socket实际上提供了进程通信的端点。进程通信之前必须各自创建一个端点,正如打电话之前需要有电话机一样。3.2.2Socket常用函数intsocket(intfamily;inttype;intprotocol);首先要提到的就是Socket的构造函数。其中的family用来决定是使用IPv4协议族还是IPv6协议族;type决定是使用流式Socket还是数据包Socket,其中流式Socket应与TCP协议配合使用而数据包Socket应与UDP协议配合使用;protocol参数则决定使用的协议。intconnect(intsockfd;conststructsockaddrservaddr;socklentaddrlen);之后要用到的就是connect函数。connect用于客户端与服务器建立TCP连接。如果有需要,内核会为客户端选择合适的IP地址和端口,此函数初始化三次握手,当连接建立或发生错误后返回。注意:connect失败后,原来的sockfd将不再可用必须关闭,创建一个新的sockfd用于连接。intsend(SOCKETs;constcharbuf;intlen;intflags);intrecv(SOCKETs;charbuf;intlen;intflags);连接建立之后,客户端可以通过send函数以及recv函数与服务器进行通讯。发送和接收的数据的格式和长度都能在程序中进行自定义,从而我们可以简单的通过发送“q100”命令小车向前一百个单位,Arduino通过Wi-Fi模块接收到命令,并将命令转换为与之对应的步进值去驱动步进电机转动。通过实验我们最终能精确的测量出小车每前进一米对应对于多少个步进值,以及转过给定角度需要两边的步进电机分别以多少的步进频率运动。到此,我们通过计算机精确控制小车的目的已经达到。16 中国科学技术大学学士学位论文第四章总结与展望4.1总结通过对不少开源硬件的学习和组装,我们最终完成了基础硬件平台的搭建。最终效果图见图4.1。其具有两个基本的功能,即运动精度和计算机可控。为此我们主要开展了两方面的工作:学习使用步进电机,并以其为基础带动小车的运动;学习使用了Wi-Fi模块与计算机的通讯,完成计算机对小车的控制。步进电机这一块主要涉及了:步进电机与底盘的安装;驱动模块的使用以及连线;Arduino端控制程序的编写。Wi-Fi通讯这一块又主要涉及:Wi-Fi模块的选择;Wi-Fi与串口通讯的测试;计算机端Socket编程实现TCP连接;计算机控制软件的编写。可以说,上述的所有工作都并不困难,但是对于我来说都是一个全新的方面,在其中能学会不少新知识,为今后项目的进展打下坚实的基础。虽然说这些工作都有前人做过,但是能亲自走通一遍,对今后的扫描机器人项目也有很大的帮助。更能根据我们最终扫描机器人的需求,来定制和改造我们的硬件,使之更贴合我们的需求。4.2展望4.2.1硬件改进除了一些收获,可以看到我们的硬件平台还有很多进步空间。首先是Arduino主板可以从ArduinoUNO换成集成Wi-Fi功能并且计算和存储能力都更强的ArduinoYun。有了之前的经验,更换主板将极为容易。图4.1Wi-Fi四驱小车17 中国科学技术大学学士学位论文第二,是对机器的整体布线进行安排,可以看到实验阶段的小车上绑着一块面包板,主要是为了安插两个A4988驱动模块来控制四个步进电机。但是由于连接的导线都是插在上面的,本身固定并不牢固。今后可以考虑将驱动模块焊在一块PCB板上,并将部分连线集成,同时留出一些接口。可以大大简化接线,是小车的布局更加简洁,连接更加牢固。第三,可以考虑改进电源。小车现在使用的是两块电池供电,其中一块12V的电池专门供给驱动模块,以驱动步进电机运动。另外一块9V的电源同时给Arduino和Wi-Fi模块供电。由于Wi-Fi模块功率较大,9V的电池很容易用完。今后更换ArduinoYun后可以考虑将两个电源合二为一,增加稳压芯片是得同一个电源既能驱动步进电机,又能使Arduino和Wi-Fi模块正常工作,不用担心烧坏主板和模块。4.2.2算法展望在巩固硬件平台后,接下来更重要的工作就是为小车编写算法使之拥有我们想要的功能。首先是自动扫描算法,对室内场景进行扫描建模。主要的困难包括如何智能的通过已采集的数据来指导小车的下一步数据采集,如何有效的传输采集到的数据等。第二,小车还需要加载自动避障功能。在完成室内扫描的过程中,小车难免会遇到一些障碍。如何利用已有的扫描数据有效的避开障碍也是一个值得思考的问题。如果小车能在避开障碍的时候兼顾到接下来将要扫描的路线,将会显得更加智能。第三,对于较大的室内空间,能否考虑多台小车协同完成扫描工作。以一种类似并行化的工作方式,将复杂庞大的室内场景较均匀的分担到每个小车上,并且使它们之间能有所交流,相互分享已采集到的数据,再通过汇总的数据来实时的指导每辆小车的路线。这将是一个很复杂的任务,值得我们花费时间进一步深入的研究与思考。18 中国科学技术大学学士学位论文参考文献[1]师访.Arduino入门到实战—学以致用系列丛书.[2]http://info.audio.hc360.com/2014/12/050935462351.shtml.蓝牙、红外与WiFi的区别你知多少?.[3]http://www.yfworld.com/?p=2188.ArduinoYun入手评测与基本配置指南.[4]http://www.guokr.com/article/5292/.DIYer修炼:舵机知识扫盲.[5]朗译电子科技德飞莱arduinoUNOR3套件说明书V1.0.[6]http://blog.163.com/angtylook@126/blog/static/838872482011102045251120/Socket常用函数.19'