树莓派 GPIOZero Python 库:轻松控制外部设备
1. 树莓派 GPIO 简介
树莓派的一大主要特性是能够通过 40 针 GPIO 连接器与外部设备进行交互。借助这个连接器,我们既可以从外部传感器读取数据,比如温度、湿度和大气压力等;也能够控制外部设备,例如触发继电器或者驱动 RGB LED 灯带。
不过,要实现对这些外部设备和传感器的控制,除了完成电气连接之外,还需要编写并运行相应的程序。树莓派是一款功能完备的计算机,支持多种操作系统,包括 Linux,因此可以使用多种编程语言来编写控制程序:
- 年轻人可以使用可视化语言 Scratch,这对于引导他们进入计算和编程领域非常有帮助。
- 追求高性能的开发者可以选择使用 C/C++ 进行编程。
- 来自 Web 领域的开发者可以使用 node.js。
- 对新兴语言感兴趣的人可以使用 Go 语言来编写和控制 GPIO。
- 而对于追求简单、表达性和即时性的开发者,Python 语言是一个不错的选择。
2. GPIOZero 库概述
GPIOZero 是专门为树莓派设计的 Python 库,它为通过 GPIO 引脚连接和控制的设备与传感器提供了简单的接口。该库由树莓派基金会开发和维护,并遵循 BSD 3 - 条款“新”或“修订”许可证发布。
这个许可证非常宽松,允许以源代码和二进制形式重新分发该库,无论是否进行修改。但需要遵守以下三个约束条件:
1. 以源代码形式重新分发时,必须始终携带版权信息。
2. 以二进制形式重新分发时,必须在所有部分(包括文档和与项目相关的任何其他材料)中携带版权信息。
3. 未经特定书面许可,不得使用版权持有者(树莓派基金会)和任何贡献者的名称以任何方式或形式来推荐或推广使用该库的产品。
以下是一个简单的表格总结了 GPIOZero 库的特点:
| 特点 | 详情 |
| ---- | ---- |
| 开发者 | 树莓派基金会 |
| 许可证 | BSD 3 - 条款“新”或“修订”许可证 |
| 许可范围 | 允许重新分发,可修改 |
| 约束条件 | 源代码和二进制分发需带版权信息,不得随意使用版权方名称推广 |
3. 设备建模
GPIOZero 库的关键特性在于为树莓派常用的设备提供了高级模型或接口。与其他库不同的是,它不需要程序员手动管理单个引脚,而是为每个支持的组件提供了特定的接口和一组高级方法。
版本 1.4.1 支持的组件如下:
- LED
- 带 PWM 亮度控制的 LED
- 板载 LED
- LED 条形灯
- LED 交通灯
- RGB LED
- 按钮
- HC - SR501 PIR 运动传感器
- LDR 亮度传感器
- HC - SR04 超声波距离传感器
- DC 电机(直流)
- 双轮机器人(RC 车)
- MCP300x 模拟 - 数字转换器(AC/DC)
- BlueDot
- GPIO 远程控制
- TCRT5000 线传感器
- 声学蜂鸣器
- SG90 伺服电机
除了这些组件,该库还可以通过扩展特定类来支持许多其他外部设备。也就是说,开发者可以扩展该库以支持尚未在上述列表中出现的外部设备。
下面是一个简单的 mermaid 流程图,展示了使用 GPIOZero 库控制设备的基本流程:
graph LR
A[连接外部设备到 GPIO 引脚] --> B[导入 GPIOZero 库]
B --> C[创建对应设备对象]
C --> D[使用对象方法控制设备]
接下来,我们将介绍如何使用该库来控制两个简单的设备,如 LED(输出)和按钮(输入),并与 Arduino 平台进行比较,突出其优势和高级特性。
4. 使用 GPIOZero 库控制 LED 和按钮
4.1 控制 LED
下面我们将展示如何使用 GPIOZero 库来控制一个 LED。假设 LED 连接到树莓派的 GPIO 引脚 17。以下是示例代码:
from gpiozero import LED
from time import sleep
# 创建一个 LED 对象,指定连接的 GPIO 引脚
led = LED(17)
# 循环 5 次,每次点亮 LED 1 秒,然后熄灭 1 秒
for i in range(5):
led.on() # 点亮 LED
sleep(1) # 等待 1 秒
led.off() # 熄灭 LED
sleep(1) # 等待 1 秒
上述代码的操作步骤如下:
1. 导入
LED
类和
sleep
函数。
LED
类用于创建 LED 对象,
sleep
函数用于暂停程序执行。
2. 创建一个
LED
对象,指定连接的 GPIO 引脚为 17。
3. 使用
for
循环 5 次,每次循环中调用
on()
方法点亮 LED,然后使用
sleep(1)
暂停 1 秒,接着调用
off()
方法熄灭 LED,再暂停 1 秒。
4.2 读取按钮输入
假设按钮连接到树莓派的 GPIO 引脚 27,以下是读取按钮输入的示例代码:
from gpiozero import Button
from time import sleep
# 创建一个 Button 对象,指定连接的 GPIO 引脚
button = Button(27)
while True:
if button.is_pressed: # 检查按钮是否被按下
print("按钮被按下!")
else:
print("按钮未被按下。")
sleep(0.1) # 每隔 0.1 秒检查一次
操作步骤如下:
1. 导入
Button
类和
sleep
函数。
2. 创建一个
Button
对象,指定连接的 GPIO 引脚为 27。
3. 使用
while True
循环不断检查按钮状态。通过
is_pressed
属性判断按钮是否被按下,如果按下则打印相应信息,否则打印未按下信息。
4. 使用
sleep(0.1)
暂停 0.1 秒,避免过于频繁地检查按钮状态。
4.3 结合 LED 和按钮
我们可以将 LED 和按钮结合起来,当按钮被按下时点亮 LED,松开时熄灭 LED。示例代码如下:
from gpiozero import LED, Button
from signal import pause
# 创建 LED 和 Button 对象
led = LED(17)
button = Button(27)
# 定义按钮按下和松开时的回调函数
def button_pressed():
led.on()
def button_released():
led.off()
# 绑定回调函数
button.when_pressed = button_pressed
button.when_released = button_released
# 保持程序运行,等待事件发生
pause()
操作步骤如下:
1. 导入
LED
、
Button
类和
pause
函数。
2. 创建
LED
和
Button
对象,分别指定连接的 GPIO 引脚。
3. 定义
button_pressed()
和
button_released()
回调函数,分别用于在按钮按下和松开时执行相应操作。
4. 使用
when_pressed
和
when_released
属性将回调函数绑定到按钮的按下和松开事件上。
5. 调用
pause()
函数,使程序保持运行,等待按钮事件的发生。
4.4 与 Arduino 平台比较
| 比较项 | GPIOZero(树莓派) | Arduino |
|---|---|---|
| 编程语言 | Python,易于学习和快速开发 | C/C++,性能较高但学习曲线较陡 |
| 设备建模 | 提供高级接口,无需管理单个引脚 | 需要手动管理引脚 |
| 扩展性 | 可通过扩展类支持新设备 | 扩展性相对较弱,需编写底层代码 |
| 生态系统 | 丰富的 Python 库支持 | 有大量的 Arduino 库和教程 |
从上述表格可以看出,GPIOZero 在开发的简易性和快速迭代方面具有优势,而 Arduino 在性能和底层控制方面表现较好。
5. 总结
通过本文,我们了解了树莓派 GPIO 的基本功能以及如何使用 GPIOZero 库来控制外部设备。GPIOZero 库为树莓派开发者提供了一个简单、高效的方式来与各种设备和传感器进行交互。其高级的设备建模特性使得开发者无需关注底层的引脚管理,能够更专注于实现具体的功能。
同时,我们通过控制 LED 和按钮的示例代码,展示了如何使用 GPIOZero 库进行实际开发。并且将其与 Arduino 平台进行了比较,突出了各自的优缺点。
在实际应用中,开发者可以根据项目的需求和自身的技术栈来选择合适的平台和库。如果追求快速开发和简单的编程体验,GPIOZero 库是一个不错的选择;如果对性能和底层控制有较高要求,Arduino 可能更适合。
希望本文能够帮助你更好地理解和使用 GPIOZero 库,开启你的树莓派开发之旅。
超级会员免费看
25

被折叠的 条评论
为什么被折叠?



