GPIO Zero 和 Raspberry Pi 编程入门项目

还没有读者喜欢这个。
kids in a classroom learning about Raspberry Pi programming

Raspberry Pi Foundation。 CC BY-SA 4.0。

使用 Raspberry Pi 最令人兴奋的入门活动之一,是你在普通 PC 或笔记本电脑上无法做到的事情——让现实世界发生一些事情,例如闪烁 LED 或控制电机。如果你以前做过类似的事情,你可能使用 Python 和 RPi.GPIO 库来完成,这个库已被用于无数项目中。现在有一种更简单的方法与物理组件交互:一种新的友好的 Python API,称为 GPIO Zero

Programming Raspberry Pi

照片由 Giles Booth 拍摄。经许可使用

我最近写了关于 Raspberry Pi Zero,这款 5 美元的计算机以及经济实惠硬件世界的最新成员。虽然名称相似,但 GPIO Zero 和 Raspberry Pi Zero 项目是无关的,并且没有耦合。GPIO Zero 库旨在在所有 Raspberry Pi 型号上工作,并且与 Python 2 和 Python 3 兼容。

RPi.GPIO 库非常基础,提供了所有基本功能,可以使用 Pi 的 GPIO 引脚做简单的事情——将引脚设置为输入或输出,读取输入,将输出设置为高电平或低电平等等。GPIO Zero 构建在此之上,并为日常组件提供了一系列简单的接口,因此,无需将引脚 2 设置为高电平来打开 LED,你只需拥有一个 LED 对象并将其打开即可。

GPIO 端口标签 – 来自 rasp.io/portsplus

入门

使用 GPIO Zero,你需要导入你正在使用的接口的名称,例如: from gpiozero import LED 此外,你必须正确连接你正在使用的任何组件,并将它们连接到 GPIO 引脚。请注意,某些引脚分配给 3V3、5V 和 GND;少数是特殊用途,其余是通用用途。有关更多信息,请参阅 pinout.xyz,或使用 端口标签

GPIO port label

使用以下代码闪烁 LED

from gpiozero import LED
from time import sleep

led = LED(17)

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

或者,使用 LED 的 blink() 方法,但请确保使用 signal.pause() 使程序保持运行状态,如下所示

from gpiozero import LED
from signal import pause

led = LED(17)

led.blink()

pause()

输出设备

除了基本的 LED 接口,以及 on()off()toggle()blink() 方法外,GPIO Zero 还为蜂鸣器和电机提供了类,它们的工作方式类似

from gpiozero import Buzzer, Motor
from time import sleep

buzzer = Buzzer(14)
motor = Motor(forward=17, backward=18)

while True:
    motor.forward()
    sleep(10)
    motor.backward()
    buzzer.beep()
    sleep(10)
    buzzer.off()

还有用于 PWMLED 的接口(控制亮度而不仅仅是开/关),以及用于 RGB LED 的接口,RGB LED 是一种包含红色、绿色和蓝色部分的 LED,使用每个部分的亮度来提供全彩色控制。

甚至还有交通信号灯的接口。提供红色、琥珀色和绿色灯连接的引脚编号,然后使用以下代码控制

traffic lights

lights = TrafficLights(2, 3, 4)

lights.on()
lights.off()
lights.blink()
lights.green.on()
lights.red.on()

等等。

输入设备

最简单的输入设备是按钮,提供的接口可以轻松地通过按钮按下来控制程序

push button input device

from gpiozero import Button

button = Button(14)

while True:
    if button.is_pressed:
        print("Pressed")

使用按钮按下控制程序的另一种方法是使用 wait_for_press

button.wait_for_press()
print("pressed")

这会暂停程序,直到按下按钮,然后继续。或者,你可以将操作连接到按钮按下,而不是轮询按钮状态

button.when_pressed = led.on
button.when_released = led.off

在这里,方法 led.on 作为按钮按下时要运行的操作传入,而 led.off 作为按钮释放时要运行的操作传入。这意味着当按下按钮时,LED 亮起,当释放按钮时,LED 熄灭。除了使用其他 GPIO Zero 对象方法外,你还可以使用自定义函数

def hello():
    print("Hello")

def bye():
    print("Bye")

button.when_pressed = hello
button.when_released = bye 

现在,每次按下按钮时,都会调用 hello 函数并打印“Hello”。当释放按钮时,它会打印“Bye”。

以这种方式使用自定义函数可能是运行一组 GPIO 指令(例如交通信号灯序列)的好方法

def sequence():
    lights.green.off()
    lights.amber.on()
    sleep(1)
    lights.amber.off()
    lights.red.on()
    sleep(20)
    lights.amber.on()
    sleep(1)
    lights.green.on()
    lights.amber.off()
    lights.red.off()

lights.green.on()
button.when_pressed = sequence

