Использование `gpiozero` на`raspberry pi` для управления выводами, но выходные выводы сбрасываются при выходе из скрипта, даже если состояние запоминается между запусками
Я использую gpiozero
для управления устройствами на Raspberry Pi. Когда я создаю ссылку на (например) светодиодное устройство, есть параметр для создания объекта без изменения его текущего состояния: initial_state=None
, (По умолчанию initial_state=False
, который автоматически отключает значение при создании эталонного объекта). Проблема в том, что всегда кажется, что при выходе из скрипта аппаратный вывод сбрасывается (хотя, как ни странно, это не внутреннее "состояние"). Что еще хуже, когда я снова запускаю скрипт, он знает состояние, в котором я его оставил, и возвращает физический вывод в это состояние!
Вот моя программа включения / выключения перемычек, теперь она имеет паузу ввода, в течение которой состояние остается неизменным, но при выходе из программы контакты сбрасываются. (Хотя, как я уже упоминал выше, состояние "запоминается")
#!/usr/bin/env python
from __future__ import print_function
import sys
import time
from gpiozero import LED
jump1=LED(17,initial_value=None)
jump2=LED(27,initial_value=None)
if len(sys.argv)>1:
print ("Jumper were: (%s,%s)"%(str(jump1.is_active),str(jump2.is_active)))
if sys.argv[1].lower() == 'on':
jump1.on()
jump2.on()
print ('turned both on')
elif sys.argv[1].lower() == 'off':
jump1.off()
jump2.off()
print ('turned both off')
print ("Jumper Currently: (%s,%s)"%(str(jump1.is_active),str(jump2.is_active)))
raw_input("Press enter to exit.")
Кто-нибудь знает способ сказать gpiozero
оставить оборудование в покое после выхода? Этот вопрос подробно описывает аналогичную проблему, хотя и в другом модуле.
(Редактировать: оказывается, что модуль gpiozero изменяет направление вывода на вход, но не изменяет выходную защелку, которая возвращает старое состояние, когда направление вывода возвращается на выход.)
1 ответ
Я переписал с использованием модуля RPi.GPIO вместо gpiozero. Это выглядит по-другому, но это было проще, чем поиск способа сделать выход без очистки с помощью gpiozero.
Вот "эквивалентная" программа без очистки булавки.
#!/usr/bin/env python
from __future__ import print_function
import sys
import time
import RPi.GPIO as GPIO
# these pin numbers map have to change
# try the 'pinout' command from the bash prompt
pina = 17
pinb = 27
# set pins up:
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(pina, GPIO.OUT)
GPIO.setup(pinb, GPIO.OUT)
if len(sys.argv)>1:
print ("Jumpers were: (%s,%s)"% (str(GPIO.input(pina)),str(GPIO.input(pinb))))
if sys.argv[1].lower() == 'on':
GPIO.output(pina, GPIO.HIGH)
GPIO.output(pinb, GPIO.HIGH)
print ('turned both on')
elif sys.argv[1].lower() == 'off':
GPIO.output(pina, GPIO.LOW)
GPIO.output(pinb, GPIO.LOW)
print ('turned both off')
print ("Jumpers now: (%s,%s)"% (str(GPIO.input(pina)),str(GPIO.input(pinb))))
#raw_input("Press enter to exit.") # optional pause for testing
# Note: I/O pins will remain at their last state.
Не особо поддерживается в gpiozero.
Здесь идет "продолжающееся" обсуждение:https://github.com/gpiozero/gpiozero/issues/707
Есть хак, упомянутый CAM-Gerlach, который, кажется, работает:
import gpiozero.pins.rpigpio
def close(self): pass
gpiozero.pins.rpigpio.RPiGPIOPin.close = close
gpiozero.LED(..., pin_factory=gpiozero.pins.rpigpio.RPiGPIOFactory())
Мы в основном перезаписываем функцию закрытия PinFactory и используем ее для создания светодиода.