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,就会通过其片上保护二极管损坏引脚。跨电压信号传输需要一个合适的电平转换器;电路请参见 电平转换