在“ raspberry pi”上使用“ gpiozero”来控制引脚,但是即使在两次运行之间都记住了状态,也会在脚本退出时重置输出引脚

时间:2018-12-04 17:10:46

标签: python raspberry-pi gpiozero

我正在使用gpiozero来控制Raspberry Pi上的设备。当我创建对(例如)LED设备的引用时,有一个用于创建对象而不影响其当前状态的参数: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离开硬件的方法吗? This question详细介绍了类似的问题,但模块不同。

(编辑:原来,gpiozero模块将引脚方向更改为输入,但不更改输出锁存器,这就是当 引脚方向又变回输出。)

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

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的关闭功能,并使用该功能创建LED。