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

Я сделал этого простого робота, используя 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. Это все еще работает, хотя и даже когда у них были свои собственные отдельные пары контактов, у них все еще была та же самая проблема с зависанием, поэтому она не делает разница.

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

2 ответа

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

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

Проблема в ваших циклах while. Вы проверяете активность процессора, когда ваша программа внезапно останавливается. Должно быть, он внезапно достиг 100 процентов. Причина этого в том, что один из ваших циклов while стал бесконечным циклом, поскольку заданное вами условие не достигнуто, то есть g.input(echo)=0 и g.input(echo)=1. Это может произойти из-за неправильных данных, отправленных датчиком, может быть связано с некоторыми изменениями окружающей среды или колебаниями напряжения.

Вы должны добавить одно условие в свои циклы while, что, если условие не достигнуто, оно должно разорвать цикл и запустить весь процесс снова, иначе ваша программа окажется в ловушке бесконечного цикла while.

Также вы не должны помещать команду sleep в свой цикл while, так как это изменит время полученного эхо-сигнала и даст вам ложное значение расстояния.

Другие вопросы по тегам