本帖最后由 辉哥的歌 于 2016-6-9 12:14 编辑
1. 引言在第7讲“我的‘潘多拉魔盒’7—遥控器按键电平检测
威廉希尔官方网站
设计中,重新改进了遥控器的威廉希尔官方网站
设计,解决了按键未按下时,对应引脚悬空导致的电平跳变问题。从而为本项目的结题做了关键的铺垫。
为了能够实现所开发的遥控器对小车的遥控,本节需要解决的问题有:
1) NanoPi M2与Ardunio的无线
通信问题;
2) 小车的控制流程设计及程序的开发;
3) 小车驱动电机控制。
所采用的硬件如下表所示:
由于本项目的重点在于小车遥控器的开发,对于小车的建立和控制原理本报告就不细讲,感兴趣的同学,有问题可以跟我直接联系。
2. 查看NanoPi M2可用串口号图1 查看NanoPi M2可用的串口号
由图1可见,当前有四个串口可用,其中画红线的ttyAMA2就是UART3对应的串口,也即引脚8和引脚10。而其中一个数传是USB接口(见图2),所以可直接插在USB口上,此时再次查询可用串口发现多了一个ttyUSB0串口,也就是我所采用的插着无线数传的接口。
图2 无线数传模块
图3 插上带USB接口的无线数传后出现ttyUSB串口号
3. NanoPiM2与Ardunio通信测试(1) 开发环境及通信库安装
遥控器与NanoPi M2的接线在第5和第7讲中都有详细描述,这里不再赘述,可直接见图4。主要讲遥控器端的控制程序的软件实现。
图4 遥控器端连接实物图
这里采用的开发环境是Python2.7的IDE,采用这个的开发环境的好处是格式简约大方,调试方便(见图5和图6),安装也很简单,采用如下指令:
安装IDE命令:sudoapt-get install idle
采用的开发语言当然也就是python了,之所以采用python主要是python的串口通信库很好用,也就是pyserial-3.0.1。不过,该库需要安装,安装方法如下:
使用apt-get工具安装:sudoapt-get install python-serial
当然也可以下载后安装,下载后安装方法如下:
1) tar zxvf pyserial-3.0.1.tar.gz
2) cd pyserial-3.0.1
3) python setup.py install
pyserial的下载地址如下,该库有详细的使用教程,虽然是英文的但简单易懂:
下载地址:https://pypi.python.org/pypi/pyserial/3.0.1
通信库使用手册连接:http://pythonhosted.org/pyserial/
图5 Python IDLE开发环境安装后在编程菜单下
图6 打开python2.7后进入开发环境界面
(2) 遥控器控制流程
1) 导入串口通信库:importserial
2) 打开通信的串口及设置波特率:ser = serial.Serial('/dev/ttyUSB0',57600)
3) 判断是否打开正确:if(ser.isOpen()):print('Device open successfully!')
4) 定义所采用的引脚编码号,如forward_in= 92
5) 定义引脚的输入输出模式,如gpio.setup(forward_in,'in')
6) 初始化输出引脚为低电平,如gpio.set(forward_out,0)
7) 判断按下的是哪个按键,点亮对应的led灯,并发送对应的控制指令,这里程序设计时滤除了多按键同时按下的情况,因为原则上是不允许的,比如说若同时按下前进和后退键,则认为是操作不当,不予反应。控制主体程序如下:
while True:
Fin =gpio.input(forward_in)
Rin =gpio.input(right_in)
Lin = gpio.input(left_in)
Bin = gpio.input(back_in)
if((Fin==1) and (Rin==0)and (Lin==0) and (Bin==0)):
gpio.set(forward_out,1)
gpio.set(right_out,0)
gpio.set(left_out,0)
gpio.set(back_out,0)
print("forward_in = " + str(Fin))
command =ser.write('F') # 发送前进指令
elif((Fin==0) and(Rin==1) and (Lin==0) and (Bin==0)):
gpio.set(forward_out,0)
gpio.set(right_out,1)
gpio.set(left_out,0)
gpio.set(back_out,0)
print("right_in = " + str(Rin))
command = ser.write('R') # 发送右转指令
elif((Fin==0) and(Rin==0) and (Lin==1) and (Bin==0)):
gpio.set(forward_out,0)
gpio.set(right_out,0)
gpio.set(left_out,1)
gpio.set(back_out,0)
print("left_in = " + str(Lin))
command =ser.write('L') # 发送左转指令
elif((Fin==0) and(Rin==0) and (Lin==0) and (Bin==1)):
gpio.set(forward_out,0)
gpio.set(right_out,0)
gpio.set(left_out,0)
gpio.set(back_out,1)
print("back_in = " + str(Bin))
command =ser.write('B') # 发送后退指令
else:
gpio.set(forward_out,0)
gpio.set(right_out,0)
gpio.set(left_out,0)
gpio.set(back_out,0)
print("others operation" )
command =ser.write('P') # 发送无效操作指令
8) 强制停止设置:exceptKeyboardInterrupt: print("Qiut")
(3) 按键操作效果如下:
在进行通信之前,先进行了单遥控器的控制操作测试,已检验控制操作逻辑的正确性。从各个按键下的电平情况(图7-11)来看,没有出现电平跳动情况,控制操作响应较快,也比较稳定。
图7 无控状态下各引脚电平都为零
图8 按下前进按键引脚电平情况
图9 按下右转按键引脚电平情况
图10 按下左转按键引脚电平情况
图11 按下后退按键引脚电平情况
(4) 接收端测试
接收端采用的是Arduino的IDE开发环境,进行程序的开发,首先进行接收NanoPi M2发出的指令测试。接收端的测试程序如图12所示。
图12 Ardunio接收端界面及测试程序
将该程序下载到Ardunio板后,连接Ardunio与另一端无线数传模块(见图13)后,打开Ardunio的串口监视窗口,然后进行按键操作,可见效果如图14-16所示。
图13 无线数传接收端与Ardunio连接示意图
图14 无操作或多按键同时按下时接收到的是停车指令P
图15 接收到F前进和R右转指令
图16 接收到右转R—停P—左转L—停P—后退B指令
至此说明NanoPi M2和Ardunio已经通信成功,下一步只需判断所接收到的控制指令,控制小车即可。
4. 小车端硬件连接和控制流程(1)小车端硬件连接
对于小车端的硬件连接需要注意的主要是供电方式,这里选择3s
锂电池作为小车的动力电源,而9v
方块电池作为Ardunio uno r3
的供电电源。选择L298N
作为小车的直流电机的控制驱动器,以及3DR
的无线数传作为无线控制的信号接收设备。整体连接方案如图 17
所示,实物连接如图18
和19
所示。 图 17 小车端硬件连接图
图18 实物连接图
图19 局部连接图
(2)控制流程
此时,遥控器端控制软硬件都已经准备好了,小车控制端的连接也已经完成,下来就需要根据接收到的指令完成对应的小车运动的控制。而控制小车的运动其实就是控制直流电机的驱动器L298N使其驱动电机的转向,L298N的控制逻辑如图20所示。
图20 L298N驱动电机的控制逻辑
软件控制流程如下:
1) 首先需要定义一个接受指令的字符变量:char command;
2) 然后定义接L298N控制引脚IN1,IN2,IN3,IN4的Ardunio引脚,这里选择Ardunio的6~9引脚与其对应;intpin_L1 = 6; int pin_L2 = 7; int pin_R1 =8; int pin_R2 = 9;
3) 然后设置引脚的输入输出模式,如pinMode(pin_L1,OUTPUT);
4) 设置串口波特率,需要注意的是这个波特率要与NanoPi M2的遥控端一致,参考第3小节第(2)部分的遥控器控制流程中的第2)条,波特率的设置(57600),因此,这里的波特率只能设置为57600,即Serial.begin(57600);
5) 定义小车的运动模式函数,分别为Foreward()、Turnleft()、Turnright()、Backward()和Stop();
6) 进入循环控制主体,读取command,判断是什么指令,从而运行对应的函数即可,该部分程序见图21。
完整的程序在附件中给出。
图21 小车控制主循环部分程序
5. 遥控效果展示遥控效果展示是一个比较头疼的问题,因为发烧友的平台没法投放视频,我只能把录制的视频上传到优酷上,大家可以点开链接去优酷上观看。
视频展示优酷链接:http://v.youku.com/v_show/id_XMTYwMTk0MTE4OA==.html
这里先给大家展示两图片:
图22 遥控器控制小车运动
图23 遥控小车
6. 结束语至此,我的用NanoPi M2制作遥控器控制小车项目就结束了,所制作的遥控器能够完美的遥控我的小车,解决了遥控器制作过程的控制键威廉希尔官方网站
设计和无线串口通信等关键技术,对于NanoPi M2 GPIO方面的开发有了较深的了解,我的试用就告一段落,特此申请结项。
如果后续还有进一步的改进和其它好玩的开发,也会继续给大家分享,还请大家对我的试用过程有什么问题的地方不吝赐教,一起探讨进步。