学习笔记——HC-SR04 超声波测距传感器

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

相关推荐
superman超哥2 小时前
Context与任务上下文传递:Rust异步编程的信息高速公路
开发语言·rust·编程语言·context与任务上下文传递·rust异步编程
步达硬件2 小时前
【Matlab】批量自定义图像处理
开发语言·matlab
军军君012 小时前
Three.js基础功能学习七:加载器与管理器
开发语言·前端·javascript·学习·3d·threejs·三维
liulilittle2 小时前
OPENPPP2 网络驱动模式
开发语言·网络·c++·网络协议·信息与通信·通信
Joshua-a2 小时前
高云FPGA在线调试/逻辑分析仪简要使用流程
嵌入式硬件·fpga开发·高云
mjhcsp2 小时前
C++ AC 自动机:原理、实现与应用全解析
java·开发语言·c++·ac 自动机
huihuihuanhuan.xin2 小时前
后端八股之java并发编程
java·开发语言
国科安芯2 小时前
高轨航天器抗辐照MCU选型约束分析
单片机·嵌入式硬件·性能优化·机器人·安全性测试
寻星探路2 小时前
【算法通关】双指针技巧深度解析:从基础到巅峰(Java 最优解)
java·开发语言·人工智能·python·算法·ai·指针