树莓派使用 HC-SR04 模块超声波测距,距离有问题

2020-05-27 00:22:09 +08:00
 GunnerX

树莓派连 HC-SR04 这个模块进行超声波测距,连线,py 代码应该都没问题,可是距离一直都在 5.6m 左右不变的,这啥情况?大哥们帮臭弟弟看看吧。我感觉是这个模块有问题? py 代码

import RPi.GPIO as GPIO
import time

Trig_Pin = 23
Echo_Pin = 24

def init():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(Trig_Pin, GPIO.OUT, initial=False)
    GPIO.setup(Echo_Pin, GPIO.IN)
    time.sleep(2)

def distance():
    GPIO.output(Trig_Pin, True)
    time.sleep(0.00001)
    GPIO.output(Trig_Pin, False)
    while not GPIO.input(Echo_Pin):
        pass
    t1 = time.time()
    while GPIO.input(Echo_Pin):
        pass
    t2 = time.time()
    return (t2 - t1) * 340 * 100 / 2

if __name__ == '__main__':
    init()
    try:
        while True:
            print('Distance : {:.2f} cm'.format(distance()))
            time.sleep(1)
    except KeyboardInterrupt:
        GPIO.cleanup()

输出情况,不管怎么给前面放障碍物距离都是 5.6m 左右

Distance : 560.90 cm
Distance : 560.91 cm
Distance : 560.90 cm
Distance : 560.92 cm
Distance : 560.90 cm
Distance : 560.93 cm
Distance : 560.90 cm
1991 次点击
所在节点    Raspberry Pi
4 条回复
CEBBCAT
2020-05-27 00:40:26 +08:00
你这测量的不就是 echo 口高电平的时间吗?高电平的时间就是你拉高 trig 的时间啊,所以是你没有理解超声波测距原理的问题。

另外要跟你再次确认一个知识点,树莓派这种东西不如传统的 Soc 来得实时,你代码拉高 1e-5s 其实可能拉高了 1e-3s 。io 除了电平敏感度之外还有时间敏感度这种东西,必要时也是要考虑的。

没怎么操作过树莓派的 GPIO,但你这个死循环我觉得不妥,可以查查有没有更好的解决办法,事件触发式那种,可以拿中断事件去搜。

另外树莓派供电应该一般,要做好元件供电
CEBBCAT
2020-05-27 00:41:37 +08:00
@CEBBCAT 可以学一下 Arduino 先,那本《爱上 Arduino 》会教电路去抖之类的东西
kokutou
2020-05-27 07:46:53 +08:00
抄的例程?
总感觉不太对啊。。。

先写一个触发一次然后无脑打印 echo 输出+时间戳的程序,看看这个模块返回的是啥样的呗。
GunnerX
2020-05-27 12:20:25 +08:00
@CEBBCAT 嗨,谢谢大哥,但是我也不搞嵌入式开发,只是学校一个课要做的设计,我就想着完成任务完事,不想花太多功夫。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/675789

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX