品味树莓派:GPIO Zero库使用入门

2023-11-08

目的

树莓派有很多GPIO口可供用户使用,官方同时也提供了一些方式来操作这些IO口,其中目前主要推荐的是基于Python的GPIO Zero库,本文将简单介绍该库的基础使用方法。

基础说明

GPIO Zero库是树莓派官方目前推荐的用于操作树莓派上GPIO口的Python库,该库最早是在RPi.GPIO库之上开发而来的,现在默认情况下也有许多功能是基于RPi.GPIO库实现的,不过用户可以自行设置其它库用在底层。
GPIO Zero库将常用的功能进行封装(LED、Button、Motor……),使一般用户和软件开发者更加容易实现需要用到GPIO口的功能,而不需要像RPi.GPIO库一样去了解GPIO口的输入输出、上下拉电阻等底层硬件相关的参数。
GPIO Zero库官方文档:https://gpiozero.readthedocs.io/en/stable/

可以看到官方文档的基础说明里都是具体的应用
可以看到官方文档的基础说明里都是具体的LED、Button、Motor等应用

带图形界面的Raspbian系统默认就安装了GPIO Zero库,Raspbian Lite上可以使下面命令来安装该库:

sudo apt update
sudo apt install python3-gpiozero

其它树莓派上的系统可以使下面命令来安装该库:

sudo pip3 install gpiozero

使用过程中需要的树莓派GPIO口定义可以参考下图:
在这里插入图片描述

入门使用

GPIO Zero库中具体实现的功能还是比较多的,这里挑选一部分介绍演示。

LED

控制LED是嵌入式入门实验,GPIO Zero库可以使用LED类来控制LED,首先按下图连接LED:
在这里插入图片描述
上图中左侧为实物连接,右侧为原理图,电路中的电阻是用来限制电流大小的。
可以使用下面代码来控制LED亮灭交替闪烁:

from gpiozero import LED # 引入LED类
from time import sleep

red = LED(17) # 声明LED对象red,该对象连接至树莓派GPIO17引脚

while True: # 使下面程序持续循环运行
    red.on() # 点亮LED
    sleep(1) # 延时1秒
    red.off() # 熄灭LED
    sleep(1) # 延时1秒

或者用下面代码也能实现一样的效果:

from gpiozero import LED # 引入LED类
from signal import pause

red = LED(17) # 声明LED对象red,该对象连接至树莓派GPIO17引脚

red.blink() # 使LED反复亮灭

pause() # 暂停当前脚本的进程
        #(使脚本不会结束,这样red.blink()就会一直运行,不会因为脚本结束而被释放)

在这里插入图片描述
上面是简单的演示,每隔一秒分别开关了LED,同时打印了其状态。

LED类更多说明如下:

  • class gpiozero.LED(pin, *, active_high=True, initial_value=False, pin_factory=None)
    LED构造函数,输入参数如下:
    pin: GPIO口编号(填入数字或字符串均可);
    active_high: LED是否在GPIO口电平为High时点亮,默认True表示GPIO口输出高电平时点亮LED;
    initial_value: 初始值,默认False表示初始不点亮LED;
    pin_factory: 一般不用到,以后会单独进行讲解,下同;
  • blink(on_time=1, off_time=1, n=None, background=True)
    控制LED闪烁,输入参数如下:
    on_time: 一次闪烁中LED点亮持续时间,单位秒;
    off_time: 一次闪烁中LED熄灭持续时间,单位秒;
    n: 闪烁次数,默认None表示LED将持续闪烁;
    background: 默认True表示该动作将新开一个线程运行,函数会立即返回。如果设置为False,函数将阻塞在次直到闪烁完成才返回;
  • off() 熄灭LED;
  • on() 点亮LED;
  • toggle() 翻转LED状态;
  • is_lit 以布尔值方式表示LED是否点亮状态;
  • pin 以字符串形式表示LED连接的pin编号;
  • value 以数值形式表示LED是否点亮状态;

PWMLED

