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:
pin.value(1)/pin.value(0)——显式的写法。
不带参数调用 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,就会通过其片上保护二极管损坏引脚。跨电压信号传输需要一个合适的电平转换器;电路请参见 电平转换。