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是一款成本低、使用简单的超声波测距传感器,通过理解其工作原理、时序要求和注意事项,可以广泛应用于各种距离测量场景。在实际使用中,建议加入适当的滤波算法和温度补偿以提高测量精度和稳定性。