#实验目的:通过控制超声波传感器(HC-SR04)不断发送超声波,然后利用超声波遇物体检反射的特性,检测接收超声波的反馈时间,从而计算出前方物体的实时距离。
#接线效果如图:
注:
1、发送超声波需要至少10微妙的高电平;
2、Trig发送声波时,会同时把Echo置为高电平;但是两者之间有微小的时间差;此时记录开始时间,当声波遇到物体回传被Echo接收到后,Echo会被置为低电平;因此检测Echo的由高电平到低电平的时间即可计算传输时间;
3、将得到的时间/2,即可得到单次距离所用的时间;然后乘以声音的速度(340m/s),即可得到距离。
#实验代码
#!/usr/bin/env python
#coding:utf-8
'''
from JiuJiang
树莓酱的操作实例
https:://www.shumeijiang.com
'''
import RPi.GPIO as GPIO ##引入GPIO模块
import time ##引入time库
triggerPin = 18 ##trigger英文含义触发 用来发送声波
echoPin = 19 ##echo 英文含义回声、回响 用来接收声波
GPIO.setmode(GPIO.BCM) ##此处采用的BCM编码 因为T型扩展板也是BCM编码 方便统一
GPIO.setup(triggerPin, GPIO.OUT) ##设置trigger为输出状态
GPIO.setup(echoPin, GPIO.IN) ##设置echo为接收状态
GPIO.output(triggerPin, GPIO.LOW) ##初始化trigger
##封装单次声波发送-回收函数
def getDistance():
GPIO.output(triggerPin, GPIO.HIGH) ##高电平发送声波
time.sleep(0.000010) ##声波保持10微妙
GPIO.output(triggerPin, GPIO.LOW) ##停止发送声波
while GPIO.input(echoPin) == GPIO.LOW: ##等待echoPin生成高电平
pass
startTime = time.time() ##echoPin高电平状态 说明检测开始
while GPIO.input(echoPin) == GPIO.HIGH: ##等待echoPin接收到信号并拉低电平
pass
stopTime = time.time() ##记录拉低电平的时间 也就是收到声波的时间
print '检测到距离'
useTime = stopTime-startTime ##单位秒
return (useTime*340)/2 ##声音传播速度340m/s 暂不考虑温度和气压影响
try:
while True:
distance = getDistance() ##执行测距
print '距离是:%0.4f米' %distance
time.sleep(0.5) ##0.5秒检测一次 可调整
except KeyboardInterrupt:
pass
GPIO.cleanup()
#实验过程
1、准备一把尺子作为校验物;
2、通过移动障碍物,会看到屏幕显示距离的动态变化;
#视频效果如下: