0

我使用 LEGO 制作了这个简单的机器人,它使用 Raspberry Pi 作为计算机。我编写的代码是用 Python 编写的,基本上它的作用是使用超声波传感器来测量距离。这是代码:

import RPi.GPIO as g
import time as t
g.setmode(g.BCM)
g.setwarnings(False)

# trig is the pin on the sensor which will emit a very fast pulse
trig = 21
# echo is the pin which will recieve the pulse from the trig 
echo = 20

g.setup(trig, g.OUT)
g.setup(echo, g.IN)

def distance(dur):
    global dis
    start = 0
    end = 0
    g.output(trig, False)
    t.sleep(0.01)
    g.output(trig, True)
    t.sleep(0.00001)
    g.output(False)
    while g.input(echo) == 0:
        start = t.time()
    while g.input(echo) == 1:
        start = t.time()
    duration = end - start
    dis = duration * 17150
    dis = round(dis,2)
    print "Distance: " + dis
    t.sleep(dur)

while True:
    # so the function is being called, and the time between outputs is 0.01 seconds so it is very 
    # fast and quickly showing on the screen. If the distance is less than 5, then the program 
    # will print out "Hi" to show that. s
    distance(0.01)
    if dis < 5:
        print "Hi"

很简单吧?但是你看,代码执行得非常完美,它显示了距离,当我把手靠近传感器并且变量 dis 变得小于 5 时,程序打印出“Hi”......直到这个:

超声波传感器距离输出图片。 您可以看到输出流刚刚停止。它真的停止了,就是这样。没有错误信息,什么都没有。最糟糕的是,它是随机执行的。它在打印距离时可能会停止,在打印“Hi”时可能会停止,但我确实注意到它在打印“Hi”时停止的频率更高,并且在随机数量的输出后停止。所以接下来我要做的是按 ctrl+c 停止程序,这就是它的样子我还忘了提到三个超声波传感器连接在一起,只使用 GPIO 21 和 GPIO 20。尽管它仍然可以工作,即使它们有自己的独立引脚对,它们仍然存在相同的失速问题,所以它不会一个区别。

如果有人知道是什么原因造成的,我会很高兴,因为我花了几个小时试图修复它。

4

1 回答 1

1

简短答案:在函数之后的 while 循环中添加 0.01 的睡眠问题是 Pi 的运行速度比传感器快,不会导致错误,只是超时。

就像 Tammo Heeren 说的,加个睡眠。超声波传感器只能以如此快的速度获取和发送数据(大约是声速),但树莓派的计算速度甚至可能只是天文数字的一小部分,但这已经足够了,因为树莓派和传感器将不同步。一开始的差异很小,但随着时间的推移会变得更大。您的程序随机停止可能是因为 CPU 没有达到速度(又名滞后)并且需要更长的时间才能退出。

于 2016-10-23T18:36:58.020 回答