Датчик движения нити с Raspberry Pi и OctoPrint
Я пытаюсь сделать датчик движения нити и интегрировать его с Octoprint, работающим на Raspberry Pi 3 model B+.
Моя цель - создать устройство, которое приостанавливает печать, когда обнаруживает, что нить не движется в течение определенного времени, скажем, 10 секунд.
Я уже собрал прототип из лежащего вокруг хлама и игрушечной машинки, украденной у моего брата, и подключил его к Raspberry. Он использует модуль кодировщика оптопары со встроенным LM393 и другим оборудованием. Его цифровой выход подключен к контакту GPIO Raspberry. Нить накала проходит между резиновыми колесами, поворачивая их, а на оси верхнего колеса установлено колесо энкодера, изменяющее состояние датчика.
А вот и моя проблема. Я не совсем знаком с Python, особенно с прерываниями.
Я умею читать состояние датчика в цикле:
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(26, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
try:
while True:
if (GPIO.input(26) == 1)
do magic
elif (GPIO.input(26) == 0)
do other magic
Я также видел, что для этого лучше использовать прерывания:
GPIO.setup(pin, GPIO.IN)
GPIO.add_event_detect(pin, GPIO.BOTH, callback = function)
но я понятия не имею, как настроить обратный отсчет, который будет отсчитывать от 10 до 0 после изменения состояния датчика И который останавливался и сбрасывался при изменении состояния и снова считал.
Когда обратный отсчет фактически дойдет до 0, это вызовет другой вывод GPIO.
После решения этой проблемы я бы использовал плагин OctoPrint
для обработки сигнала индикации замятия и приостановки печати.
Я бы также с радостью сделал лучший дизайн сенсора и поделился бы им с вещами или чем-то еще.
И да, я знаю, что коммерческий универсальный датчик заклинивания уже существует, но нет никакого удовольствия в том, чтобы просто покупать все и не использовать мусор (и не красть автомобильные игрушки). Я тоже считаю, что моя идея немного дешевле.
1 ответ
Вы бы использовали таймер.
import threading def hello(): print "hello, world" t = Timer(30.0, hello) t.start() # after 30 seconds, "hello, world" will be printed
из https://docs.python.org/3.8/library/threading.html
Код аналогичен при переходе к плагину OctoPrint.
def hello(): print("Hello World!") t = RepeatedTimer(1.0, hello) t.start() # prints "Hello World!" every second
из https://docs.octoprint.org/en/master/modules/util.html?highlight=repeatedtimer