Выход ультразвукового датчика Raspberry Pi останавливается после нескольких итераций цикла while

Я сделал этого простого робота из 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, программа выводит "Привет"... ДО ЭТОГО:

Изображение вывода ультразвукового датчика расстояния. Вы можете видеть, что поток вывода просто останавливается. Буквально останавливается и все. Ни сообщения об ошибке, ничего. И самое худшее в этом то, что он делает это случайным образом. Он мог зависнуть, когда просто распечатывал расстояние, он мог зависать, когда печатал «Привет», но я заметил, что он останавливался намного чаще, когда печатал «Привет», и он останавливался после случайного количества выходов. Итак, следующее, что я делаю, это нажимаю ctrl+c, чтобы остановить программу, и вот как она выглядит .Я также забыл упомянуть, что три ультразвуковых датчика соединены вместе как один и используют только GPIO 21 и GPIO 20. Однако он все еще работает, и даже когда у них были свои отдельные пары контактов, у них все еще была одна и та же проблема с остановкой, поэтому это не имеет значения.

Если у кого-то есть идеи относительно того, что вызывает это, я был бы так счастлив, потому что я трачу часы, пытаясь это исправить.


person Bankrupt Spetsnaz 1991    schedule 22.10.2016    source источник
comment
Возможно, вы захотите добавить небольшой сон в два цикла while, которые у вас есть внутри вашего метода distance. В настоящее время они будут потреблять много циклов, просто вытягивая g.input.   -  person Tammo Heeren    schedule 22.10.2016
comment
Ну, я добавил t.sleep(0.01) между первым циклом while и вторым, и это испортило вывод до отрицательного значения 0_o...   -  person Bankrupt Spetsnaz 1991    schedule 23.10.2016
comment
Я имел в виду как часть цикла while, а не между циклами.   -  person Tammo Heeren    schedule 23.10.2016
comment
Я был немного смущен тем, куда должен был идти t.sleep(), но да, он должен был пройти другой цикл while. Хорошо, это сработало, спасибо.   -  person Bankrupt Spetsnaz 1991    schedule 24.10.2016


Ответы (1)


Краткий ответ: добавьте сон 0,01 в цикл while после функции. Проблема в том, что Pi работает быстрее, чем датчик, не вызывая ошибок, просто тайм-аут.

Как сказал Таммо Хирен, добавьте сон. Ультразвуковые датчики могут получать и отправлять данные только так быстро (приблизительно со скоростью звука), но Pi может вычислять, может быть, даже астрономически небольшое количество быстрее, но этого будет достаточно, потому что Pi и датчик будут рассинхронизированы. Разница в начале небольшая, но со временем становится больше. Ваша программа останавливается случайным образом, вероятно, из-за того, что процессор не набирает скорость (также известный как отставание), и для выхода требуется немного больше времени.

person Will4cat    schedule 23.10.2016