当前位置:   article > 正文

stm32超声波测距代码_树莓派上使用HC-SR04超声波测距模块

上位机树莓派超声波测距传给下位机stm32

a8008fa2446b9f5a45d62b21150a6563.png

超声波测距的原理很简单,高中物理题不是做过很多次了么

9686d22a63c1205e46a621893d46a8f8.png


超声波测距原理
可以看到,知道时间间隔就能得到距离 L。
那么 HC-SR04 是怎么测距的呢?又怎么使用树莓派控制它?

HC-SR04 介绍

HC-SR04 模块可以测量 3cm – 4m 的距离,精确度可以达到 3mm。这个模块包括 超声波发射器、超声波接收器和控制电路三部分。有 4 个引脚。
HC-SR04 实物图

102739d64cf69c09b9029b419b7dedbe.png


HC-SR04参数表

接线方式

4 个引脚由 2 个电源引脚(Vcc 、GND)和 2 个控制引脚(Trig、Echo)组成。
Vcc 和 Gnd 接 5v DC 电源,但不推荐用独立电源给它供电,应使用树莓派或单片机的 GPIO 口输出 5v 和 Gnd 给它供电。不然会影响这个模块的运行。
Trig 引脚用来接收来自树莓派的控制信号。接任意 GPIO 口。
Echo 引脚用来发送测距结果给树莓派。接任意 GPIO 口。

(注意 Echo 返回的是 5v信号,而树莓派的 GPIO 接收超过 3.3v 的信号可能会被烧毁,因此需要加一个分压电路)

HC-SR04 的测距过程

1. 树莓派向 Trig 脚发送一个持续 10us 的脉冲信号。
2. HC-SR04 接收到树莓派发送的脉冲信号,开始发送超声波 (start sending ultrasoun),并把 Echo置为高电平。 然后准备接收返回的超声波。
3. 当 HC-SR04 接收到返回的超声波 (receive returned ultrasound) 时,把 Echo 置为低电平。

从上述过程可以看出, Echo 高电平持续的时间就是超声波从发射到返回所经过的时间间隔 ~

请对照下图。

4150b3b48507baaf4d9342b34276c915.png


电路图与 python 程序

093a98af741203cbe55660c843cb6ede.png


电路图
接线跟前文所说的一样。 GPIO 2 脚接 Trig , GPIO 3 脚接 Echo 。树莓派的 +5v 和 Gnd 与 HC-SR04 的 Vcc 和 Gnd 相连。还有一个分压电路,一端接 Echo ,另一端接 Gnd。

1k 和 2k 电阻组成了一个分压电路,使 GPIO 3 脚的电压降到了 3.3v 左右。

python 程序

初始化相关引脚:

599e8e0c8df697345fd0e38467da8642.png

2 脚连 Trig ,设为输出模式; 3 脚连 Echo,设为输入模式。
然后向 Trig 引脚输入 10us 的脉冲:

b35aca1f55ed760c3ab1f70350322ee0.png

time.sleep() 接收的参数单位为 s ,于是把10 us 转换为 0.00001 s 。
接收到这个脉冲后,HC-SR04 发射出超声波,同时把 Echo 置为高电平。在发射之前,Echo 一直为低电平。
据此编写程序,记录超声波发射时的时间。

bd6e26e8fa7d0ee4c1d66104889619a3.png

然后记录超声波返回时的时间。

f1cf5901c951f4f737ea81f7344291ea.png

这样就获得了我们需要的数据 pulse_start 和 pulse_end ,可以算出距离了~
测得距离(单位:m) = (pulse_end – pulse_start) * 声波速度 / 2
声波速度取 343m/s 。

然后再把测得的距离转换为 cm。

测得距离(单位:cm) = (pulse_end – pulse_start) * 声波速度 / 2 * 100
= (pulse_end – pulse_start) * 17150

61be1fa686ee7d7c21ee44c9900117c1.png

以下是完整代码。

  1. #导入 GPIO库
  2. import RPi.GPIO as GPIO
  3. import time
  4. #设置 GPIO 模式为 BCM
  5. GPIO.setmode(GPIO.BCM)
  6. #定义 GPIO 引脚
  7. GPIO_TRIGGER = 23
  8. GPIO_ECHO = 24
  9. #设置 GPIO 的工作方式 (IN / OUT)
  10. GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
  11. GPIO.setup(GPIO_ECHO, GPIO.IN)
  12. def distance():
  13. # 发送高电平信号到 Trig 引脚
  14. GPIO.output(GPIO_TRIGGER, True)
  15. # 持续 10 us
  16. time.sleep(0.00001)
  17. GPIO.output(GPIO_TRIGGER, False)
  18. start_time = time.time()
  19. stop_time = time.time()
  20. # 记录发送超声波的时刻1
  21. while GPIO.input(GPIO_ECHO) == 0:
  22. start_time = time.time()
  23. # 记录接收到返回超声波的时刻2
  24. while GPIO.input(GPIO_ECHO) == 1:
  25. stop_time = time.time()
  26. # 计算超声波的往返时间 = 时刻2 - 时刻1
  27. time_elapsed = stop_time - start_time
  28. # 声波的速度为 343m/s, 转化为 34300cm/s。
  29. distance = (time_elapsed * 34300) / 2
  30. return distance
  31. if __name__ == '__main__':
  32. try:
  33. while True:
  34. dist = distance()
  35. print("Measured Distance = {:.2f} cm".format(dist))
  36. time.sleep(1)
  37. # Reset by pressing CTRL + C
  38. except KeyboardInterrupt:
  39. print("Measurement stopped by User")
  40. GPIO.cleanup()
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/479335
推荐阅读
相关标签
  

闽ICP备14008679号