Skip to main content

gpiozero 使用说明

本文列出已在Muse Pi Pro上调试过的GPIO模块及使用说明,可供开发者参考。

1. 环境搭建

(1)安装系统依赖

sudo apt update
sudo apt install -y libopenblas-dev \
python3-dev \
python3-venv \
libcjson-dev libasound2-dev python3-gpiozero

(2)创建python虚拟环境

设置spacemit python pip源:

pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
pip config set global.extra-index-url https://git.spacemit.com/api/v4/projects/33/packages/pypi/simple

创建虚拟环境:

python3 -m venv ~/gpioenv
source ~/gpioenv/bin/activate

安装python依赖:

pip install gpiozero pyserial

安装成功则显示:

Installing collected packages: pyserial, lgpio, setuptools, colorzero, gpiozero
Successfully installed colorzero-2.0 gpiozero-2.0.5 lgpio-0.2.2.0 pyserial-3.5 setuptools-78.1.0

注意 gpiozero 的版本必须 ≥ 2.0.5

2.设备引脚布局

进迭时空官方参考链接:MUSE Pi Pro 用户使用指南

Muse Pi Pro开发板引脚示意图如下所示:

在编程时,引脚编号请使用GPIO后面的数字。

也可以在终端输入以下命令便捷查看:

source ~/gpioenv/bin/activate
pinout

输出:

3.从Python使用GPIO

3.1 LED控制

3.1.1 硬件连接

绿色杜邦线连接到GPIO 70控制引脚。

通过N型MOS管控制LED灯,从左到右的引脚为 G、D、S。

3.1.2 设备测试

以下示例代码控制连接到GPIO70的LED:

from gpiozero.pins.lgpio import LGPIOFactory
from gpiozero import Device
Device.pin_factory = LGPIOFactory(chip=0)

from gpiozero import LED
import time

pin_number = 70

led1 = LED(pin_number)

try:
while True:
# 设置 GPIO 70 为高电平
led1.on()
print(f"GPIO {pin_number} ON")
time.sleep(1) # 等待 1 秒

# 设置 GPIO 70 为低电平
led1.off()
print(f"GPIO {pin_number} OFF")
time.sleep(1) # 等待 1 秒

except KeyboardInterrupt:
# 捕捉 Ctrl+C 并退出
print("Exiting")

led1.close()

新建一个 led.py 文件并粘贴上面的代码。

sudo chmod 666 /dev/gpiochip0
source ~/gpioenv/bin/activate
python led.py

运行脚本之后,LED灯将以 1s 的间隔时间闪烁。

注: 开发板上的GPIO的驱动能力通常较弱,因此不建议将LED等功率器件直接接在引脚上。建议您给GPIO引脚加上一个大于10千欧的上拉电阻,然后使用三极管或者MOS管控制LED等设备的通断。

3.1.3 代码解释

当您在进迭时空的开发板上使用gpiozero库时,建议在程序的开头加上以下代码:

from gpiozero.pins.lgpio import LGPIOFactory
from gpiozero import Device
Device.pin_factory = LGPIOFactory(chip=0) # 显式指定/dev/gpiochip0

这段代码显式地指定了gpiozero库使用lgpio库作为底层的引脚工厂。

lgpio是针对linux更底层的GPIO控制库,虽然gpiozero默认使用lgpio,但为了保证gpiozero在SpacemiT开发板上的正常工作,建议显示地指定引脚工厂。

当您尝试移植树莓派官方例程时,建议您在其示例代码的开头加上上述三行代码,同时注意引脚编号的差异。

3.2 PWMLED

硬件连接方式与3.1节相同。

以下示例代码控制连接到GPIO70的LED,并输出PWM实现一个呼吸灯:

from gpiozero.pins.lgpio import LGPIOFactory
from gpiozero import Device
Device.pin_factory = LGPIOFactory(chip=0)
from gpiozero import PWMLED
from signal import pause

pin_number = 70

print(f"PWM {pin_number}")
led = PWMLED(pin_number)

led.pulse()

pause()

通过IDE或者终端执行上述python脚本, 您应该可以看到LED灯逐渐由亮变暗然后由暗变亮。

注意gpiozero输出的pwm为软件模拟pwm,在驱动舵机时会出现抖动的现象。如果需要获得与单片机一样的稳定效果,应该使用硬件pwm。硬件pwm的使用方法参考 外设模块参考说明 4.5.2 PWM使用示例

3.3 读取按钮状态

3.3.1 硬件连接

3.3.2 设备测试

以下示例代码读取连接到GPIO70的按钮的状态:

from gpiozero.pins.lgpio import LGPIOFactory
from gpiozero import Device
Device.pin_factory = LGPIOFactory(chip=0)

from gpiozero import Button
from signal import pause

pin_number = 70

print(f"Button {pin_number}")

def say_hello():
print("Hello! Pressed")

def say_goodbye():
print("Goodbye! Released")

button = Button(pin_number)

button.when_pressed = say_hello
button.when_released = say_goodbye

pause()

通过IDE或者终端执行上述python脚本,反复按下按键,您应该可以看到如下输出:

➜ testmy python3 testbutton.py
Button 70
Hello! Pressed
Goodbye! Released
Hello! Pressed
Goodbye! Released

请参考GPIO了解更多。