簡體   English   中英

在 `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 ,它會在創建引用對象時自動關閉該值)問題是它似乎總是在腳本退出時重置硬件引腳(盡管很奇怪不是內部“狀態”)。 更糟糕的是,當我再次運行腳本時,它知道我離開它的狀態,並將物理引腳放回該狀態!

這是我的跳線開/關程序,它現在有一個暫停輸入,在此期間狀態保持不變,但是當程序退出時,引腳會重置。 (雖然正如我上面提到的,狀態是“記住的”)

#!/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硬件的方法? 這個問題詳細說明了一個類似的問題,雖然是一個不同的模塊。

(編輯:事實證明 gpiozero 模塊將引腳方向更改為輸入但不更改輸出鎖存器,這就是當引腳方向更改回輸出時它如何恢復舊狀態。)

我使用 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 提到了一個 hack,這似乎有效:

import gpiozero.pins.rpigpio

def close(self): pass
gpiozero.pins.rpigpio.RPiGPIOPin.close = close

gpiozero.LED(..., pin_factory=gpiozero.pins.rpigpio.RPiGPIOFactory())

我們基本上覆蓋了 PinFactory 的 close 函數並使用該函數來創建 LED。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM