收藏

HC-SR04 超声波传感器 超声波测量距离

分类: 电子元件模块 >> 传感器 发布于 2024-05-15 282次阅读0点赞0收藏

模块资料

型号 HC-SR04
工作电压 DC 5V
工作电流 3.3mA
工作温度 -40~85℃
输出方式 GPIO
探测距离 2cm~600cm
探测精度 3mm

实验原理


更多资料下载:

HC-SR04资料.zip: https://url78.ctfile.com/f/48495678-8435164507-23c8f2?p=549588 (访问密码: 549588)

工作原理介绍

传感器发射器向某一个确定的方向发射超声波的同时进行计时,超声波在碰触到障碍物之后会返回给超声波接收器一个反射波,此时停止计时,将时间纪录为 t。根据速度距离公式,结合超声波的传播速度与时间 t,可以推算出超声波发射点与所测量障碍物之间的距离为S=340t/2

1、 采用 IO 口 TRIG 触发测距,给最少 10us 的高电平
2、 模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回
3、 有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。
测试距离 =( 高电平时间*声速 (343M/S))/2;
distance_cm= ( us)/58

注意:测量周期应为60ms以上,以防止发射信号对回响信号的影响,被测物体的面积应不小于0.5平方米且尽量要求平整,否则影响结果
HC-SR04 超声波传感器引脚定义
HC-SR04 是最常用的超声波传感器之一,适用于距离测量,测量范围一般为 2cm~400cm,精度约 3mm。它共有 4 个引脚,功能如下:

引脚名称 符号 功能描述
电源正极 VCC 接直流电源(通常为 +5V),为传感器提供工作电压。
触发信号输入 TRIG 输入触发脉冲信号(至少 10μs 的高电平信号),用于启动测距操作。
回声信号输出 ECHO 输出与测距对应的脉冲信号,高电平持续时间代表超声波从发射到接收的时间间隔。
电源负极 GND 接地,提供电源参考电位。

关键引脚功能详解

1、 触发信号输入(TRIG)
作用:通过单片机或控制器向 TRIG 引脚发送一个 高电平脉冲(宽度 ≥10μs),传感器接收到该脉冲后,会自动发射 8 个 40kHz 的超声波脉冲,并开始计时。
信号要求:
高电平持续时间只需满足 ≥10μs,通常用单片机的 GPIO 口输出 10μs~20μs 的脉冲即可。
触发信号的频率不能过高(建议两次测距间隔 ≥60ms),避免超声波重叠干扰。
2、回声信号输出(ECHO)
作用:传感器发射超声波后,若遇到障碍物反射回来,ECHO 引脚会输出一个 高电平脉冲,其 高电平持续时间 对应超声波从发射到接收的时间(即 飞行时间,T)。
计算原理:
距离公式:距离(cm)= (声速 × T)/ 2
声速默认取 340m/s(空气中,20℃时),因此公式可简化为:距离 = 高电平时间(μs)× 0.034 / 2 = 高电平时间 × 0.017。
例如:若 ECHO 高电平持续时间为 2000μs,则距离为 2000 × 0.017 = 34cm。
3、 电源引脚(VCC 和 GND)
电压要求:必须提供稳定的 +5V 直流电源,电源波动可能导致测量误差或传感器工作异常。
抗干扰措施:若系统中有多个传感器或高频元件,建议在 VCC 和 GND 之间并联一个 100μF 电解电容,用于滤波。

注意事项

测量盲区:
传感器正前方近距离存在盲区(通常为 2cm~5cm),无法检测小于该距离的物体。
环境干扰:
避免在强风、高温、高湿度或有大量粉尘的环境中使用,这些因素会影响声速,导致测量误差。
远离强电磁干扰源(如电机、变频器等),防止干扰触发或回声信号。

电路连接

模块引脚 ESP32引脚
Vcc 5V
Trig GPIO15
Echo GPIO4
GND GND

程序代码

from machine import Pin
import time

"""
echo脚会由0变为1此时MCU开始计时,当超声波模块接收到返回的声波时,echo由1变为0此时MCU停止计时
然后再通过声音的传输速度是340m/s就可以计算出距离,切记要除以2,毕竟声音是来回的距离
"""


def measure():
    # 告诉芯片要开始测试了
    trig.value(1)
    time.sleep_us(10)
    trig.value(0)

    # 检测回响信号,为低电平时,测距完成
    while echo.value() == 0:
        # 开始不断递增的微秒计数器 1
        t1 = time.ticks_us()
    print("---------------------")
    print(t1)
    # 检测回响信号,为高电平时,测距开始
    while echo.value() == 1:
        # 开始不断递增的微秒计数器 2
        t2 = time.ticks_us()
    print(t2)

    # 计算两次调用 ticks_ms(), ticks_us(), 或 ticks_cpu()之间的时间,这里是ticks_us()
    # 这时间差就是测距总时间,在乘声音的传播速度340米/秒,除2就是距离
    # 例如 t2-t1=12848此时单位是us,转换为秒就是12848 / 1000000 此时单位是秒,此时如果乘以340计算出的单位是米,
    # 然后再乘以100就是厘米,因此,直接 用12848/10000即可
    t3 = time.ticks_diff(t2, t1) / 10000
    print(t3, t2-t1)

    # 这里返回的是:开始测距的时间减测距完成的时间*声音的速度/2(来回)
    return t3 * 340 / 2

# 引脚设定
trig = Pin(15, Pin.OUT)
echo = Pin(2, Pin.IN)
trig.value(0)
echo.value(0)
# try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理  
try:
    while True:
        print("当前测量距离为:%0.2f cm" % measure())
        time.sleep(1)

except KeyboardInterrupt:
    pass

结果演示

VIP
购买
建议
意见
联系
客服
在线咨询

您可以与在线客服进行沟通获得帮助

工作日:8:00~22:00节假日:9:00~20:00

微信号: mpyos01

Q Q号: 1401211620

免费
福利
0.026026s