上面的LED只是单纯的点亮或熄灭,GPIO Zero库中还可以使用PWM来调节KED亮度,或是实现呼吸灯功能,比如下面代码:

from gpiozero import PWMLED # 引入PWMLED类
from time import sleep
from signal import pause

led = PWMLED(17) # 声明PWMLED对象led,该对象连接至树莓派GPIO17引脚

led.value = 1 # 以100%亮度点亮LED(这里用了特别的方式,以后会单独进行讲解)
sleep(2) # 延时2秒
led.value = 0.5 # 以50%亮度点亮LED
sleep(2) # 延时2秒
led.value = 0 # 熄灭LED
sleep(2) # 延时2秒

led.pulse() # 使LED以呼吸灯方式闪烁

pause()

PWMLED类更多说明如下:

  • class gpiozero.PWMLED(pin, *, active_high=True, initial_value=0, frequency=100, pin_factory=None)
    LED构造函数,输入参数如下:
    pin: GPIO口编号(填入数字或字符串均可);
    active_high: LED是否在GPIO口电平为High时点亮,默认True表示GPIO口输出高电平时点亮LED;
    initial_value: 初始值,可选0和1之间的值,0表示熄灭,1表示完全点亮;
    frequency: PWM频率,默认值100表示100Hz;
  • blink(on_time=1, off_time=1, fade_in_time=0, fade_out_time=0, n=None, background=True)
    控制LED闪烁,输入参数如下:
    on_time: 一次闪烁中LED完全点亮持续时间,单位秒;
    off_time: 一次闪烁中LED完全熄灭持续时间,单位秒;
    fade_in_time: 一次闪烁中LED从熄灭到点亮的过程时间,单位秒;
    fade_out_time: 一次闪烁中LED从点亮到熄灭的过程时间,单位秒;
    n: 闪烁次数,默认None表示LED将持续闪烁;
    background: 默认True表示该动作将新开一个线程运行,函数会立即返回。如果设置为False,函数将阻塞在次直到闪烁完成才返回;
  • off() 熄灭LED;
  • on() 点亮LED;
  • pulse(fade_in_time=1, fade_out_time=1, n=None, background=True)
    控制LED闪烁,输入参数如下:
    fade_in_time: 一次闪烁中LED从熄灭到点亮的过程时间,单位秒;
    **fade_out_time:**一次闪烁中LED从点亮到熄灭的过程时间,单位秒;
    n: 闪烁次数,默认None表示LED将持续闪烁;
    background: 默认True表示该动作将新开一个线程运行,函数会立即返回。如果设置为False,函数将阻塞在次直到闪烁完成才返回;
  • toggle() 翻转LED状态至 1 - value
  • is_lit 以布尔值方式表示LED是否点亮状态;
  • pin 以字符串形式表示LED连接的pin编号;
  • value 返回当前LED的PWM占空比值;

Button

外接物理按键是一个非常常用的功能,GPIO Zero库中直接封装了一个Button类,这个类的使用非常方便,首先按照下图方式连接设备:
在这里插入图片描述
按上图连接电路,等下再在程序里启用GPIO2的内部上拉电阻,这样的话按钮在未被按下时GPIO2上为高电平,当按钮被按下后会变为低电平。
使用下面代码可以简单进行测试:

from gpiozero import Button # 引入Button类

button = Button(2) # 声明Button对象button,该对象连接至树莓派GPIO2引脚

button.wait_for_press() # 等待按钮被按下
print(button.is_pressed) # 当按钮被按下时触发该行

button.wait_for_release() # 等待按钮被松开
print(button.is_pressed) # 当按钮被松开时触发该行

在这里插入图片描述
上面是个简单的演示,实际操作中不太会用wait_for_press()和wait_for_release(),更多的会用事件与回调函数形式来处理按钮按下松开时的动作:

from gpiozero import Button # 引入Button类
from signal import pause

def btn_held(): # 回调函数
    print('held:{} - {}'.format(button.is_pressed, button.is_held))
    print('{} - {}'.format(button.pressed_time, button.held_time))
    
