在 `raspberry pi` 上使用 `gpiozero` 来控制引脚,但输出引脚会在脚本退出时重置,即使在运行之间会记住状态
Using `gpiozero` on `raspberry pi` to control pins, but output pins are reset upon script exit, even though state is remembered between runs
我正在使用 gpiozero
来控制 Raspberry Pi 上的设备。当我创建对(例如)LED 设备的引用时,有一个用于创建对象而不影响其当前状态的参数:initial_state=None
。 (默认值为 initial_state=False
,它会在创建引用对象时自动关闭该值)问题是它似乎总是在脚本退出时重置硬件引脚(尽管奇怪的是内部 "state" 没有)。更糟糕的是,当我再次 运行 脚本时,它知道我离开时的状态,并将物理引脚恢复到该状态!
这是我的跳线on/off程序,它现在有一个暂停输入,在此期间状态保持不变,但当程序退出时,引脚会重置。 (尽管正如我上面提到的,状态是"remembered")
#!/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
在退出后不要管硬件的方法吗? This question 详细介绍了一个类似的问题,尽管模块不同。
(编辑:事实证明 gpiozero 模块将引脚方向更改为输入但不更改输出锁存器,这就是当
引脚方向改回输出。)
我使用 RPi.GPIO 模块而不是 gpiozero 重写了。感觉不一样,但它比研究一种使用 gpiozero 无需清理就退出的方法更容易。
这里是 "equivalent" 没有引脚清理的程序。
#!/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 提到了一个 hack,似乎有效:
import gpiozero.pins.rpigpio
def close(self): pass
gpiozero.pins.rpigpio.RPiGPIOPin.close = close
gpiozero.LED(..., pin_factory=gpiozero.pins.rpigpio.RPiGPIOFactory())
我们基本上覆盖了 PinFactory 的关闭功能,并使用它来创建 LED。
我正在使用 gpiozero
来控制 Raspberry Pi 上的设备。当我创建对(例如)LED 设备的引用时,有一个用于创建对象而不影响其当前状态的参数:initial_state=None
。 (默认值为 initial_state=False
,它会在创建引用对象时自动关闭该值)问题是它似乎总是在脚本退出时重置硬件引脚(尽管奇怪的是内部 "state" 没有)。更糟糕的是,当我再次 运行 脚本时,它知道我离开时的状态,并将物理引脚恢复到该状态!
这是我的跳线on/off程序,它现在有一个暂停输入,在此期间状态保持不变,但当程序退出时,引脚会重置。 (尽管正如我上面提到的,状态是"remembered")
#!/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
在退出后不要管硬件的方法吗? This question 详细介绍了一个类似的问题,尽管模块不同。
(编辑:事实证明 gpiozero 模块将引脚方向更改为输入但不更改输出锁存器,这就是当 引脚方向改回输出。)
我使用 RPi.GPIO 模块而不是 gpiozero 重写了。感觉不一样,但它比研究一种使用 gpiozero 无需清理就退出的方法更容易。
这里是 "equivalent" 没有引脚清理的程序。
#!/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 提到了一个 hack,似乎有效:
import gpiozero.pins.rpigpio
def close(self): pass
gpiozero.pins.rpigpio.RPiGPIOPin.close = close
gpiozero.LED(..., pin_factory=gpiozero.pins.rpigpio.RPiGPIOFactory())
我们基本上覆盖了 PinFactory 的关闭功能,并使用它来创建 LED。