树莓派测距 - HC-SR04超声波传感器

本文将介绍树莓派如何使用HC-SR04超声波测距传感器。

声音通过介质(例如空气)进行传播,人耳只能听到一定声波频率范围的声音。超声波是指振动频率大于20000Hz以上的、其每秒的振动频率甚高,超出了人耳听觉的一般上限(20000Hz)。超声波传感器被设计为使用类似于雷达的超声波反射来感测物体的接近或范围,通过传感器与物体之间声音传播的时间来计算两者之间的距离。

超声波传感器由一个或多个超声波发射器(基本上是扬声器)、接收器和控制电路组成。发射器发出高频超声波,该超声波遇到障碍物会进行反射,接收器接收到反射的超声波,并由控制电路进行处理,以计算出发送和接收超声波之间的时间间隔,再通过声速,计算出传感器和障碍物之间的距离。
HC-SR04超声波传感器外观图:

超声波传感器测距原理图:

1
2
time_interval = receive_time - send_time
distance = (sound_velocity * time_interval) / 2

HC-SR04超声波传感器有4个引脚:

  • ground(GND)
  • Echo pulse output(ECHO),5V脉冲信号
  • Trigger pulse input(TRIG),10us TTL脉冲
  • Vcc(5V 供电)

Vcc使用树莓派的5V输出供电,GND与树莓派的GND连接。测距过程如下:

  1. 树莓派通过GPIO发送一个持续10us的脉冲信号给TRIG引脚;
  2. HC-SR04接收到树莓派发送的脉冲信号,开始发送超声波,并把ECHO引脚置为高电平(5V);
  3. 超声波遇到障碍物反弹,被HC-SR04传感器接收,把ECHO引脚置为低电平(0V);

HC-SR04超声波测距传感器ECHO输出信号电压将近5V,树莓派GPIO引脚只能接收3.3V的输入,直接把ECHO引脚与树莓派的GPIO连接可能会导致树莓派损坏,这里我们还需要增加一个分压电路,使用到两个电阻(1KΩ和2KΩ各一个)。以下是与树莓派连接的电路图:

这里使用树莓派的GPIO5连接HC-SR04的TRIG,使用GPIO6接收ECHO信号。以下是python测距代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import RPi.GPIO as GPIO
import time

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)

GPIO_TRIGGER = 5
GPIO_ECHO = 6

GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)

def distance():
GPIO.output(GPIO_TRIGGER, False)
time.sleep(0.000002)
GPIO.output(GPIO_TRIGGER, True)
time.sleep(0.00001)
GPIO.output(GPIO_TRIGGER, False)

ii = 0
while GPIO.input(GPIO_ECHO) == 0:
ii = ii + 1
if ii > 10000:
print('Ultrasound error: the sensor missed the echo')
return 0
pass

start_time = time.time()

while GPIO.input(GPIO_ECHO) == 1:
pass

stop_time = time.time()

time_elapsed = stop_time - start_time
distance = (time_elapsed * 34300) / 2

return distance

if __name__ == '__main__':
try:
while True:
dist = distance()
print("Measured Distance = {:.2f} cm".format(dist))
time.sleep(1)

# Reset by pressing CTRL + C
except KeyboardInterrupt:
print("Measurement stopped by User")
GPIO.cleanup()

参考: