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