跳到主要内容

配置远程GPIO

GPIO Zero 支持多种不同的引脚实现(直接处理 GPIO 引脚的底层引脚库)。默认情况下会使用 RPi.GPIO 库(假设系统中已安装),但也可选择指定一个库来使用。更多信息,请参阅 API - 引脚文档页面

支持的引脚库之一 pigpio 提供了通过网络远程控制 GPIO 引脚的功能,这意味着你可以使用 GPIO Zero 控制网络上连接到 Raspberry Pi 的设备。你可以从另一台 Raspberry Pi,甚至从 PC 来实现这一功能。

有关如何使用远程引脚的示例,请参阅 远程 GPIO 方案 页面。

准备Raspberry Pi

如果您使用的是 Raspberry Pi OS(桌面版--非精简版),那么您已经拥有了使用远程 GPIO 功能所需的一切。如果使用的是 Raspberry Pi OS Lite 或其他发行版,则需要安装 pigpio:

sudo apt install pigpio

或者,也可以从 abyz.me.uk 下载 pigpio。

你需要启用远程连接,并在 Raspberry Pi 上启动 pigpio 守护进程。

启用远程连接

在 Raspberry Pi OS 桌面映像上,可以在 Raspberry Pi 配置工具中启用远程 GPIO:

远程GPIO配置

或者,在命令行输入 sudo raspi-config 并启用远程 GPIO。这在功能上等同于桌面方法。

当使用 systemctl(见下文)启动 pigpio 守护进程时,它将允许远程连接(直至禁用)。它还将为当前会话启动 pigpio 守护进程。因此,当前会话不需要任何其他操作,但重启后则需要执行 systemctl 命令。

命令行:systemctl

要在启动时自动运行守护进程,请运行

sudo systemctl enable pigpiod

要使用 systemctl 运行一次守护进程,请运行

sudo systemctl start pigpiod

命令行: pigpiod

另一种方法是手动启动 pigpio 守护进程:

sudo pigpiod

这是单次会话使用的方法,重启后不会继续运行。不过,可以使用 -n 标志来允许来自特定 IP 地址的连接。例如

sudo pigpiod -n localhost # 仅允许 localhost
sudo pigpiod -n 192.168.1.65 # 仅允许 192.168.1.65
sudo pigpiod -n localhost -n 192.168.1.65 # 仅允许 localhost 和 192.168.1.65
提示

请注意,运行 sudo pigpiod 不会影响远程 GPIO 配置设置(也就是说,如果没有 -n 标志,即使远程设置被禁用,它也会允许远程连接)。但除非进行相应配置,否则 sudo systemctl enable pigpiodsudo systemctl start pigpiod 将不允许远程连接。

准备控制计算机

如果控制计算机(运行 Python 代码的计算机)是运行 Raspberry Pi OS 的 Raspberry Pi(或运行 Raspberry Pi Desktop x86 的 PC),那么你就拥有了所需的一切。如果使用的是其他 Linux 发行版、Mac OS 或 Windows,则需要在 PC 上安装 pigpio Python 库。

树莓派

首先,更新软件源列表:

sudo apt update

然后为 Python 3 安装 GPIO Zero 和 pigpio 库:

sudo apt install python3-gpiozero python3-pigpio

或 Python 2

sudo apt install python-gpiozero python-pigpio

或者使用 pip 安装

sudo pip3 install gpiozero pigpio

或 Python 2

sudo pip install gpiozero pigpio

Linux

首先,更新发行版的软件源列表。例如

sudo apt update

然后为 Python 3 安装 pip:

sudo apt install python3-pip

或 Python 2

sudo apt install python-pip

(或者使用 get-pip 安装 pip)。

接下来,为 Python 3 安装 GPIO Zero 和 pigpio:

sudo pip3 install gpiozero pigpio

或 Python 2

sudo pip install gpiozero pigpio

Mac OS

首先,安装 pip。如果使用 brew 安装了 Python 3,则已经安装了 pip。如果没有,请使用 get-pip 安装 pip。

接下来,用 pip 安装 GPIO Zero 和 pigpio:

pip3 install gpiozero pigpio

或者使用 Python 2

pip install gpiozero pigpio

Windows

Windows 下的现代 Python 安装程序将 pip 与 Python 绑定。如果没有安装 pip,可以 按照本指南 进行安装。接下来,用 pip 安装 GPIO Zero 和 pigpio:

pip install gpiozero pigpio

环境变量

使用远程引脚设备的最简单方法是将 PIGPIO_ADDR 环境变量设置为所需 Raspberry Pi 的 IP 地址。您必须运行 Python 脚本,或在使用命令行设置环境变量的情况下启动开发环境。例如

PIGPIO_ADDR=192.168.1.3 python3 hello.py
PIGPIO_ADDR=192.168.1.3 python3
PIGPIO_ADDR=192.168.1.3 ipython3
PIGPIO_ADDR=192.168.1.3 idle3 &

如果在安装了 gpiozero 和 pigpio Python 库的电脑(而非树莓派)上运行,则无需进一步配置即可运行。但是,如果通过 Raspberry Pi 运行,还需要确保将默认引脚工厂设置为 PiGPIOFactory。如果安装了 RPi.GPIO,它将被选作默认引脚工厂,因此要么卸载它,要么使用 GPIOZERO_PIN_FACTORY 环境变量来覆盖它:

GPIOZERO_PIN_FACTORY=pigpio PIGPIO_ADDR=192.168.1.3 python3 hello.py

这种用法会将引脚工厂设置为 PiGPIOFactory,默认主机为 192.168.1.3。引脚工厂可在代码中内联更改,如以下章节所示。

