树莓派HC-SR04超声波测距模块教程
一、HC-SR04简介

HC-SR04超声波测距模块通过发射超声波并计算回波时间来计算距离。测量范围2cm-400cm,精度约3mm。
工作原理:
Trig引脚触发后模块发射8个40kHz超声波
Echo引脚输出高电平脉冲
脉冲宽度即声波往返时间
距离 = 时间 × 声速 ÷ 2

技术参数:
| 参数 | 值 |
|---------|------|
| 工作电压 | 5V DC |
| 工作电流 | 15mA |
| 测量范围 | 2cm - 400cm |
| 精度 | ±3mm |
| 超声波频率 | 40kHz |
| 触发脉冲 | 10us TTL |
| 回波信号 | 5V电平脉冲 |
二、硬件接线

引脚对应表:
| HC-SR04 | 树莓派GPIO | 说明 |
|---------|-----------|------|
| VCC | 5V (Pin 2或4) | 供电 |
| Trig | GPIO23 (Pin 16) | 触发输入 |
| Echo | GPIO24 (Pin 18) | 回波输出 |
| GND | GND (Pin 6) | 接地 |
⚠ 重要注意事项: Echo输出5V电平,树莓派GPIO耐压仅3.3V,必须使用分压电路保护!
分压电路(电阻分压法):

使用1kΩ和2kΩ电阻组成分压器:
- Echo → 1kΩ电阻 → GPIO24
- GPIO24 → 2kΩ电阻 → GND
这样可将Echo的5V信号降低至3.3V左右。
三、Python代码

```python
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
TRIG = 23
ECHO = 24
GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)
def measure_distance():
# 确保Trig为低电平
GPIO.output(TRIG, False)
time.sleep(0.2)
# 发送10us触发脉冲
GPIO.output(TRIG, True)
time.sleep(0.00001)
GPIO.output(TRIG, False)
# 记录发送时刻
while GPIO.input(ECHO) == 0:
pulse_start = time.time()
if time.time() - pulse_start > 0.1:
return -1 # 超时
# 记录接收时刻
while GPIO.input(ECHO) == 1:
pulse_end = time.time()
if time.time() - pulse_start > 0.1:
return -1 # 超时
# 计算距离(声速34300cm/s,往返时间除2)
pulse_duration = pulse_end - pulse_start
distance = pulse_duration * 34300 / 2
return distance
try:
while True:
dist = measure_distance()
if dist > 0:
print(f"距离: {dist:.1f} cm")
else:
print("测量超时")
time.sleep(1)
except KeyboardInterrupt:
GPIO.cleanup()
print("程序退出")
```

四、测距时序图

超声波测距的完整时序:
树莓派向Trig发送10us高电平脉冲
HC-SR04接收到脉冲后,发射8个40kHz超声波
同时Echo变为高电平
超声波遇到障碍物返回
HC-SR04接收到回波后Echo变为低电平
树莓派测量Echo高电平持续时长

@@IMG@@b18-9.png@@/IMG@@
五、常见问题
- Echo信号电压过高:必须使用分压电路(1kΩ+2kΩ),否则可能损坏树莓派GPIO
- 测量结果不稳定:可多次测量取平均值(建议5-10次)
- 测量盲区:HC-SR04最小测量距离约2cm,2cm内无法准确测量
- 角度影响:被测物表面需与传感器大致垂直,偏角过大会导致测不准
- 环境干扰:强风、强噪声环境可能影响测量精度

提高精度的技巧:
```python
def measure_avg(samples=5):
distances = []
for _ in range(samples):
d = measure_distance()
if d > 0:
distances.append(d)
time.sleep(0.05)
if distances:
return sum(distances) / len(distances)
return -1
```
*本文整理自树莓派实验室(shumeipai.nxez.com)及简书的相关教程*

微信联系
淘宝联系