HC-SR04是一种超声波测距模块,其工作原理基于超声波的发射和接收。该模块可提供2cm至400cm的非接触式距离感测功能,测距精度达到3mm。以下是其工作原理的详细描述:
- 硬件准备:首先,需要给超声波模块接入电源和地线,以确保其正常工作。
- 触发测距:通过给脉冲触发引脚(trig)输入一个长为10us以上时长的高电平方波,模块会自动发射8个40KHz的声波。与此同时,回波引脚echo端的电平会由0变为1。此时,应启动定时器开始计时。
- 接收回波:当超声波遇到障碍物并返回时,回波引脚端的电平会由1变为0。此时,应停止定时器计数。定时器所记录的时间即为超声波从发射到返回的总时长。
- 距离计算:根据声音在空气中的速度(约为344米/秒),可以计算出所测的距离。具体计算公式为:测试距离 = (计时时间 × 声速)/ 2。
- 消抖处理:由于超声波测量的时间很短,一次测量可能存在误差。为了获得更准确的结果,可以通过多次测量求平均值的方式进行消抖处理。
此外,HC-SR04超声波测距模块具有计算简单、易于实时控制、测量精度高等优点,因此在移动机器人研制等领域得到了广泛应用。、
引脚接线:
HC-SR04 | RP2040 |
VCC | VCC |
Trig | GPIO1 |
Echo | GPIO0 |
Gnd | Gnd |
代码:
from machine import Pin
import time
# 超声波测距模块
trig = Pin(1,Pin.OUT) # Trig_RX_SCL_I/O
echo = Pin(0,Pin.IN,Pin.PULL_UP) # Echo_Tx_SDA
def HCSR04(trig,echo,mode):
trig.value(0) # 先通过GPIO把MCU触发信号信号拉低2us
time.sleep_us(2)
trig.value(1) # 再通过GPIO把MCU触发信号信号拉高10us,触发模块测距
time.sleep_us(10)
trig.value(0) # 再通过GPIO把MCU触发信号信号拉低
while echo.value() == 0:
high = time.ticks_us() # time.ticks_us返回不断递增的微秒计数器
#print("high: ", high)
while echo.value() == 1:
low = time.ticks_us()
distance = 0
if mode:
# 计算方法1
distance = (low - high) / 58 # us
else:
# 计算方法2 - 根据Echo管脚高电平的持续时间计算距离值
distance = ((low - high) * 0.0340) / 2 # 声速
time.sleep(0.2) # 两次测量时间不能低于200ms
if distance > 400:
distance = 0 # 有效距离2 - 400cm
return distance
def main():
while True:
distance = HCSR04(trig,echo,1) # 听过HCSR04函数返回距离值
print(str(distance)+'cm')
if __name__ == "__main__":
main()
运行结果: