APP下载

基于树莓派的超声波避障小车

2018-01-04孙智勇戴文翔程文龙

电脑知识与技术 2018年30期
关键词:树莓派

孙智勇 戴文翔 程文龙

摘要:如今越来越多人走出课本不拘泥于文字之上,他们更多的边做边学,树莓派就是其中一个很好的例子,不少人会去拿树莓派去控制小灯,或通过树莓派来实现网页对小车的控制,更有甚者用树莓派来做智能家居。该文则介绍一个相对简单些的利用超声波来做避障小车,以树莓派为核心通过它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(一工程师教程)

【通联编辑:代影】

猜你喜欢

树莓派
基于Raspberry Pi的智能教室系统
基于树莓派的车载无线视频传输系统
智能安全防盗探测小车
基于嵌入式技术的农村医疗系统设计