1、学士学位论文基于开源硬件的 Wi-Fi 四 驱小车姓 院名: 系: 学号: 导师: 完成时间:2015年7月University of Science and Technology of ChinaA dissertation for bachelors degreeBased on Open Source Hardwares Wi-Fi Four-Wheel-Drive CarAuthor : Department : Student ID : Supervisor : Finished Time :June, 2015中国科学技术大学学士学位论文致谢在中国科技大学完成本科学业的四年里,我所
2、从事的学习和研究工作,都 是在导师以及系里其他老师和同学的指导和帮助下进行的。在完成论文之际, 请容许我对他们表达诚挚的谢意。首先感谢导师刘利刚教授多年的指导和教诲,是他把我带到了计算机图形 学的研究领域。刘老师严谨的研究态度及忘我的工作精神,刘老师认真细致的 治学态度及宽广的胸怀,都将使我受益终身。感谢班主任张瑞老师多年的关怀。感谢任广斌、宋光天、谭立湘等老师, 他们在本科大一、大二阶段的指导给我大三、大四阶段的研究工作打下了基础。感谢王士玮、王春雪、王康、吴美娟等师兄师姐们的指点和照顾;感谢陈 典、贺烈、夏潮、路寒、高瑞良等几位同班同学,与你们的讨论使我受益良多; 特别感谢实验室的孙翰同学
3、对我提供的帮助,我们在 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.2 Arduino
4、基础32.2.1 Arduino 简介32.2.2 输入和输出32.2.3 串口通讯42.3 步进电机52.3.1 常见电机52.3.2 步进电机的使用和调试7第三章Wi-Fi 通讯与 Socket 编程113.1 Wi-Fi 通讯113.1.1 红外、蓝牙和 Wi-Fi 对比113.1.2 WiFi 模块的选择113.1.3 AT 指令集的使用133.2 Socket 编程153.2.1 Socket 简介153.2.2 Socket 常用函数16III第四章总结与展望174.1 总结174.2 展望174.2.1 硬件改进174.2.2 算法展望18参考文献19IV表格索引3.1AT 指令
5、列表15V插图索引2.1Arduino UNO 主板42.2传统的 Arduino 工作方式42.3串口通讯52.4串口通讯测试52.5直流电机62.6舵机62.7步进电机62.8A4988 步进电机驱动模块72.9A4988 驱动模块的接口72.10 A4988 与 Arduino 的连接82.11 A4988 的步进模式接法82.12 步进电机运转测试接线92.13 步进电机运转测试代码一92.14 步进电机运转测试代码二93.1Arduino Yun123.2使用模块时的连线方式133.3升级固件时的连线方式133.4固件升级界面143.5AT 指令测试一153.6AT 指令测试二153
6、.7AT 指令测试三154.1Wi-Fi 四驱小车17VII摘要我们搭建了一个可用于搭载 3D 扫描设备的开源硬件平台,具体表现为能 与计算机进行 Wi-Fi 通讯的四驱小车。为了能控制小车的运动,处理 Wi-Fi 通讯 的数据,我们选择了开源单片机 Arduino 作为控制主板。它能接收到来自 Wi-Fi 转串口模块的指令,同时解释指令后来控制电机的转动,以此来实现小车的前 进、后退以及转向。为了使小车的运动更加精确可控,我们抛弃了传统的直流 电机,改用两相混合式步进电机。该电机最大的特点就是能精确控制其转动的 角度,以到达对小车前进距离和转向角度的精确控制。在 Wi-Fi 通讯方面,我 们
7、采用了使用简便的 HLK-RM04 工业级 Wi-Fi 转串口模块,并定制了模块的底 板,使得模块能与 Arduino 主板实现直插。在我们的工作中,HLK-RM04 模块 起到了建立 Wi-Fi 服务器,等待计算机连接的作用,同时能将计算机传来的数 据转换成 Arduino 能够识别的串口数据。对于计算机的连接,HLK-RM04 模块 采用了传输层的 TCP 协议。计算机建立一个 TCP 链接,连接到服务器的 8080 端口,即可实现与模块的连接。我们在计算机端采用 Socket 编程,实现 TCP 连 接的建立,并传输控制指令,最终控制小车按我们的想法运动。关键词: Arduino 单片机
8、,Wi-Fi 转串口模块,步进电机,Socket 编程,智能小 车IXABSTRACTWe built an open source hardware platform which can be used to carry a 3D scan- ning devices. Actually, it is a four-wheel drive car equipped with Wi-Fi to communicate with computer.In order to control the vehicle movement and process date of Wi-Fi com- mun
9、ication, we chose the open-source Arduino microcontroller as the control board. It can receive orders from Wi-Fi to serial module, then explains commands to control the rotation of the motor. In this way, we can control the car to go forward, backward or turn around. In order to make the cars motion
10、 more precise, we abandoned the tra- ditional DC motors using two-phase hybrid stepper motors to substitute. One of the biggest feature of the stepper motors is that the motor can precisely control the angle of rotation, so as to make the movement of car more precise. In the Wi-Fi communication, we
11、used the HLK-RM04 industrial Wi-Fi to serial module which is easy to use. And we customized baseborad of module, so its able to directly insert into arduino.Keywords: Arduino SCM, Wi-Fi to Serial Module, Stepper Motor, Socket Program- ming, Smart CarXI第一章绪论随着现代电子硬件不断向高计算能力、小体积、低能耗、开源化方向发展。 越来越多的创客们有
12、能力自己设计、组装或是改造一些开源硬件,以实现一些 新奇的想法和有趣的点子。作为经常与计算机打交道的计算数学专业学生,除 去我们擅长的算法之外,我们同样离不开一些硬件的支持,加上近年来 3D 扫 描和 3D 打印越来越有热度,开发一套可编程的硬件平台来支持 3D 扫描很有 必要。1.1项目的目的1.1.1传统的扫描方式传统的 3D 扫描主要借助一些手持式的设备,对待扫描的物体进行全方位 扫描。可能存在的问题包括手持的稳定性,扫描的方位和角度的无法自动判断。 除此之外,对于大型的室内场景,需要较长的扫描时间。手持式的设备需要操 作人员长时间的工作,一方面耗费人力,另一方面可能会随着时间较长降低稳
13、 定性和精准性。1.1.2自动扫描机器人我们希望能开发一个能自动对室内场景进行 3D 扫描的机器人,它能自动 的智能优化扫描路径,对还需进行采集的部位重点扫描,已经有足够数据的部 位则减少扫描或不需再去扫描,同时,相别与手持设备固定于其上的摄像头能 较稳定的完成工作,长时间的扫描也不会降低其准确性。自动化的扫描方式更 能节省人力。这个想法具有很强的实用价值。首先是在虚拟现实中的应用。想 象一下如果你能在游戏中置身于你所熟悉的真实场景,那该是一件多么有趣的 事情。或者是房地产商能让顾客观察到真实的室内三维模型。第二是在实用家 电中的应用。例如,现在市面上的普通扫地机器人,主要通过碰撞后的随机转
14、向来遍历整个室内。但是这样可能造成一些地方没有打扫到或者是有些地方重 复扫了很多次。要是能在扫地机器人上配备有能重建室内三维场景的算法,它 就能根据它走过的路线来智能的选择接下来要去打扫的地方,大大的提高了打 扫的效率,并且能尽量不留死角。该设想还可能有很多应用,就不一一列举。1.2项目的开展1.2.1项目的开展为了达成这一目标,主要要开展两方面的工作:第一,搭建一个属于我们 自己的可编程硬件平台,计算机能控制其运动,并在其上搭载 3D 扫描装置。同1时这个平台必须具有一定的运动精度和稳定性。第二,通过与计算机的交互, 编写算法智能的完成扫描工作并在计算机上重建出三维场景。基于以上目的, 本篇
15、毕业设计的目的,即是搭建可编程的硬件平台。扫描的算法可留待以后进 一步探究。1.2.2硬件平台的要求为了完成上述工作需求,我们的硬件平台应具有以下功能:1. 拥有充分的稳定性。包括轮子与底盘的稳定性、运动的稳定性以及在其上固 定的扫描装置的稳定性。2. 能与计算机之间进行稳定可靠的通讯。3. 计算机能对其运动进行精确控制。 鉴于上述功能,我们决定设计一个能与计算机进行 Wi-Fi 通讯的四驱小车,以后可以在其上安装我们的扫描设备。在考察市面上常见的单片机后,我们 选择了 Arduino 作为我们的控制主板,用来控制电机的工作并处理通讯数据。 Arduino 具有开源、价格低廉、有良好的社区支持
16、等特点,非常适合没什么电路 基础的人开发项目。电机方面为了精确运动的需要,采用能精确控制转动角度的工业级步进电 机。与步进电机相对应的是常见的直流电机,其特点为一旦接上电源就会不断 的朝某个方向转动,直到停止供电为止。这样,装有直流电机的小车的运动距 离只与通电时间有关,不易精确控制小车前进的距离。与之不同的是,步进电 机能根据脉冲信号的频率和脉冲数决定电机的转速和停止的位置。故可以通过 控制脉冲个数来控制角位移量,通过控制脉冲频率来控制电机转动的速度和加 速度。串口是串行接口的简称,是指把数据位一位一位地按顺序传送的通讯方式, 其结构简单,仅需一根线就能实现双向通讯,但是传送数据较慢。Ard
17、uino 由 于结构简单只能通过串口通信,为了使 Arduino 的串口能与计算机进行通讯, 我们采用 HLK-RM04 Wi-Fi 转串口模块将计算机端的 Wi-Fi 通讯数据转换能被 Arduino 处理的串口数据。下面将分章节介绍上述硬件的搭建与使用,并简单介 绍 PC 端软件的控制效果。2第二章Arduino 与步进电机2.1开源硬件开源硬件是指与开源软件(自由发布与开放源代码)相同方式设计的计算 机和电子硬件。开源硬件旨在考虑软件之外的领域的开源,是开源文化的一 种表示形式。其中,Arduino 的诞生可谓是开源硬件发展历史上的一个新的里 程碑。硬件的开源主要指的是开放详细的硬件设计
18、,如电路图、使用的材料、电 路板的布局等。除此之外,开源硬件通常采用开源软件来驱动。开源硬件能让 人们更容易开发自己的产品。例如一些工业产品的雏形设计,早期并不用考虑 硬件的定制,即可利用开源硬件来验证产品的可行性。而像我们这样的学生也 能尝试到 DIY 硬件带来的乐趣,特别是在遇到某些不知原因的问题时,能从硬 件设计中找到答案,这对我们的学习和研究无疑都有很多好处。2.2Arduino 基础2.2.1Arduino 简介作为开源硬件的代表之一的 Arduino,拥有庞大的社区资源,大量的在线教 程和示例,以及丰富的外部模块能对其进行扩展。虽然其本身计算能力和内存 都有不足,但是能通过 Wi-
19、Fi 模块的扩展将数据存储和计算工作都交由计算机 完成。由于 Arduino 的设计初衷就是希望能方便的与不同传感器进行交互,而 不需要再额外的设计其他复杂的电路,故而不需要太多电路知识就能上手,非 常适合非专业的数学系学生,并且其本身的功能就已经足够支撑我们的项目了。 图 2.1是市面上最常见的 Arduino 主板。Arduino 作为一个单片机,有自己的 CPU、内存以及输入输出。它能从传 感器处获得数据,进行简单的运算,并且将计算结果通过输出口传递给一些能 发生状态改变的器件,如 LED 灯、蜂鸣器、电机等。图 2.2是传统的 Arduino 工 作方式,即从继电器读取电压来控制控制
20、LED 闪烁的频率。2.2.2输入和输出在数字电子的时间里,输入和输出是最基本也是使用最多的功能。Arduino 同样也能完成常见的输入和输出功能。常见的 Arduino UNO 主板上有 14 个数 字 I/O 口,6 个模拟数据读入口。其中的数字输出口类似于开关,你可以将其打 开或者关闭。打开所对应的状态为高电平 (5V),而关闭所对应的状态为低电平 (0V)。电子器件能捕获到高电平或低电平状态,例如:LED 在高电平下表现为 亮起,而在低电平下表现为熄灭。除了输出高低电平外,Arduino 主板还能捕获3图 2.1Arduino UNO 主板图 2.2传统的 Arduino 工作方式到所
21、连电路上的高低电平状态,即为数字输入。例如:Arduino 能感知到一个开 关是处于高电平状态还是处于低电平状态,从而改变对 LED 的数字输出,起到 开关控制小灯的目的。注意到,这与传统的通过断开电路使得小灯没有电流流 过而熄灭的方式有所不同,存在数字输入和输出的过程,并且 Arduino 在其中 起到了一个判断的作用。说完数字输入与输出,就该讲到模拟输入和输出。模拟信号与数字信号的 不同之处就像数学中连续和离散的区别,模拟信号主要指振幅和相位都连续的 信号,而数字信号是指幅度取值是离散的,并且幅值别限定在有限个数值之类。 Arduino 的模拟信号读入口 A0 A6 能将所读取的电压映射到
22、 0 1023 之间,例如, 先通过光敏电阻将光照强度转化为电阻的变化,再通过测量电阻一端即可换算 出当前光照强度。对于模拟信号的输出,Arduino 采取了一种称为 PWM 调制的 技术。PWM 被称为脉冲宽度调制,其目的是通过数字信号输出来控制模拟电 路,通过利用微处理器来改变方波占空比达到这一目的。简单的解释一下,例 如我们需要输出某时刻为 2.5V 的数字信号,但是由于 Arduino 只能输出 5V 的 高电平和 0V 的低电平。于是 PWM 即采用在一个小单位时间中 5V 和 0V 各占 一半的方式,来逼近这个 2.5V 的信号。通过 PWM 调制,Arduino 能连续的控 制一
23、些电子元件工作,如:可以控制 LED 的亮度,蜂鸣器的响度和频率,电机 转动的快慢等。值得一提的是,Arduino 的 14 个数字 I/O 口中,只有 6 个拥有 PWM 调制功能,其余 8 个口只能进行普通的数字输出功能。2.2.3 串口通讯串口通讯是指计算机和外设或计算机间通过信号线,按位进行数据传输的 一种方式,即数据是一位一位的传输或接收。这种通讯方式只用使用较少的数 据线,可以减少通讯的成本。与串口通讯相对的是并行通讯,并行通讯能将一 组数据的各个数据位分别同时在多条线上传输,提高了传输效率和传输速度。 但是并行通讯也存在通讯成本高和抗干扰能力差等问题。Arduino 本身只支持串
24、口通讯,故而在涉及与 Arduino 通讯的时候,因尽量 考虑通讯内容的简短。例如在我们的应用中,主要通过计算机向 Arduino 传输4图 2.3串口通讯图 2.4串口通讯测试运动的方向和步长。方向可以用一个字节来表示,并用少数几个字节的数字来 表示步长。故 Arduino 的串口通讯虽然速度不那么快,但是能满足我们的需求, 同时结构简单方便使用。如图 2.3,Arduino 在初始化部分打开了串口并以波特率 9600 进行通讯,之 后在循环部分将通讯的内容读出又重新写入了串口中,之后又向串口发送了一 个 OK,完成了一个回显的过程。我们可以在计算机上进行测试,打开串口与网 络通讯测试软件
25、USR-TCP232-TEST,调整好串口号和波特率,输入 test,得到 结果如图 2.42.3步进电机通过之前的介绍可以发现,使用 Arduino 可以做出很多有趣的小玩意。比 如:监控室内的温度、湿度,自制小乐器(根据手的位置发出不同频率的声音) 等。根据我们的需求,我们需要让 Arduino 从计算器读入数据而不是从传感器, 而处理后的数据需要传递给电机并控制其运动。我们首先考虑的是 Arduino 如 何驱动电机运动,之后再来考虑如何用计算机控制电机运动。2.3.1常见电机Arduino 上经常使用的电机主要有直流电机、步进电机和舵机。2.3.1.1直流电机直流电机是一种最常见的电机
26、,很多玩具小车上都采用的是直流电机。其 特点是结构简单,仅需接上电源就可转动。转动的方向取决于电源正负极所接 的位置,而转动的快慢则取决于电源电压的高低。通过 Arduino 控制直流电机,5图 2.5直流电机图 2.6舵机图 2.7步进电机可使用 PWM 调制技术来调整电机转动的快慢,即相当于改变加载在直流电机 两端的电压。很自然的,直流电机是我们考虑小车运动时的第一选择。可是实 际使用后发现,直流电机有一个很大的缺点,它的转动与否完全取决于是否通 电,但需要精确控制运动距离时,直流电机显得无能为力。因为,通过计算通 电时间来控制运动距离是很不精确的,加上通讯可能存在的延迟,装上直流电 机的
27、小车会比我们预想的跑得更远。2.3.1.2 舵机为了改进上述问题,我们曾经考虑过舵机。舵机是一种为玩具汽车和飞机 设计的电机,它不会像直流电机那样一直转圈,而是能根据你的指令旋转到 0至 180 度之间的任意一个角度停下。舵机控制方便,很容易实现,使用它和直 流电机的组合曾是我们考虑过的一种解决方案。类似于汽车那样,将前轮使用 舵机来控制转向,而后轮使用直流电机来驱动。可是直流电机的精确性还是无 法保证,仅仅将前轮换为舵机是不够的。舵机除了可用作小车转向之外,更重 要的用处应该是将来在装上 3D 扫描仪后用来控制扫描仪的转向,就像人的眼 睛一样是扫描仪能朝向各个方向采集数据。2.3.1.3 步
28、进电机步进电机的主要特点是将电脉冲转化为角位移,当步进电机驱动模块接收 到一个脉冲,它就会驱动步进电机按给定的放向转动一个固定的角度(称为步 进角)。而我们可以通过控制控制脉冲的个数来控制角位移,即步进电机转过的 角度,从而达到精确定位的目的。除此之外,还可通过控制脉冲的频率来控制 步进电机的速度和加速度,达到对小车运动的精确控制。步进电机在很多其他 的领域也有广泛应用,如我们熟悉的三维打印机上的喷头就是由步进电机控制, 从而能达到对模型的精确打印。在考察市场上常见的步进电机后,我们采用了采用了四个 42 系列两相混合 式步进电机,其步距精度为 5%,步距角为 1.8,轴径为 5mm,轴长为
29、19mm, 机身长度为 31mm,额定电流为 1.2A,电机重量约为 0.3kg。6图 2.8A4988 步进电机驱动模块图 2.9A4988 驱动模块的接口为了驱动步进电机,还需要有步进电机驱动模块。这里选用了能与 Arduino 控制板完美结合的 A4988 驱动模块。A4988 模块是一个内置简单操作转换的微 电机驱动器。它设计用以控制两相步进电机在全,半,四分之一,八分之一和 十六分之一下步进模式,具有高达 35 V 和 2 A 输出驱动能力。A4988 包括一个 固定关断时间电流稳压器,具有可在慢或混合衰减模式下工作的能力。A4988 只需在一个步进输入中输入一个脉冲,即可驱动电动机
30、产生一个微步,而无需 相位顺序表,高频率控制行或复杂的界面。在一个复杂的微处理器不可用或负 担过重的时候,A4988 模块将是一种理想的选择。2.3.2步进电机的使用和调试要想让步进电机成功的运转,就离不开驱动模块。我们采用的 A4988 模块 具有 16 个接口,可以完成不同的功能。图 2.8是 A4988 模块的实物图,图 2.9是 模块的 16 个接口。了解了模块的接口后,我们可以按照图 2.10将模块与 Arduino 以及步进电机连接。其中,1A、1B、2A、2B 是步进电机上带有的四个接口, 按顺序与模块连接即可。剩下的 EN、MS1、MS2、MS3 全部接地,此即为全步 进模式(
31、转一圈需要 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
32、.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.1 Wi-Fi 通讯在传统的 Arduino 的应用中,Ardui
33、no 是从传感器中读入数据,并输出到 LED、电机等做工原件上的。而在我们的应用中,Arduino 需要从计算机的控制 程序处读取控制步进电机运动的步进数已经运动方向。而传统的 Arduino 与计 算机通讯的方法为串口通讯,需要借助串口通讯软件以及数据线。但是,为了 远程控制我们的小车,数据线是显得不合适的。解决方案就是采用一些远程控 制方式,如:红外遥控、蓝牙和 Wi-Fi 等。3.1.1 红外、蓝牙和 Wi-Fi 对比红外遥控的发射电路采用红外发光二极管发出经过调制的红外光波;红外 接收电路则由红外接收二极管、三极管或硅光电池组成,它们将红外发射器发 射的红外光转换为相应的电信号,再送后
34、置放大器。(百度百科)。红外线信息 传输可靠,功耗低,成本低只需要一个很小的模块就能发射和接收。但是不具 有穿过障碍去控制对象的能力,故在物品较多的室内无法对小车很好的控制。 除此之外,普通计算机不带收发红外线的功能,需要外置设备也是一个缺点。蓝牙是一种无线技术标准,频段为 2400 2483.5MHZ。蓝牙使用跳频技术,将传输的数据分割成数据包,通过 79 个指定的蓝牙频道分别传输数据包。每个频道的频宽为 1 MHz。蓝牙 4.0 使用 2 MHz 间距,可容纳 40 个频道。第一个频道始于 2402 MHz,每 1 MHz 一个频道,至 2480 MHz。蓝牙的主要特点有价格 低廉易于使用
35、,但是传输距离短(10 米)。同红外遥控一样,有些电脑并不具 有蓝牙设备需要外接蓝牙适配器。Wi-Fi 是另一种常见的无线网络通信标准,它与蓝牙工作在相同的频段,相 互之间有所干扰。与蓝牙不同,Wi-Fi 中的 AP 建立真正的局域网供其他设备连 接。其特点是传输速率较高(11Mbps)、传输距离长(100 米)、保密性好、通 信可靠(抗干扰和抗多径干扰强)。鉴于以上三种通讯技术的综合考虑,首先排除红外遥控,主要因其必须点 对点的可视遥控,无法绕过障碍物。而蓝牙与 Wi-Fi 相比传输距离较短,可能 不满足今后的需求,并且蓝牙需要另配适配器。故 Wi-Fi 是我们选作小车与计 算机通讯的最终选
36、择,其特点更适合我们的工作需求。3.1.2 WiFi 模块的选择上述三种通讯方式都不是 Arduino 本身带有的,都需要外接模块来实现。 其中红外遥控和蓝牙由于结构简单,模块也较为简单,比较容易实现与 Arduino11图 3.1Arduino Yun的连接。而 Wi-Fi 功能较复杂,结构也较复杂故 Arduino 开发板一般不支持Wi-Fi。市面常见的解决方案有:ESP8266、HLK-RM04、Arduino Yun 等。Arduino Yun 是 Arduino 团队官方发布的支持 Wi-Fi 的 Arduino 主板,它 是基于 Atmega32u4 和 Ar9331 的微控制器。
37、 与传统的 Arduino UNO 不同的 是,Arduino Yun 上实际运行着两个操作系统。Atmega32u4 芯片运行着传统的 Arduino 系统,而创新的 Ar9331 上运行着一个名叫 Linino 的 OpenWrt Linux 系 统。Yun 的有线网络、Wi-Fi、USB Host、microSD 等功能都由 Ar9331 控制,并 且 Ar9331 拥有 400MHz 的主频,远超传统 Arduino Atmega32u4 芯片的 16MHz 处理能力,使得 Arduino Yun 实行一些更为复杂的算法成为可能。Arduino Yun 拥有以上众多好处,可是并未被本次
38、项目采用,主要原因有:1. 项目成立之初,学习和实验的主板都是 Arduino UNO,因此对 Arduino UNO非常熟悉。2. Arduino Yun 的成本较高,相对于几十元就能买到的 Arduino UNO,Arduino Yun 的成本大约在五百元左右。但是随着后续项目的开展,加上我们已经对其 他硬件比较了解,以后换上 Arduino Yun 作为控制板还是很有必要的。在项目的 实际进展中我们考虑了 ESP8266 模块和 HLK-RM04 模块,并将其都买了回来进 行测试。OCROBOT SEED 基于 ESP8266 芯片平台,是网上能找到的最低廉的 WIFI 串口解决方案模块
39、,其结构简单,只有四根接线口,两根电源线,两根信号传 输线。其工作电压为 3.3V,可以直接用 Arduino 主板对其进行供电,另外将两 根信号传输口分别接到 Arduino 主板的两个 I/O 口上,即可完成将 Wi-Fi 信号转 换成 Arduino 能识别的串口信号的功能。12图 3.2使用模块时的连线方式图 3.3升级固件时的连线方式因为 ESP8266 的固件版本一直在不断的快速升级中,而市面上买到的模块 不可能紧跟官方的固件版本,故而在实际使用中需要更新固件。在实际测试中, 我所购买的模块只有更新到 0.93 版本的固件后才能正确的进入 AP+Station 共存 模式。在固件升
40、级模式中,为了与电脑连接需要在模块上另接一个 USB 转串口 模块,这是因为 OCROBOT SEED 模块也只能接受串口数据。为此,我们选择 了 CP2102 USB 转串口模块,图 3.2、图 3.3是接线方式。注意到,升级固件的原理就是将相应的二进制文件烧写到 ROM 中的相应 的地址位上,要保证 bin 文件和地址的对应,选择好串口号和波特率即可开始 烧写。图 3.4显示的烧写固件的软件界面。与 ESP8266 模块相比,HLK-RM04 增加了以太网的功能,将 Wi-Fi 的部分 配置直接集成在了板上,可以通过浏览器访问并进行设置,避免了使用基础的 AT 指令,缩短了 Arduino
41、 端的代码编写。两者在基础功能上基本相同,只不过 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图
42、 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 = ”T CP”, ”192.168.1.104”, 8080
43、建立 TCP 连接。注意到我们之前已经在计算机上开启了一个监听 8080 端口的 TCP 服务器。最后我们使用 AT + CIPSEND = 4 来传输 4 个字节的数据”test”, 之后便可在服务器端接收到”test”。至此关于 AT 指令的测试已经成功,完成了数据的传输。但是我们可以发 现,由于 AT 指令是非常底层的指令,在实际使用中显得比较繁琐。为了简化 使用的过程,HLK-RM04 模块已经将很多设置的部分都放在了网页端,可以通 过浏览器访问来设置,大大简化了使用过程,使得我们可以在连接上模块后即 开始数据通讯。这也是我们最终考虑使用 HLK-RM04 模块替代 ESP8266 模
44、块的 缘故。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.7
45、AT 指令测试三3.2 Socket 编程在之前的测试中我们使用了 USR-TCP232-Test 软件自带的建立 TCP 服务器 和 TCP 客户端的功能。但是在我们今后的应用当中,需要自己编写程序来连接 Wi-Fi 模块。因此,在之前的基础上,我们需要进一步学习 C 语言的 Socket 编 程,以实现网络通讯。3.2.1 Socket 简介Socket 又叫套接字,是指网络上的两个进程通过一个双向的通信连接实 现数据的交换,这个连接的一端称为一个 Socket。Socket 类似于电话插座,电 话通信的双方即不同计算机上的两个进程,任何人在通话之前首先要占用一 个电话,相当于申请了一个 Socket; 同时要知道对方的电话号码,即知道对方 Socket 的