一、超声波测距
HC-SR04 模块可以测量 3cm – 4m 的距离,精确度可以达到 3mm。这个模块包括 超声波发射器、超声波接收器和控制电路三部分。有 4 个引脚。
接线方式:
4 个引脚由 2 个电源引脚(Vcc 、GND)和 2 个控制引脚(Trig、Echo)组成。
Vcc 和 Gnd 接 5v DC 电源,但不推荐用独立电源给它供电,应使用树莓派或单片机的 GPIO 口输出 5v 和 Gnd 给它供电。不然会影响这个模块的运行。
Trig 引脚用来接收来自树莓派的控制信号。接任意 GPIO 口。
Echo 引脚用来发送测距结果给树莓派。接任意 GPIO 口。
(注意: Echo 返回的是 5v信号,而树莓派的 GPIO 接收超过 3.3v 的信号可能会被烧毁,因此需要加一个分压电路)
二、超声波测距电路图
注意:
实际测试,不需分压电路。
三、代码
测得距离(单位:m) = (pulse_end – pulse_start) * 声波速度 / 2
声波速度取 343m/s 。
然后再把测得的距离转换为 cm。
测得距离(单位:cm) = (pulse_end – pulse_start) * 声波速度 / 2 * 100
= (pulse_end – pulse_start) * 17150
# -*- coding: utf-8 -*-
#导入 GPIO库
import RPi.GPIO as GPIO
import time
#设置 GPIO 模式为 BCM
GPIO.setmode(GPIO.BCM)
#定义 GPIO 引脚
GPIO_TRIGGER = 2
GPIO_ECHO = 3
#设置 GPIO 的工作方式 (IN / OUT)
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)
time.sleep(2)
def distance():
# 发送高电平信号到 Trig 引脚
GPIO.output(GPIO_TRIGGER, True)
# 持续 10 us微秒
time.sleep(0.00001)
GPIO.output(GPIO_TRIGGER, False)
start_time = time.time()
stop_time = time.time()
print(GPIO.input(GPIO_ECHO))
# 记录发送超声波的时刻1
while GPIO.input(GPIO_ECHO) == 0:
pass
start_time = time.time()
# 记录接收到返回超声波的时刻2
while GPIO.input(GPIO_ECHO) == 1:
pass
stop_time = time.time()
# 计算超声波的往返时间 = 时刻2 - 时刻1
time_elapsed = stop_time - start_time
# 声波的速度为 343m/s, 转化为 34300cm/s。
distance = (time_elapsed * 34300) / 2
return distance
if __name__ == '__main__':
try:
while True:
dist = distance()
print("测量距离 = {:.2f} cm".format(dist))
time.sleep(1)
# Reset by pressing CTRL + C
except KeyboardInterrupt:
print("停止测量")
GPIO.cleanup()
# 运行程序
pi@raspberrypi:~ $ python main2.py
0
测量距离 = 3.16 cm
0
测量距离 = 3.12 cm
0
测量距离 = 3.19 cm
0
测量距离 = 4.89 cm
0
测量距离 = 5.09 cm