树莓派超声波测距
超声波传感器
就是传说中的Ultrasonic传感器,学名:HC-SR04 , 某宝上非常cheap, 自己搜.
测距原理
- 超声波距离传感器设计为使用超声波来测量源与目标之间的距离。
- 我们之所以使用超声波,是因为超声波在短距离内相对准确,并且不会引起人耳无法听到的干扰。
特性说明
HC-SR04是用于2cm至400cm距离非接触距离测量的常用模块。
它使用声纳(如蝙蝠和海豚)以高精度和稳定的读数来测量距离。
它由超声波发射器,接收器和控制电路组成。
发射器发射短脉冲,该短脉冲被目标反射并被接收器拾取。
计算超声波信号的发送和接收之间的时间差。
使用声速和“ 速度=距离/时间 ”等式,可以轻松计算源与目标之间的距离。
引脚说明
HC-SR04超声波距离传感器模块具有四个引脚:
-
VCC – 5V,输入电源
-
TRIG –触发输入
-
回声 –回声输出
-
GND –接地
实际工作原理
-
1.向TRIG输入提供触发信号,它需要至少10μS持续时间的高电平信号。
-
2.这使模块能够发送八个40KHz超声波脉冲串。
-
3.如果模块前面有障碍物,它将反射那些超声波
-
4.如果信号返回,则模块的ECHO输出将在发送和接收超声信号所花费的时间内保持为高电平。脉冲宽度的范围为150μS至25mS,具体取决于障碍物与传感器之间的距离,如果没有障碍物,则脉冲宽度约为38ms。
接线方式
非常关键的分压步骤
ECHO输出为5v而Raspberry Pi GPIO的输入引脚的额定电压为3.3V,因此,无法将5V直接提供给不受保护的3.3V输入引脚,除非你想把树莓派干掉...
因此,我们得使用分压电路,使用适当的电阻将电压降至3.3V。以下公式可用于计算电阻值,
“ Vout = Vin x R2 /(R1 + R2)”
这里我用的是常用的4.7K和10K电阻做的分压电路,中间抽头给树莓派GPIO引脚,安全可靠。连接实物模拟图
画图软件是frizing, 不要再私信问我了...
计算方法
-
距离计算
脉冲所花费的时间实际上是超声波信号往返的时间,而我们只需要一半的时间。因此,时间被视为时间/ 2。 -
距离=速度时间/ 2
而海平面声速= 343 m / s或34300 cm / s
因此,距离= 17150 时间(单位厘米)
*校准
为了获得准确的距离读数,可以使用尺子校准输出。在下面的程序中,添加了0.5 cm的校准。
你如果不想校准也可以尝试不加,就是大致有点儿偏移量。
测试代码:
import RPi.GPIO as GPIO #Import GPIO library
import time #Import time library
GPIO.setmode(GPIO.BCM) #Set GPIO pin numbering
TRIG = 23 #Associate pin 23 to TRIG
ECHO = 24 #Associate pin 24 to ECHO
print "Distance measurement in progress"
GPIO.setup(TRIG,GPIO.OUT) #Set pin as GPIO out
GPIO.setup(ECHO,GPIO.IN) #Set pin as GPIO in
while True:
GPIO.output(TRIG, False) #Set TRIG as LOW
print "Waitng For Sensor To Settle"
time.sleep(2) #Delay of 2 seconds
GPIO.output(TRIG, True) #Set TRIG as HIGH
time.sleep(0.00001) #Delay of 0.00001 seconds
GPIO.output(TRIG, False) #Set TRIG as LOW
while GPIO.input(ECHO)==0: #Check whether the ECHO is LOW
pulse_start = time.time() #Saves the last known time of LOW pulse
while GPIO.input(ECHO)==1: #Check whether the ECHO is HIGH
pulse_end = time.time() #Saves the last known time of HIGH pulse
pulse_duration = pulse_end - pulse_start #Get pulse duration to a variable
distance = pulse_duration * 17150 #Multiply pulse duration by 17150 to get distance
distance = round(distance, 2) #Round to two decimal points
if distance > 2 and distance < 400: #Check whether the distance is within range
print "Distance:",distance - 0.5,"cm" #Print distance with 0.5 cm calibration
else:
print "Out Of Range" #display out of range
测试
python3 ultrasonic_distance_detect.py
效果很明显。
总结
反射角度如果大于15度有可能会出现值不准,如果附近噪声很大也许会有干扰,其他的没啥,很简单的一个模块,可以结合树莓派或者别的设备做一个超声波控制音量的玩意儿,树莓派爬音乐网站,播放音乐,由超声波传感器来进行检测,距离小于多少就降低音量,否则就开大音量, 自己想办法玩儿吧! 转载记得标识出处!
谢谢观看,我是骑驴玩儿漂移,甩你三条街~ 白了个白~