基于树莓派的超声波避障小车
2018-01-04孙智勇戴文翔程文龙
孙智勇 戴文翔 程文龙
摘要:如今越来越多人走出课本不拘泥于文字之上,他们更多的边做边学,树莓派就是其中一个很好的例子,不少人会去拿树莓派去控制小灯,或通过树莓派来实现网页对小车的控制,更有甚者用树莓派来做智能家居。该文则介绍一个相对简单些的利用超声波来做避障小车,以树莓派为核心通过它L298n的控制来控制小车,利用超声波传感器来实时监测小车与障碍物之间的距离,利用算法来实现避障
关键词:超声波传感器;Raspberry;树莓派
中图分类号:TP3 文献标识码:A 文章编号:1009-3044(2018)30-0206-02
1 硬件组成
(1)避障小车硬件组成包括:小车底盘、4个车轮、四个直流电机、超声波测距传感器模块、电源盒、移动电源(也可直接通过5v电源接口直接使用)、无线网卡、树莓派。注:如果使用的板子是3个轮子的,则3个车轮中,两个前轮由直流电机直接驱动,后轮选择万向轮。
(2)电源部分:包括四节1.5V(5号)电池,5000毫安移动电源。四节1.5V(5号)电池为L298n提供6V电压,5000毫安移动电源为树莓派提供稳定的5V电压。
(3)驱动部分:包括小车底盘、L298n电机驱动、直流电机(2/4个)。3轮小车需要L298n驱动前轮,配合万向轮实现前进、后退以及左右转向。
(4)主控制部分:树莓派。树莓派通过L298n控制直流电机转动,全方向达到移动的目的。树莓连接超声波测距模块,以达到实时测量与障碍物的距离。从而可以做到小车再碰到障碍物之前能按预设避让方式进行避让,最终实现智能避让。
(5)传感器部分:超声波测距传感器模块连与树莓派,正常工作时,超声波测距传感器模块的工作电压为5V左右,电压会下降0.1V左右。传感器通过向空中发送超声波脉冲并测量反弹所需的时间来工作。该值可以用于计算脉冲行进的距离进而产生信号,是树莓派执行避让语句。
注意点:找到距离的计算依赖于声音的速度,这随温度而变化。脚本根据预定义的温度计算要使用的正确值。如果需要可以更改此值,或者使用温度传感器动态测量该值。
2 软件编译
(1)定义接口控制轮子:
import RPi.GPIO as gpio
import time
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
zuoqian = 7
zuohou = 11
youqian = 15
youhou = 13
注:首先没有HDMI线的人可以直接通过putty通过树莓派ip来远程登录树莓派,账户名为:pi,密码为raspberry(密码不可见)在树莓派上首次使用引脚时,首先要通过sudo apt-get install python-dev指令安装Python——dev(dev: 开发包,包含相关库和头文件,用于开发用),然后使用sudo pip install rpi.gpio指令安装适用于Python的GPIO模块。
接着你可以使用vim编译器或者也是用nano编译器,指令为:sudo vim +文件名.py或者sudo nano +文件名。py(注:树莓派默认的是没有安装vim编译器的,所以要通过sudo apt-get install -y vim指令安装。而nano为大部分Linux系统的默认编译器,还有两种简易方式,一种使用树莓派的可视化界面,第二种是使用WinSCP直接进入树莓派内部文件。
(2)初始化GPIO口:
def init():
gpio.setmode(gpio.BOARD)
gpio.setup(7,gpio.OUT)
gpio.setup(11,gpio.OUT)
gpio.setup(13,gpio.OUT)
gpio.setup(15,gpio.OUT)
注:gpio.setmode(gpio.BOARD)意思為gpio调用BOARD编号方式。
因为树莓派需要通过L298n来控制直流电机,所以连接7,11,13,15这几个GPIO端口且要为输出端。而与红外避障模块相连GPIO端口,因为需要其收集的路况信息,所以设置为输入端
(3)定义基础方向:
def qianjin(timerun):
init()
gpio.output(7,True)
gpio.output(11,False)
gpio.output(15,True)
gpio.output(13,False)
time.sleep(timerun)
gpio.cleanup()
注:定义基础方向时要注意L298n的安装朝向,gpio7和gpio11应相对应接右边,而gpio15及gpio13口应相对应左侧,注意同侧间可能会有与直流电机出现正负极顺序错误的可能,极有可能形成左右轮转向相反,小车方向控制不了的情况。
第一个(qianjin)代码使得左右轮都问前进;同理后退(houtui)代码的false与ture指令与第一个相反则形成后退。
def zuozhuan(timerun):
init()
gpio.output(7,False)
gpio.output(11,False)
gpio.output(15,True)
gpio.output(13,False)
time.sleep(timerun)
gpio.cleanup()
此条指令(左轉)则通过gpio.output(7,Fals),gpio.output(11,False) 两个代码使得左边轮子停止而右边的两个gpio接口依旧正常使得右边向前则形成的左转,右转也是同样的道理在这里就不一一赘述了。
def tingzhi(timerun):
init()
gpio.output(7,False)
gpio.output(11,False)
gpio.output(15,False)
gpio.output(13,False)
time.sleep(timerun)
gpio.cleanup()
最后一个是(停止)指令四个gpio口的指令都为False,使得四轮子全部停止。即形成了指令。
最后我们要注意的是Python对空格极为敏感,有可能我们没有观察出来的地方没对齐,或某处忘缩进就会造成程序错误。所以最好统一使用Tap键缩进,或者统一使用空格键。
(4)超声波测距传感器的连接与编辑:
import RPi.GPIO as gpio
import time
def distance():
gpio.setmode(gpio.BOARD) gpio.setup(12,gpio.OUT) gpio.setup(16,gpio.IN) gpio.output(12,True)
time.sleep(0.000015) gpio.output(12,False)
while not gpio.input(16):
pass
t1 = time.time()
while gpio.input(16):
pass
t2 = time.time()
return (t2-t1)*34000/2
gpio.cleanup()
return distance
print(distance())
注:通过gpio.output(12,True)指令发出触发信号保持10us以上,从发现高电平时开始计时记为t1,当高电平结束时停止计时记为t2,由此可计算t1,t2的时间差从而通过公式:(t1-t2)*3400/2来计算出距离。
通过先定义小车前后左右的动作和测算距离后,我们就可以令小车进行距离判断进行相应的动作了。
dis = int(checkdistance())
print(dis)
If dis<=30
print”distance less than 0.30m and back
Int()
houtui(1)
这只是定义了一个选择更多的可以通过对距离的判断来做。
3 结语
本文中的超声波小车不过是树莓派众多实验中的九牛一毛,但实验中的步骤多相似之处,像编程语言的注意事项和工具等这些都是基础也是需要加强的地方,所以我们要加强对Python和C++的学习,从中发现乐趣。
参考文献:
[1] 胖若两人.[树莓派]树莓派小车(三)Python控制小车(简书网)
[2] 赵贵生.一起来玩树莓派.www.sentdex.com(一工程师教程)
【通联编辑:代影】