海口市网站建设_网站建设公司_展示型网站_seo优化
2026/1/11 23:25:09 网站建设 项目流程

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 传感器工作原理

  1. 发射超声波:压电陶瓷片在电信号作用下产生40kHz的超声波

  2. 传播与反射:超声波在空气中传播,遇到障碍物反射

  3. 接收回波:接收器将反射回的声波转换为电信号

  4. 信号处理:内部电路处理信号,输出脉冲宽度与距离成正比的信号

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 使用注意事项

  1. 电源稳定:确保5V供电稳定,波动会影响测量精度

  2. 测量间隔:两次测量间隔≥60ms,防止信号干扰

  3. 最小距离:测量距离不应小于2cm,否则可能无法正确检测

  4. 安装方式:传感器表面应与被测面平行

  5. 环境影响:避免在高温、高湿、强风环境下使用

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

可能原因:

  • 接线错误

  • 电源不足

  • 超出测量范围

  • 物体表面吸收超声波(如绒毛、海绵)

解决方案:

  1. 检查VCC是否为5V

  2. 确认Trig和Echo引脚连接正确

  3. 确保被测物体在2-400cm范围内

  4. 更换反射效果好的被测物

Q2: 测量值跳动较大

解决方案:

  1. 增加软件滤波(如滑动平均滤波)

  2. 增加测量间隔时间

  3. 检查电源稳定性

  4. 避免在振动的环境中使用

滑动平均滤波示例:

#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. 应用场景

  1. 避障机器人:实时检测前方障碍物距离

  2. 液位检测:测量液体深度

  3. 停车辅助:车辆倒车雷达系统

  4. 物体检测:检测物体是否存在及距离

  5. 高度测量:结合角度测量物体高度

  6. 安防系统:入侵检测

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询