def btn_pressed(): # 回调函数
    print('pressed:{} - {}'.format(button.is_pressed, button.is_held))
    print('{} - {}'.format(button.pressed_time, button.held_time))

def btn_released(): # 回调函数
    print('released:{} - {}'.format(button.is_pressed, button.is_held))
    print('{} - {}'.format(button.pressed_time, button.held_time))

button = Button(2) # 声明Button对象button,该对象连接至树莓派GPIO2引脚

button.when_held = btn_held # 注册按钮长按事件回调函数
button.when_pressed = btn_pressed # 注册按钮按下事件回调函数
button.when_released = btn_released # 注册按钮松开事件回调函数

pause()

在这里插入图片描述
上面演示了基础的回调函数功能,事实上按钮事件的回调函数在触发时还可以传入Button对象,这在多个按钮绑定同一个回调函数的时候挺好用,可以知道具体是哪个按钮触发了该动作:

from gpiozero import Button # 引入Button类
from signal import pause

def btn_callback(btn): # 回调函数
    print(btn.pin) # 打印触发该函数的Button对象连接的GPIO编号

button = Button(2) # 声明Button对象button,该对象连接至树莓派GPIO2引脚

button.when_pressed = btn_callback # 注册按钮按下事件回调函数

pause()

在这里插入图片描述

Button类更多说明如下:

  • class gpiozero.Button(pin, *, pull_up=True, active_state=None, bounce_time=None, hold_time=1, hold_repeat=False, pin_factory=None)
    Button构造函数,输入参数如下:
    pin: GPIO口编号(填入数字或字符串均可);
    pull_up: 内部上下拉电阻设置,True启用内部上拉,False启用内部下来,None不启用上下拉;
    active_state: 如果为True,则IO外部为高时软件显示该IO口为高,如果为False,则IO外部为高时软件显示该IO口为低。当pull_up不为None时该值将自动设置;
    bounce_time: 软件消抖时间,None则为不启用软件消抖;
    hold_time: 按下按钮后直到触发when_held的时间,单位秒;
    hold_repeat: 如果为True,则只要按钮持续被按下when_held会每隔hold_time时间持续被触发,如果为False,则when_held只会触发一次;
  • wait_for_press(timeout=None) 等待按钮被按下,timeout为超时时间,单位秒;
  • wait_for_release(timeout=None) 等待按钮被释放,timeout为超时时间,单位秒;
  • pressed_time 从按钮被按下开始持续经过的时间;
  • held_time 从when_held触发开始按钮被持续按下的时间;
  • is_held 如果该值为True,则说明按钮至少被按下hold_time秒;
  • is_pressed 如果按钮被按下该值为True,否则为False;
  • pin 以字符串形式表示LED连接的pin编号;
  • value 如果按钮被按下该值为1,否则为0;
  • when_held 当按钮被按下hold_time后触发的回调函数,填写None则禁用该事件;
  • when_pressed 当按钮被按下时触发的回调函数,填写None则禁用该事件;
  • when_released 当按钮被松开时触发的回调函数,填写None则禁用该事件;

更多入门例程

GPIO Zero库文档中提供了非常多的常用的元器件、传感器、执行器等的例程,比如人体红外传感器、超声波测距传感器、电机等等。更多内容可以参考官方文档:
https://gpiozero.readthedocs.io/en/stable/recipes.html
注:GPIO Zero官方例程中有很多内容是基于特定某个电路或电路模块而来的,请根据自己的实际情况进行阅读。

类基础说明