使用这种方法,你可以像在 Raspberry Pi 上一样编写 gpiozero 代码,无需进行任何修改。例如:

from gpiozero import LED
from time import sleep

red = LED(17)

while True
red.on()
sleep(1)
red.off()
sleep(1)

运行时

PIGPIO_ADDR=192.168.1.3 python3 led.py

将连接到 IP 地址为 192.168.1.3 的 Raspberry Pi 第 17 针的 LED 并闪烁。还有

PIGPIO_ADDR=192.168.1.4 python3 led.py

将连接到 IP 地址为 192.168.1.4 的 Raspberry Pi 第 17 针的 LED 并闪烁,无需更改任何代码,只要 Raspberry Pi 运行着 pigpio 守护进程即可。

提示

直接在 Raspberry Pi 上运行代码时,可以使用任何引脚工厂(假设安装了相关库),但远程使用设备时,只能使用 PiGPIOFactory,因为 pigpio 是唯一支持远程 GPIO 的引脚库。

引脚工厂

配置 gpiozero 对象以使用远程引脚的另一种(或附加)方法是创建 PiGPIOFactory 对象实例,并在实例化设备对象时使用它们。例如,在未设置环境变量的情况下:

from gpiozero import LED
from gpiozero.pins.pigpio import PiGPIOFactory
from time import sleep

factory = PiGPIOFactory(host='192.168.1.3')
led = LED(17, pin_factory=factory)

while True:
led.on()
sleep(1)
led.off()
sleep(1)

这样就可以在同一个脚本中使用多个 Raspberry Pis 上的设备:

from gpiozero import LED
from gpiozero.pins.pigpio import PiGPIOFactory
from time import sleep

factory3 = PiGPIOFactory(host='192.168.1.3')
factory4 = PiGPIOFactory(host='192.168.1.4')
led_1 = LED(17, pin_factory=factory3)
led_2 = LED(17, pin_factory=factory4)

while True:
led_1.on()
led_2.off()
sleep(1)
led_1.off()
led_2.on()
sleep(1)

当然,你也可以继续正常创建 gpiozero 设备对象,并使用远程引脚创建其他对象。例如,如果在 Raspberry Pi 上运行,下面的脚本将在控制器 Pi 和网络上的另一台 Pi 上闪烁 LED:

from gpiozero import LED
from gpiozero.pins.pigpio import PiGPIOFactory
from time import sleep

remote_factory = PiGPIOFactory(host='192.168.1.3')
led_1 = LED(17) # local pin
led_2 = LED(17, pin_factory=remote_factory) # remote pin

while True:
led_1.on()
led_2.off()
sleep(1)
led_1.off()
led_2.on()
sleep(1)

或者,在运行时设置环境变量 GPIOZERO_PIN_FACTORY=pigpio PIGPIO_ADDR=192.168.1.3 后,下面的脚本将与前一个脚本完全相同:

from gpiozero import LED
from gpiozero.pins.rpigpio import RPiGPIOFactory
from time import sleep

local_factory = RPiGPIOFactory()
led_1 = LED(17, pin_factory=local_factory) # local pin
led_2 = LED(17) # remote pin

while True:
led_1.on()
led_2.off()
sleep(1)
led_1.off()
led_2.on()
sleep(1)

当然,也可以使用多个 IP 地址:

from gpiozero import LED
from gpiozero.pins.pigpio import PiGPIOFactory
from time import sleep

factory3 = PiGPIOFactory(host='192.168.1.3')
factory4 = PiGPIOFactory(host='192.168.1.4')

led_1 = LED(17) # local pin
led_2 = LED(17, pin_factory=factory3) # remote pin on one pi
led_3 = LED(17, pin_factory=factory4) # remote pin on another pi

while True:
led_1.on()
led_2.off()
led_3.on()
sleep(1)
led_1.off()
led_2.on()
led_3.off()
sleep(1)

请注意,这些示例使用的是 LED 类,该类在初始化时需要一个引脚参数。有些类,尤其是代表 HAT 和其他附加板的类,不需要指定引脚编号。不过,仍可以使用环境变量或 pin_factory 关键字参数,在这些设备上使用远程引脚:

import gpiozero
from gpiozero import TrafficHat
from gpiozero.pins.pigpio import PiGPIOFactory
from time import sleep

gpiozero.Device.pin_factory = PiGPIOFactory(host='192.168.1.3')
th = TrafficHat() # traffic hat on 192.168.1.3 using remote pins

这样还可以在两个 IP 地址之间交换,并创建连接到不同 Pis 的多个 HAT 实例:

import gpiozero
from gpiozero import TrafficHat
from gpiozero.pins.pigpio import PiGPIOFactory
from time import sleep

remote_factory = PiGPIOFactory(host='192.168.1.3')

th_1 = TrafficHat() # traffic hat using local pins
th_2 = TrafficHat(pin_factory=remote_factory) # traffic hat on 192.168.1.3 using remote pins

您甚至可以在一台 Pi 上使用 GPIO Zero 不支持的 HAT(如 Sense HAT),并通过网络使用远程引脚控制另一台 Pi:

from gpiozero import MotionSensor
from gpiozero.pins.pigpio import PiGPIOFactory
from sense_hat import SenseHat

remote_factory = PiGPIOFactory(host='192.198.1.4')
pir = MotionSensor(4, pin_factory=remote_factory) # remote motion sensor
sense = SenseHat() # local sense hat

while True:
pir.wait_for_motion()
sense.show_message(sense.temperature)

请注意,在这种情况下,必须在本地运行 Sense HAT 代码,远程运行 GPIO。

远程GPIO用法

继续阅读:


中文翻译版以英文版相同知识授权方式共享:BSD-3-Clause。交流 Q群:498908352