品味树莓派:GPIO Zero库使用入门
文章目录
- 目的
- 基础说明
- 入门使用
- LED
- PWMLED
- Button
- 更多入门例程
- 类基础说明
- 注意事项
- 总结
目的
树莓派有很多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 sleepred = LED(17) # 声明LED对象red,该对象连接至树莓派GPIO17引脚while True: # 使下面程序持续循环运行red.on() # 点亮LEDsleep(1) # 延时1秒red.off() # 熄灭LEDsleep(1) # 延时1秒
或者用下面代码也能实现一样的效果:
from gpiozero import LED # 引入LED类
from signal import pausered = 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 pauseled = 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 pausedef 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 pausedef 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
品味树莓派:GPIO Zero库使用入门相关推荐
- python控制树莓派led_Python 控制树莓派 GPIO 输出:控制 LED 灯
树莓派 GPIO 控制输出的入门应该都是从控制 LED 灯开始的吧. 树莓派版本:Model 3B+ 树莓派系统:Raspbian Stretch with desktop and recommend ...
- python控制灯_Python 控制树莓派 GPIO 输出:控制 LED 灯
树莓派 GPIO 控制输出的入门应该都是从控制 LED 灯开始的吧. 树莓派版本:Model 3B+ 树莓派系统:Raspbian Stretch with desktop and recommend ...
- python控制树莓派gpioled,Python 控制树莓派 GPIO 输出:控制 LED 灯
树莓派 GPIO 控制输出的入门应该都是从控制 LED 灯开始的吧. 树莓派版本:Model 3B+ 树莓派系统:Raspbian Stretch with desktop and recommend ...
- 树莓派GPIO入门(一):点亮一个LED灯
一.实验要求 点亮一个LED灯是电子开发最常见的入门实验.本次实验分为三个小实验: (1)点亮单个LED灯,并让其亮暗闪烁 (2)通过脉宽调制(PWM)点亮单个LED灯,并让其亮暗闪烁 (3)让LED ...
- 树莓派GPIO入门(五) :简易电子钟
一.实验要求 利用树莓派驱动数码管,使其能显示时间和日期.通过按键,可以在时间和日期之间切换 二.实验材料 按键1个 4位8段数码管(共阴极) 1个 杜邦线若干 树莓派4B.RPi.GPIO库 三.原 ...
- 树莓派GPIO口的使用(外设相关开发WringPi库的使用,超声波、继电器)
树莓派的接口: 大而简单的类别:IO口,input和output是相对于主控芯片来说的,是根据MCU和外设之间的关系将IO口的功能分为output和input.当IO作为input使用时外设有:人体传 ...
- 树莓派教程 - 1.0 树莓派GPIO库wiringPi 点亮LED
Git例程源码仓库:https://github.com/ZhiliangMa/raspberry.git 电脑需要提前安装的工具: SSH.串口 - 终端神器 MobaXterm,官网下载链接:ht ...
- Raspberry Pi 4B树莓派 |#入门教程02# 树莓派GPIO控制(Python、C)
树莓派GPIO编号方式 功能物理引脚 从左到右,从上到下:左边奇数,右边偶数:1-40 通过打开终端窗口并运行命令,可以在Raspberry Pi上访问方便的参考pinout.该工具由GPIO零 Py ...
- 树莓派GPIO入门11-驱动液晶屏幕(一)
树莓派GPIO入门11-驱动液晶屏幕(一)http://blog.mangolovecarrot.net/2016/01/30/raspi-study1101/ 本系列将驱动一块1.44"的 ...
最新文章
- 马哥第3期运维班第二周作业
- 如何通过ActivationStart监控 Angular的路由激活事件
- mysql xtrabackup 遭遇严重bug
- InnoDB的auto_increment指定值被重置问题
- 获取excel名称java_使用Apache POI获取大型Excel文件的Excel工作表名称
- ActiveX控件的另类免费签名法
- wxpython textctrl绑键盘事件_wxPython控件学习之TextCtrl(三)响应文本控件事件
- javaweb开发要学习的所有技术和框架总结
- CRC32(Cyclic Redundancy Check)循环冗余校验:推导
- 水库大坝安全监测系统/水利平台高保真原型/大坝安全监测分析预警系统 /工程监测/工程档案/环境量监测/位移监测/渗压监测/工程管理/报警管理/横河向位移监测/历史数据/工程档案/顺河向位移监测
- 引入dubbo项目接口_dubbo接口调用过程中,部分字段值丢失
- 登顶AI服务器全球第一后,浪潮发布AI系统浪潮元脑
- 文件夹的最小化时,上面的名字。
- 【Cocos2d-Js基础教学(2)类的使用和面向对象】
- Rayman的绝顶之路——Leetcode每日一题打卡9
- idea分支切换注意事项
- Photoshop二次开发接口介绍
- 如何有效规避程序化交易的滑点?
- java中awt和swing是什么关系
- 乐观锁 VS 悲观锁