GPIO Zero库中各个类的关系如下图(点击看大图):
在这里插入图片描述
上图中深蓝色的是实体类、浅蓝色的是抽象类、紫色的是mixin类。越靠近右边的越具体、越接近用户,比如LED、Button等。
从上图可以看到LED和Buzzer都是基于DigitalOutputDevice类的(如果你去看源码的话就会发现LED类几乎就只是DigitalOutputDevice类换了个名称而已),该类用于控制GPIO口数字输出,如果你想单独控制GPIO口用作数字输出就可以直接用该类,参考下面例子:
在这里插入图片描述
同样的如果你想单独控制GPIO口用作数字输入就可以使用上图中DigitalInputDevice类。其它情况同理,可以在上图中找到合适的类使用。相关的类说明可以从参考官方文档中以 API - 开头的相关章节中查询:
在这里插入图片描述
当然对于Python而言库写的好的话用help方法也很方便:
在这里插入图片描述

注意事项

GPIO Zero库中的对象在被释放时受控的GPIO口会恢复到系统启动后的初始状态。除系统自动释放外你也可以使用close()方法手动进行释放。

总结

GPIO Zero库使用起来还是比较简单的,特别适合没有硬件基础的用户使用,更多内容可以参考下面链接:
https://github.com/gpiozero/gpiozero

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

品味树莓派:GPIO Zero库使用入门 的相关文章

