class Signal -- 控制與感測外部 I/O 裝置¶
Signal 類別是 Pin 類別的簡單延伸。Pin 只能處於「絕對」的 0 與 1 狀態,而 Signal 則可處於「已斷言」(asserted,開啟)或「已取消斷言」(deasserted,關閉)狀態,且可為反相(低電位有效,active-low)或非反相。換言之,它為 Pin 功能新增了邏輯反相支援。雖然這看似只是個簡單的擴充,但它正是以可跨不同開發板移植的方式支援各式各樣簡單數位裝置所需要的——這也是 MicroPython 的主要目標之一。無論不同使用者使用的是高電位有效還是低電位有效的 LED、常開還是常閉的繼電器——你都能開發出一個單一、外觀優雅的應用程式,使其能與其中每一種裝置搭配運作,並在應用程式設定檔中以寥寥數行捕捉硬體配置上的差異。
範例:
from machine import Pin, Signal
# Suppose you have an active-high LED on pin 0
led1_pin = Pin(0, Pin.OUT)
# ... and active-low LED on pin 1
led2_pin = Pin(1, Pin.OUT)
# Now to light up both of them using Pin class, you'll need to set
# them to different values
led1_pin.value(1)
led2_pin.value(0)
# Signal class allows to abstract away active-high/active-low
# difference
led1 = Signal(led1_pin, invert=False)
led2 = Signal(led2_pin, invert=True)
# Now lighting up them looks the same
led1.value(1)
led2.value(1)
# Even better:
led1.on()
led2.on()
以下是關於何時應使用 Signal 而非 Pin 的指引:
使用 Signal:若你想控制簡單的開/關(包括軟體 PWM!)裝置,如 LED、多段式指示器、繼電器、蜂鳴器,或讀取簡單的二元感測器,例如常開或常閉的按鈕、上拉或下拉、簧片開關(Reed switch)、濕度/火焰偵測器等等。總而言之,若你有一個需要 GPIO 存取的真實實體裝置/感測器,你很可能應該使用 Signal。
使用 Pin:若你要實作較高層級的協定或匯流排來與較複雜的裝置通訊。
Pin 與 Signal 之間的劃分源自上述使用情境以及 MicroPython 的架構:Pin 提供最低的開銷,這在位元拍打協定時可能很重要。但 Signal 在 Pin 之上新增了額外的彈性,代價是少許開銷(遠小於你在 Python 中手動實作高電位有效與低電位有效裝置差異所需的開銷!)。此外,Pin 是一個低層級物件,需要為每個支援的開發板實作,而 Signal 是一個高層級物件,一旦 Pin 實作完成便可免費取得。
若有疑慮,不妨試試 Signal!再次強調,它的目的是讓開發者免於處理諸如低電位有效與高電位有效訊號之類乏味的差異,並讓其他使用者能分享並享用你的應用程式,而不會僅僅因為他們的 LED 或繼電器接線方式略有不同而無法運作、因此感到沮喪。
建構子¶
- class machine.Signal(pin_obj: Pin, *, invert: bool = False)¶
- class machine.Signal(*pin_args: Any, invert: bool = False, **pin_kwargs: Any)
建立一個 Signal 物件。有兩種建構方式:
包裝既有的 Pin 物件 —— 通用方式,可在任何開發板上運作。
直接傳入 Pin 建構子引數 ——
Pin所接受的相同位置與關鍵字引數會被轉送至一個內部建立的 Pin。在許多(但非全部)開發板上可用。
引數:
pin_obj—— 要包裝的既有Pin實例。pin_args/pin_kwargs—— 在內聯建構底層接腳時,要轉送給Pin建構子的引數。invert—— 若為True,則訊號為反相(低電位有效)。
方法¶