HC-SR04 超声波测距传感器
1. 实物图及主要参数指标
实物外观
-
模块尺寸:45mm × 20mm × 15mm
-
包含一个超声波发射器和一个接收器
-
4个引脚:VCC、Trig、Echo、GND
技术参数指标
| 参数 | 数值 | 说明 |
|---|---|---|
| 工作电压 | DC 5V | 典型工作电压 |
| 工作电流 | 15mA | 静态电流小于2mA |
| 感应角度 | ≤15° | 探测锥角范围 |
| 探测距离 | 2cm - 400cm | 有效测量范围 |
| 精度 | 3mm | 理论精度 |
| 分辨率 | 1mm | 最小可分辨距离 |
| 测量周期 | ≥60ms | 建议测量间隔 |
| 输出方式 | 数字脉冲信号 | TTL电平 |
2. 引脚定义与接线
| 引脚名称 | 功能描述 | 连接方式 |
|---|---|---|
| VCC | 电源正极 | 接5V电源 |
| Trig | 触发控制信号输入 | 接MCU的GPIO引脚 |
| Echo | 回响信号输出 | 接MCU的GPIO引脚 |
| GND | 电源地 | 接电源地 |
典型接线示例:
HC-SR04 MCU/开发板
VCC → 5V
Trig → GPIO12(输出模式)
Echo → GPIO13(输入模式)
GND → GND
3. 工作原理详解
3.1 传感器工作原理
-
发射超声波:压电陶瓷片在电信号作用下产生40kHz的超声波
-
传播与反射:超声波在空气中传播,遇到障碍物反射
-
接收回波:接收器将反射回的声波转换为电信号
-
信号处理:内部电路处理信号,输出脉冲宽度与距离成正比的信号
3.2 时序图分析

