跑跑啦航模

树莓派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)及简书的相关教程*