使用 Raspberry Pi 最令人兴奋的入门活动之一,是你在普通 PC 或笔记本电脑上无法做到的事情——让现实世界发生一些事情,例如闪烁 LED 或控制电机。如果你以前做过类似的事情,你可能使用 Python 和 RPi.GPIO 库来完成,这个库已被用于无数项目中。现在有一种更简单的方法与物理组件交互:一种新的友好的 Python API,称为 GPIO Zero。
照片由 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,或使用 端口标签
使用以下代码闪烁 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,使用每个部分的亮度来提供全彩色控制。
甚至还有交通信号灯的接口。提供红色、琥珀色和绿色灯连接的引脚编号,然后使用以下代码控制
lights = TrafficLights(2, 3, 4) lights.on() lights.off() lights.blink() lights.green.on() lights.red.on()
等等。
输入设备
最简单的输入设备是按钮,提供的接口可以轻松地通过按钮按下来控制程序
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 秒,然后再变回红灯,就像通常的方式一样。
传感器
将按钮换成另一个输入设备,例如基本传感器,可以开启有趣项目的世界。使用运动传感器代替按钮
from gpiozero import MotionSensor sensor = MotionSensor(15)
然后使用 sensor.if_motion
、sensor.wait_for_motion
和 sensor.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
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 机器人
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 组件创建屏幕界面。
照片由 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 的信息
3 条评论