Trig引脚: _______
| |
____________| |__________
↑ ↑
10μs触发脉冲
Echo引脚: __________________________
| |
____________| |__________
↑ ↑
发射开始 回波接收结束
高电平持续时间 = 超声波往返时间
4. 数据采集逻辑与代码实现
4.1 标准测量流程
// 伪代码流程
1. 设置Trig引脚为低电平(至少5μs)
2. 给Trig引脚一个10μs以上的高电平脉冲
3. 等待模块内部自动发送8个40kHz超声波
4. 检测Echo引脚变为高电平(开始计时)
5. 等待Echo引脚变为低电平(停止计时)
6. 计算高电平持续时间t(单位:μs)
7. 计算距离:距离 = (t × 0.034) ÷ 2 (单位:cm)
4.2 Arduino示例代码
const int trigPin = 9;
const int echoPin = 10;
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
// 确保Trig引脚初始为低电平
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
// 发送10μs的高电平触发脉冲
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// 读取Echo引脚的高电平持续时间
long duration = pulseIn(echoPin, HIGH);
// 计算距离(单位:cm)
// 声速340m/s = 0.034cm/μs,除以2是往返距离
float distance = duration * 0.034 / 2;
// 输出结果
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
// 建议测量间隔60ms以上
delay(100);
}
4.3 树莓派Python示例
import RPi.GPIO as GPIO
import time
# 引脚设置
TRIG = 23
ECHO = 24
def setup():
GPIO.setmode(GPIO.BCM)
GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)
GPIO.output(TRIG, GPIO.LOW)
time.sleep(0.5) # 稳定传感器
def get_distance():
# 发送触发信号
GPIO.output(TRIG, GPIO.HIGH)
time.sleep(0.00001) # 10μs
GPIO.output(TRIG, GPIO.LOW)
# 等待回波开始
while GPIO.input(ECHO) == 0:
pulse_start = time.time()
# 等待回波结束
while GPIO.input(ECHO) == 1:
pulse_end = time.time()
# 计算脉冲持续时间
pulse_duration = pulse_end - pulse_start
# 计算距离(cm)
distance = pulse_duration * 17150 # 34300/2,声速343m/s(考虑温度修正)
distance = round(distance, 2)
return distance
def main():
setup()
try:
while True:
dist = get_distance()
print(f"Distance: {dist} cm")
time.sleep(0.1) # 100ms测量间隔
except KeyboardInterrupt:
GPIO.cleanup()
if __name__ == '__main__':
main()
5. 计算公式与单位转换
5.1 基本公式
距离 = (高电平时间 × 声速) / 2
其中:
- 高电平时间单位:秒(s)
- 声速:340m/s(标准条件下)
- 距离单位:米(m)
5.2 常用单位转换
| 时间单位 | 计算公式 | 结果单位 |
|---|---|---|
| 秒(s) | 距离 = (t × 340) / 2 | 米(m) |
| 微秒(μs) | 距离 = (t × 0.034) / 2 | 厘米(cm) |
| 微秒(μs) | 距离 = (t × 340) / 2 × 10⁻⁶ | 米(m) |
实用公式:
距离(cm) = 高电平时间(μs) × 0.017
或
距离(cm) = 高电平时间(μs) / 58
6. 使用注意事项与误差分析
6.1 使用注意事项
-
电源稳定:确保5V供电稳定,波动会影响测量精度
-
测量间隔:两次测量间隔≥60ms,防止信号干扰
-
最小距离:测量距离不应小于2cm,否则可能无法正确检测
-
安装方式:传感器表面应与被测面平行
-
环境影响:避免在高温、高湿、强风环境下使用
6.2 误差来源及修正
| 误差来源 | 影响 | 修正方法 |
|---|---|---|
| 温度变化 | 声速变化 | 加入温度补偿:v = 331.3 + 0.606 × T(℃) |
| 湿度变化 | 声速变化 | 在标准环境下校准 |
| 角度偏差 | 测量值偏大 | 确保传感器垂直被测面 |
| 多次反射 | 测量不稳定 | 避免在狭窄空间使用 |
| 噪声干扰 | 误触发 | 增加软件滤波算法 |
温度补偿公式:
float temperature = 25.0; // 当前温度,单位℃
float speed_of_sound = 331.3 + 0.606 * temperature; // 单位m/s
// 使用温度补偿的距离计算
float distance = (duration * 1e-6 * speed_of_sound * 100) / 2; // 单位cm
7. 常见问题与解决方案
Q1: 传感器一直返回最大值或0
可能原因:
-
接线错误
-
电源不足
-
超出测量范围
-
物体表面吸收超声波(如绒毛、海绵)
解决方案:
-
检查VCC是否为5V
-
确认Trig和Echo引脚连接正确
-
确保被测物体在2-400cm范围内
-
更换反射效果好的被测物
Q2: 测量值跳动较大
解决方案:
-
增加软件滤波(如滑动平均滤波)
-
增加测量间隔时间
-
检查电源稳定性
-
避免在振动的环境中使用
滑动平均滤波示例:
#define FILTER_SIZE 5
float distance_filter[FILTER_SIZE];
int filter_index = 0;
float moving_average_filter(float new_value) {
distance_filter[filter_index] = new_value;
filter_index = (filter_index + 1) % FILTER_SIZE;
float sum = 0;
for(int i = 0; i < FILTER_SIZE; i++) {
sum += distance_filter[i];
}
return sum / FILTER_SIZE;
}
8. 应用场景
-
避障机器人:实时检测前方障碍物距离
-
液位检测:测量液体深度
-
停车辅助:车辆倒车雷达系统
-
物体检测:检测物体是否存在及距离
-
高度测量:结合角度测量物体高度
-
安防系统:入侵检测
9. 扩展应用:多传感器阵列
当需要更广的探测范围时,可以使用多个HC-SR04组成阵列:
// 多传感器控制示例
const int sensorCount = 3;
const int trigPins[] = {9, 10, 11};
const int echoPins[] = {2, 3, 4};
void measureAllSensors() {
for(int i = 0; i < sensorCount; i++) {
// 依次测量每个传感器
float dist = measureSingleSensor(trigPins[i], echoPins[i]);
Serial.print("Sensor ");
Serial.print(i);
Serial.print(": ");
Serial.print(dist);
Serial.println(" cm");
// 传感器间测量间隔
delay(50);
}
}
总结:HC-SR04是一款成本低、使用简单的超声波测距传感器,通过理解其工作原理、时序要求和注意事项,可以广泛应用于各种距离测量场景。在实际使用中,建议加入适当的滤波算法和温度补偿以提高测量精度和稳定性。