3.7. GPIO 輸出

machine.LED 將相機內建指示燈的接線抽象隱藏起來。要驅動任何外部硬體,則從輸出模式的 machine.Pin 開始——它是其他所有 GPIO 互動底層的原始周邊裝置。

3.7.1. 驅動接腳

使用 Pin.OUT 建構一個接腳使其成為輸出,然後設定其值:

from machine import Pin

led = Pin("P0", Pin.OUT)
led.on()           # drive high (about 3.3 V)
led.off()          # drive low (about 0 V)

設定狀態的三種等效方式,全都在 machine.Pin 上:

不帶引數呼叫 value() 會讀回接腳目前的狀態——這對輸入與輸出都適用。

3.7.2. 驅動外部 LED

由 3.3 V 驅動、工作於 10 mA 的紅色 LED,需要串聯約 130 Ω(電子學頁面推導出了相關運算)。將接腳 P0 透過該電阻接到 LED 的陽極,LED 的陰極接到接地。一個閃爍器:

import time
from machine import Pin

led = Pin("P0", Pin.OUT)

while True:
    led.on()
    time.sleep_ms(500)
    led.off()
    time.sleep_ms(500)

LED 每秒開關一次。流過 LED 的電流(也就是它的亮度)由電阻決定;開/關的占空比只控制它多久點亮一次,而非它點亮時看起來有多亮。

小訣竅

建構子接受一個初始值作為關鍵字引數:Pin("P0", Pin.OUT, value=0) 會將接腳設定為以低電位起始的輸出。少了它,接腳在第一次呼叫 value() 之前,會短暫地維持在它的預設狀態(無論那是什麼)。

3.7.3. 開漏模式

預設的 Pin.OUT 模式為推挽式:接腳會主動驅動高電位(接到供電端)與低電位(接到接地)。有時這並不適合。當接腳應該將線路拉低或釋放(浮接)時,請改用 Pin.OPEN_DRAIN

pin = Pin("P0", Pin.OPEN_DRAIN)
pin.off()       # actively drive low
pin.on()        # release; an external pull-up brings the line high

其主要用途是共用一條導線。多個開漏輸出可以共用單一線路,因為它們之中沒有任何一個會主動將其驅動為高電位。其中任何一個都可以將線路拉低;如果它們全都釋放,外部的上拉電阻便會將線路拉高。這正是共用通訊匯流排背後的接線慣例。

警告

開漏式並非驅動較高電壓裝置的通用解決方案。在可耐受 5 V 的接腳上,將開漏接腳連接到 5 V 的上拉電阻是安全的;但對於不耐受的接腳,一旦接腳釋放且線路浮升到 5 V,就會透過其晶片上的保護二極體造成損壞。跨電壓訊號傳輸需要適當的電位轉換器;電路請參閱 電壓位準轉換