GPIO Zero库中的引脚API详解
概述
GPIO Zero是一个用于控制树莓派GPIO引脚的Python库,自1.1版本起,该库可分为两大核心部分:引脚(Pins)和连接在引脚上的设备(Devices)。大多数文档关注的是设备层面,而引脚层面对普通用户来说较为底层。但对于需要利用不同GPIO实现或未来使用GPIO扩展芯片的高级用户来说,理解引脚API至关重要。
引脚工厂机制
GPIO Zero采用了一种灵活的"工厂模式"来管理引脚实现:
-
设备构造流程:当创建一个设备对象时,会传入引脚规格参数,这些参数会被传递给一个引脚工厂(Factory),工厂负责将其转换为具体的Pin实现。
-
默认工厂:可以通过
Device.pin_factory
属性查询和修改默认工厂。所有类(包括内部设备)都接受pin_factory
关键字参数,允许基于每个设备覆盖工厂设置。 -
工厂初始化时机:默认工厂在第一个设备初始化时构造。如果没有可用的默认工厂(例如未安装任何GPIO实现或加载失败),会在构造时抛出
BadPinFactory
异常。
默认工厂行为
在树莓派上,如果安装了RPi.GPIO库且未设置环境变量,默认会使用RPiGPIOFactory
。而在PC上(没有安装引脚库),导入可以成功但创建设备会失败:
from gpiozero import Device, LED
print(Device.pin_factory) # 输出 None
led = LED(2) # 在PC上会抛出 BadPinFactory 异常
更改引脚工厂
有几种方式可以更改默认引脚工厂:
-
环境变量法:设置
GPIOZERO_PIN_FACTORY
环境变量export GPIOZERO_PIN_FACTORY=native python3 your_script.py
-
代码修改法:直接在代码中修改
from gpiozero.pins.native import NativeFactory from gpiozero import Device Device.pin_factory = NativeFactory()
-
设备级覆盖:为特定设备指定工厂
from gpiozero.pins.native import NativeFactory from gpiozero import LED my_factory = NativeFactory() led1 = LED(16, pin_factory=my_factory) # 使用NativePin led2 = LED(17) # 使用默认工厂
支持的工厂类型
GPIO Zero支持多种引脚工厂实现,按默认尝试顺序排列如下:
| 名称 | 工厂类 | 引脚类 | |---------|----------------------------|--------------------------| | lgpio | LGPIOFactory | LGPIOPin | | rpigpio | RPiGPIOFactory | RPiGPIOPin | | pigpio | PiGPIOFactory | PiGPIOPin | | native | NativeFactory | NativePin |
模拟引脚(Mock Pins)
GPIO Zero提供了一个MockFactory
,可以生成完全虚拟的引脚,主要用于:
- 开发测试:无需实际硬件即可测试设备代码
- 离线开发:在没有树莓派的情况下开发GPIO Zero脚本
使用模拟引脚的方法:
from gpiozero import Device, LED
from gpiozero.pins.mock import MockFactory
Device.pin_factory = MockFactory()
led = LED(2)
模拟引脚还支持多种变体,如支持PWM的模拟引脚、相互连接的模拟引脚等:
from gpiozero.pins.mock import MockFactory, MockPWMPin
Device.pin_factory = MockFactory(pin_class=MockPWMPin)
核心类结构
GPIO Zero的引脚API基于几个核心抽象类:
- Factory:引脚工厂基类,负责创建和管理Pin实例
- Pin:引脚抽象基类,定义引脚的基本行为和属性
- SPI:SPI接口抽象类
这些基类派生出针对不同实现的子类,如RPiGPIOFactory
、PiGPIOFactory
等。
最佳实践与注意事项
-
避免混用工厂:虽然技术上可以混合使用不同工厂,但这可能导致不可预测的行为。
-
远程GPIO:某些工厂(如PiGPIOFactory)支持远程GPIO控制,可通过环境变量配置:
GPIOZERO_PIN_FACTORY=pigpio PIGPIO_ADDR=remote-pi python3 script.py
-
模拟引脚高级用法:可以精确控制引脚状态变化来模拟设备行为:
led = LED(17) btn = Button(16) led.source = btn btn.pin.drive_low() # 模拟按钮按下
通过深入理解GPIO Zero的引脚API,开发者可以更灵活地控制硬件接口,实现更复杂的物联网和嵌入式项目。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考