创客神器NanoPi
直播中

辉哥的歌

9年用户 235经验值
擅长:电源/新能源 MEMS/传感技术 嵌入式技术 连接器 存储技术 处理器/DSP 接口/总线/驱动 控制/MCU
私信 关注
[话题]

【NanoPi M2试用体验】我的"潘多拉魔盒" 8——智能车多功能遥控器开发项目结题报告

本帖最后由 辉哥的歌 于 2016-6-9 12:14 编辑


1.   引言
在第7讲“我的‘潘多拉魔盒’7—遥控器按键电平检测威廉希尔官方网站 设计中,重新改进了遥控器的威廉希尔官方网站 设计,解决了按键未按下时,对应引脚悬空导致的电平跳变问题。从而为本项目的结题做了关键的铺垫。
为了能够实现所开发的遥控器对小车的遥控,本节需要解决的问题有:
1)        NanoPi M2与Ardunio的无线通信问题;
2)        小车的控制流程设计及程序的开发;
3)        小车驱动电机控制。
所采用的硬件如下表所示:
  
序号
  
名称
数量
作用
1
NanoPi M2
1
遥控器控制根据控制操作形成控制指令
2
面包板遥控器
1
用于遥控操作
3
3DR无线数传
1
发送/接收遥控指令
4
Ardunio
1
小车主控制器
5
L298N
1
小车直流电机驱动器
6
9V方电池
1
Ardunio供电
7
3s锂电池
1
给小车驱动电机供电
8
6V UBEC
1
3s电池电压降到6V给小车L298N供电
9
小车本体
1
承载

由于本项目的重点在于小车遥控器的开发,对于小车的建立和控制原理本报告就不细讲,感兴趣的同学,有问题可以跟我直接联系。

2.   查看NanoPi M2可用串口号
8-1
1 查看NanoPi M2可用的串口号
由图1可见,当前有四个串口可用,其中画红线的ttyAMA2就是UART3对应的串口,也即引脚8和引脚10。而其中一个数传是USB接口(见图2),所以可直接插在USB口上,此时再次查询可用串口发现多了一个ttyUSB0串口,也就是我所采用的插着无线数传的接口。
8-2
2 无线数传模块

8-3
3 插上带USB接口的无线数传后出现ttyUSB串口号

3.   NanoPiM2Ardunio通信测试
(1)      开发环境及通信库安装
遥控器与NanoPi M2的接线在第5和第7讲中都有详细描述,这里不再赘述,可直接见图4。主要讲遥控器端的控制程序的软件实现。
8-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/
8-5
5 Python IDLE开发环境安装后在编程菜单下
8-6
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:
                      #time.sleep(0.000001)
                      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)来看,没有出现电平跳动情况,控制操作响应较快,也比较稳定。
8-7
7 无控状态下各引脚电平都为零

8-8
8  按下前进按键引脚电平情况
8-9.png
9 按下右转按键引脚电平情况
8-10
10  按下左转按键引脚电平情况

8-11
11  按下后退按键引脚电平情况

(4)     接收端测试
接收端采用的是Arduino的IDE开发环境,进行程序的开发,首先进行接收NanoPi M2发出的指令测试。接收端的测试程序如图12所示。
8-12
12 Ardunio接收端界面及测试程序
将该程序下载到Ardunio板后,连接Ardunio与另一端无线数传模块(见图13)后,打开Ardunio的串口监视窗口,然后进行按键操作,可见效果如图14-16所示。
8-13
13  无线数传接收端与Ardunio连接示意图

8-14
14  无操作或多按键同时按下时接收到的是停车指令P

8-15
15  接收到F前进和R右转指令

8-16
图16  接收到右转R—停P—左转L—停P—后退B指令
至此说明NanoPi M2和Ardunio已经通信成功,下一步只需判断所接收到的控制指令,控制小车即可。

4.   小车端硬件连接和控制流程
1)小车端硬件连接
         对于小车端的硬件连接需要注意的主要是供电方式,这里选择3s锂电池作为小车的动力电源,而9v方块电池作为Ardunio uno r3的供电电源。选择L298N作为小车的直流电机的控制驱动器,以及3DR的无线数传作为无线控制的信号接收设备。整体连接方案如 17所示,实物连接如图1819所示。
8-17
17 小车端硬件连接图
8-18
18 实物连接图
8-19
19  局部连接图
2)控制流程
此时,遥控器端控制软硬件都已经准备好了,小车控制端的连接也已经完成,下来就需要根据接收到的指令完成对应的小车运动的控制。而控制小车的运动其实就是控制直流电机的驱动器L298N使其驱动电机的转向,L298N的控制逻辑如图20所示。
8-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。
完整的程序在附件中给出。
8-21
21  小车控制主循环部分程序
5.   遥控效果展示
遥控效果展示是一个比较头疼的问题,因为发烧友的平台没法投放视频,我只能把录制的视频上传到优酷上,大家可以点开链接去优酷上观看。
视频展示优酷链接:http://v.youku.com/v_show/id_XMTYwMTk0MTE4OA==.html
这里先给大家展示两图片:

8-22
22  遥控器控制小车运动

8-23
23  遥控小车
6.   结束语
至此,我的用NanoPi M2制作遥控器控制小车项目就结束了,所制作的遥控器能够完美的遥控我的小车,解决了遥控器制作过程的控制键威廉希尔官方网站 设计和无线串口通信等关键技术,对于NanoPi M2 GPIO方面的开发有了较深的了解,我的试用就告一段落,特此申请结项。
如果后续还有进一步的改进和其它好玩的开发,也会继续给大家分享,还请大家对我的试用过程有什么问题的地方不吝赐教,一起探讨进步。


回帖(8)

liliang19910310

2016-6-9 16:04:34
强!!!!!!!!!!!!
举报

辉哥的歌

2016-6-9 16:37:16
引用: liliang19910310 发表于 2016-6-9 16:04
强!!!!!!!!!!!!

一般,一般,看视频了吗?
举报

小萃米

2016-6-12 10:03:41
强势围观
举报

辉哥的歌

2016-6-12 19:58:58

谢谢,共同探讨
举报

更多回帖

发帖
×
20
完善资料,
赚取积分