现在,当按下按钮时,交通信号灯将从绿灯变为红灯,然后等待 20 秒,然后再变回红灯,就像通常的方式一样。

传感器

将按钮换成另一个输入设备,例如基本传感器,可以开启有趣项目的世界。使用运动传感器代替按钮

motion sensor

from gpiozero import MotionSensor

sensor = MotionSensor(15)

然后使用 sensor.if_motionsensor.wait_for_motionsensor.when_motion。为光线传感器提供了类似的接口。

模拟设备

Raspberry Pi 没有原生模拟输入引脚,但你可以轻松连接 ADC(模数转换器)并访问模拟输入设备(例如 电位器)并读取它们的值

from gpiozero import MCP3008

pot = MCP3008()

while True:
    print(pot.value)

电位器返回 0 到 1 的值,这意味着你可以轻松地将它们连接到输出设备

from gpiozero import PWMLED, MCP3008

led = PWMLED(4)
pot = MCP3008()

while True:
    led.value = pot.value

现在 LED 的亮度直接由电位器值控制。

或者,GPIO Zero 的一个巧妙功能允许你直接将两个设备连接在一起,而无需在循环内不断更新。每个输出设备都有一个 source 属性,它可以读取值的无限生成器。所有设备(输入和输出)都有一个 values 属性,它是一个无限生成器,始终产生设备的当前值

from gpiozero import PWMLED, MCP3008

led = PWMLED(4)
pot = MCP3008()

led.source = pot.values

这与前面的示例完全相同,只是不需要 while 循环。

你可以将多个模拟输入连接到同一个 ADC(MCP3008 芯片提供 8 个通道)。此示例使用三个电位器,允许使用相同的方法控制 RGB LED 中的每个颜色通道

led = RGBLED(red=2, green=3, blue=4)
red_pot = MCP3008(channel=0)
green_pot = MCP3008(channel=1)
blue_pot = MCP3008(channel=2)

led.red.source = red_pot.values
led.green.source = green_pot.values
led.blue.source = blue_pot.values

这使你可以将三个电位器用作 RGB LED 的混色器。

捆绑接口

与 TrafficLights 接口类似,还有其他用于组件捆绑的接口,特别是用于常用简单附加板的接口。

通用 LED 板或 LED 集合,可以一起或单独控制

from gpiozero import LEDBoard

lights = LEDBoard(2, 3, 4, 5, 6)
lights.on()
lights.off()
lights.leds[1].on()
lights.leds[3].toggle()
lights.leds[5].on()
lights.leds[2].blink()
lights.leds[4].blink()

Ryanteck TrafficHAT

Ryanteck TrafficHAT

from gpiozero import TrafficHat

hat = TrafficHat()

hat.on()
hat.off()
hat.lights.blink()
hat.buzzer.on()
hat.button.when_pressed = hat.lights.on
hat.button.when_released = hat.lights.off

请注意,TrafficHat 接口不需要一组引脚编号,因为它们已经在类中定义。

连接两个电机并制作一个底盘,你就拥有了自己的 Raspberry Pi 机器人

raspberry pi robot

from gpiozero import Robot

robot = Robot(left=(4, 14), right=(17, 18))

robot.forward()
robot.backward()
robot.reverse()
robot.left()
robot.forward()
robot.stop()

将所有东西都归零

既然有一套以 Zero 命名的项目,为什么不结合使用它们呢?使用 GPIO Zero 和 PyGame Zero 编程的 Pi Zero 供电机器人怎么样?

GPIO Zero 和 PyGame Zero 确实可以很好地协同工作——非常适合为 GPIO 组件创建屏幕界面。

Pi Zero powered robot programmed with GPIO Zero and PyGame Zero

照片由 ItsAll_Geek2Me 拍摄。经许可使用。

立即尝试!

GPIO Zero 已包含在 12 月以来的 Raspbian Jessie 镜像中,因此你可以从 raspberrypi.org/downloads 获取副本。如果你有较旧的镜像,请使用以下命令安装它

sudo apt-get update
sudo apt-get install python3-gpiozero python-gpiozero

打开 IDLE 并在 REPL 中进行原型设计,或创建一个文件来保存你的脚本。你也可以使用常规 Python shell,或安装 IPython 并使用它。

更多信息

阅读更多关于 GPIO Zero 的信息

User profile image.
Ben 是 BBC News Labs 的软件工程师,曾任 Raspberry Pi 的社区经理。他热衷于 Linux、Python 和所有开源事物!在 Twitter 上关注 Ben @ben_nuttall。

3 条评论

很棒的阅读体验 Ben!这对教育工作者和所有创客来说都是很棒的资源!

感谢你提供如此出色的资源集。

干得漂亮 :) 好文章

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© 2025 open-source.net.cn. All rights reserved.