随机推荐

  • 解决MySQL命令行输入密码闪退+不能启动问题

    win10环境 新下载MySQL8 0 26 刚装完还是能用 两天没打开 突然出现了问题 下面记录一下解决过程 右键屏幕底部 打开任务管理器 服务 在服务中点击查看MySQL服务状态是否为开启 MySQL服务没有开启 搜索 cmd 右键单击
  • Ansible脚本搭建k8s平台

    1 官网下载安装virtualBox centos7镜像 2 virtualBox安装centos7镜像 参考http www cnblogs com hihtml5 p 8217062 html 3 下载安装putty通过SSH连接虚拟机
  • Linux 进程基础概念-进程状态、进程构成、进程控制

    目录 Linux 进程 进程基础概念 进程状态 进程的构成 进程控制 进程创建和终止 Linux 进程 参考 linux操作系统 进程的切换与控制 到底有啥关系 知乎 zhihu com Linux进程解析 deep explore的博客
  • 【代码】处理数据集的一些常用脚本

    前言 由于训练模型经常使用到一些处理数据集的脚本 每次重新写都蛮麻烦的 因此决定整理一下之后备用 加快效率 一些是借鉴网上的脚本但是因为时间太久找不到原链接所以比较抱歉没有贴出来原链接 还有一些是自己写的 发出来分享一下 1 voc数据集抽
  • wifi卡慢延迟高_wifi卡怎么办(wifi信号满格但网速慢解决方法)

    最近学霸君有个朋友 天天吹自己家里 100M 光纤 可每晚一起开黑王者的总是说家里 WiFi 莫名卡顿 断流 然后各种理由坑人 让它换路由器吧 又不舍得花这点钱 说是够用就行 生怕自己气成祖安人的学霸君 只好上门帮他看看是不是路由器没设置好
  • [技术发展-26]:新型信息与通信网络的数据安全

    前言 网络安全 通常指计算机网络的安全 实际上也可以指计算机通信网络的安全 计算机通信网络是将若干台具有独立功能的计算机通过通信设备及传输媒体互连起来 在通信软件的支持下 实现计算机间的信息传输与交换的系统 而计算机网络是指以共享资源为目的
  • 【idea插件开发】从0入门idea插件开发,idea插件开发教程,如何开发idea插件

    idea插件介绍 作为一枚程序员 平时最常用的ide就是IntelliJ IDEA 平时会用到各种各样的插件 通过插件的使用 提高自己的开发效率 idea具有全局性 安装好插件后 对idea生效 所有的工程均能找到 idea使用的便捷性 在
  • 单词长度(输入在一行中给出一行文本,以‘.’结束,结尾的句号不能计算在最后一个单词的长度内。在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。)

    单词长度 5分 题目内容 你的程序要读入一行文本 其中以空格分隔为若干个单词 以 结束 你要输出这行文本中每个单词的长度 这里的单词与语言无关 可以包括各种符号 比如 it s 算一个单词 长度为4 注意 行中可能出现连续的空格 输入格式
  • OpenWRT的开发

    Openwrt 官方正式的发行版是已编译好了的映像文件 后缀名bin或trx trx2 此映像文件可从Openwrt官方网站的下载页面中轻松获取到 连接地址为 OpenWrt官方网站 准备工作 在开始编译Openwrt之前需要您做些准备工作
  • FreeRTOS+CubeMX系列第一篇——初识FreeRTOS

    文章目录 一 关于FreeRTOS 二 FreeRTOS的特点 三 如何在CubeMX上配置FreeRTOS 四 FreeRTOS文档资料 五 同系列博客 一 关于FreeRTOS 1 什么是FreeRTOS FreeRTOS是一个迷你的实
  • goland os.Open 路径错误

    os Open 报错原因 Open不是当前目录下查找 项目取的是项目根目录 不是执行目录 证明如下 exPath os Getwd fmt Println expath exPath file err os Open exPath file
  • 504 错误码排查

    当出现 504 错误码时 表示请求超时 服务器无法及时响应请求 需要检查下应用是否有什么耗时的操作 比如是否出现了 SQL 慢查询 是否接口发生死循环 是否出现死锁等 同时需要关注服务器系统负载高不高 网络异常 接口原本好好的 突然出现超时
  • JAVA基础算法——将字符串按照字典倒序排序并输出

    JAVA基础算法 将字符串按照字典倒序输出 作者 飞不高的鱼 转载请注明出处 import java util Arrays import java util Comparator 将已知的乱序字符串按照字典倒序排序输出 author xi
  • 矩阵的投影、线性拟合与最小二乘法

    概要 投影矩阵 如果一个b向量进行矩阵运算 Pb 那么向量b就会投影要A的列空间的最近点 目录 一 矩阵的四大基础子空间 二 投影矩阵 三 最小二乘法 一 矩阵的四大基础子空间 一个矩阵有4个子空间 分别是行空间 零空间 列空间和左零空间
  • C#中的委托、事件与接口

    C 中的委托 事件与接口 一 委托 一 委托链 二 匿名函数 三 Lamda语句 二 事件 三 接口 一 委托 委托 将方法以变量的形式传递 以方法的形式执行 注意 赋值方法的返回类型 参数要与委托的一致 如委托定义的参数类型是string
  • 微信小程序上传文件组件

    微信小程序上传文件 一 说明 该拍照组件带有微信授权相机功能 会结合后端接口 将上传的图片以数组集合的形式传值给父级页面 注意 组件适用于 单独上传图片 不携带参数 结合后端接口返回路径之后 再调用另外的保存接口 携带参数与图片提交的场景
  • 抓取第三方网站数据

    最近需要把某网站的统计数据聚合到我们自己的系统里 但是该网站没有提供标准API 所以就尝试自己抓取了一下 本文总结一下一般的方法 分析服务地址 通常网站有2种做法 一种是后端渲染 直接把渲染后的完整界面呈现在浏览器 另一种前端是静态页面 通
  • mybatis plus中的${ew.sqlSegment},${ew.sqlSelect},${ew.customSqlSegment},${ew.sqlSet}使用

    ew是mapper方法里的 Param Constants WRAPPER Wrapper queryWrapper对象 首先判断ew emptyOfWhere是否存在where条件 有的话再拼接上去 ew customSqlSegment
  • java毕业设计——基于JSP+JavaBean+sqlserver的在线购物系统设计与实现(毕业论文+程序源码)——在线购物系统

    基于JSP JavaBean sqlserver的在线购物系统设计与实现 毕业论文 程序源码 大家好 今天给大家介绍基于JSP JavaBean sqlserver的在线购物系统设计与实现 文章末尾附有本毕业设计的论文和源码下载地址哦 需要
  • 品味树莓派:GPIO Zero库使用入门

    文章目录 目的 基础说明 入门使用 LED PWMLED Button 更多入门例程 类基础说明 注意事项 总结 目的 树莓派有很多GPIO口可供用户使用 官方同时也提供了一些方式来操作这些IO口 其中目前主要推荐的是基于Python的GP