一起玩转树莓派(14)——超声测距
当今,汽车行业的发展可谓是日新月异。智能汽车的概念也越来越火热。自动驾驶也将得到越来越广泛的应用。不知你有没有想过,平时我们在人工驾驶汽车时,主要使用的是视觉来感知距离,对于人工智能来说,它是如何通过感知距离来获取周围环境信息的呢?这就需要使用到相关的测距传感器。
一、超声测距传感器
我们知道,超声波频率高,相对于普通声波,其能量消耗慢,传播距离远且指向性很强。十分适合用来进行距离的测量。本次实验,我们使用HC-SR04超声测距模块来进行距离测量。元件如下图所示:
如上图所示,HC-SR04模块有一个超声发生器(T端)和一个超声收集器(R端)以及4个引脚。在网上很容易购买到此模块,其价格低廉,精准度高,使用简单,性价比非常高。HC-SR04硬件原理图如下:
模块内部电路结构虽然看上去非常复杂,但是我们使用它来测距并不需要了解其内部完整的工作原理,要进行距离的测定,离不开公式_s = v * t_。如果要计算出距离s,需要得知速度v和时间t,声波的速度v是一定的,我们可以取340m/s,时间t就是HC-SR04模块能够帮助我们得到的。
超声测距的核心原理是通过发生源发出超声波,当超声波遇到障碍时会被反射,反射的超声波可以被感知源感知到,从声波发出到被感知到这之间的时间就是超声波从模块到障碍物间传递一次来回所使用的时间。如下图所示:
对于HC-SR04模块,其Trig引脚是触发引脚,向其发10us以上的高电平即可触发发送超声波指令,HC-SR04模块会自动发送8个40kHz的方波,当发送完成后,Echo引脚会输出高电平,当收到反射回来的声波后,Echo会重新变回低电平。因此,在使用HC-SR04模块时,我们只需要通过向Trig引脚加高电平触发测量指令,之后监听Echo引脚高电平的持续时间,即可完成测距工作。
二、连线与编码
我们选择BCM编码下的GPIO17来控制超声发生Trig引脚,使用GPIO18来获取Echo引脚的电平。连线如下:
HC-SR04模块 | 树莓派 |
---|---|
VCC | +5V电源 |
GND | GND |
Trig | GPIO17(BCM编码) |
Echo | CGIO18(BCM编码) |
编写如下代码:
#coding:utf-8
import RPi.GPIO as GPIO
import time
# 触发声波引脚
trig = 11
# 监听信号
echo = 12
def getDistance():
# 输出高电平
GPIO.output(trig, GPIO.HIGH)
# 持续15us高电平 触发超声波
time.sleep(0.000015)
# 停止加高电平
GPIO.output(trig, GPIO.LOW)
# 开始检测信号引脚的电平为高电平时开始计时
while GPIO.input(echo) == 0:
pass
t1 = time.time()
# 信号引脚的电平为低电平时计算时间间隔
while GPIO.input(echo) == 1:
pass
t2 = time.time()
# 计算距离
s = (t2 - t1)*340/2
return s
GPIO.setmode(GPIO.BOARD)
GPIO.setup(trig, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(echo, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
while True:
s = getDistance()
print("当前距离前方障碍物:%fm"%(s))
time.sleep(1)
在树莓派中运行上面代码,即可实现超声波测距,效果如下图:
专注技术,懂的热爱,愿意分享,做个朋友