文章目录

  • 目的
  • 基础说明
  • 入门使用
    • 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库使用入门相关推荐

  1. python控制树莓派led_Python 控制树莓派 GPIO 输出:控制 LED 灯

    树莓派 GPIO 控制输出的入门应该都是从控制 LED 灯开始的吧. 树莓派版本:Model 3B+ 树莓派系统:Raspbian Stretch with desktop and recommend ...

  2. python控制灯_Python 控制树莓派 GPIO 输出:控制 LED 灯

    树莓派 GPIO 控制输出的入门应该都是从控制 LED 灯开始的吧. 树莓派版本:Model 3B+ 树莓派系统:Raspbian Stretch with desktop and recommend ...

  3. python控制树莓派gpioled,Python 控制树莓派 GPIO 输出:控制 LED 灯

    树莓派 GPIO 控制输出的入门应该都是从控制 LED 灯开始的吧. 树莓派版本:Model 3B+ 树莓派系统:Raspbian Stretch with desktop and recommend ...

  4. 树莓派GPIO入门(一):点亮一个LED灯

    一.实验要求 点亮一个LED灯是电子开发最常见的入门实验.本次实验分为三个小实验: (1)点亮单个LED灯,并让其亮暗闪烁 (2)通过脉宽调制(PWM)点亮单个LED灯,并让其亮暗闪烁 (3)让LED ...

  5. 树莓派GPIO入门(五) :简易电子钟

    一.实验要求 利用树莓派驱动数码管,使其能显示时间和日期.通过按键,可以在时间和日期之间切换 二.实验材料 按键1个 4位8段数码管(共阴极) 1个 杜邦线若干 树莓派4B.RPi.GPIO库 三.原 ...

  6. 树莓派GPIO口的使用(外设相关开发WringPi库的使用,超声波、继电器)

    树莓派的接口: 大而简单的类别:IO口,input和output是相对于主控芯片来说的,是根据MCU和外设之间的关系将IO口的功能分为output和input.当IO作为input使用时外设有:人体传 ...

  7. 树莓派教程 - 1.0 树莓派GPIO库wiringPi 点亮LED

    Git例程源码仓库:https://github.com/ZhiliangMa/raspberry.git 电脑需要提前安装的工具: SSH.串口 - 终端神器 MobaXterm,官网下载链接:ht ...

  8. Raspberry Pi 4B树莓派 |#入门教程02# 树莓派GPIO控制(Python、C)

    树莓派GPIO编号方式 功能物理引脚 从左到右,从上到下:左边奇数,右边偶数:1-40 通过打开终端窗口并运行命令,可以在Raspberry Pi上访问方便的参考pinout.该工具由GPIO零 Py ...

  9. 树莓派GPIO入门11-驱动液晶屏幕(一)

    树莓派GPIO入门11-驱动液晶屏幕(一)http://blog.mangolovecarrot.net/2016/01/30/raspi-study1101/ 本系列将驱动一块1.44"的 ...

最新文章

  1. 马哥第3期运维班第二周作业
  2. 如何通过ActivationStart监控 Angular的路由激活事件
  3. mysql xtrabackup 遭遇严重bug
  4. InnoDB的auto_increment指定值被重置问题
  5. 获取excel名称java_使用Apache POI获取大型Excel文件的Excel工作表名称
  6. ActiveX控件的另类免费签名法
  7. wxpython textctrl绑键盘事件_wxPython控件学习之TextCtrl(三)响应文本控件事件
  8. javaweb开发要学习的所有技术和框架总结
  9. CRC32(Cyclic Redundancy Check)循环冗余校验:推导
  10. 水库大坝安全监测系统/水利平台高保真原型/大坝安全监测分析预警系统 /工程监测/工程档案/环境量监测/位移监测/渗压监测/工程管理/报警管理/横河向位移监测/历史数据/工程档案/顺河向位移监测
  11. 引入dubbo项目接口_dubbo接口调用过程中,部分字段值丢失
  12. 登顶AI服务器全球第一后,浪潮发布AI系统浪潮元脑
  13. 文件夹的最小化时,上面的名字。
  14. 【Cocos2d-Js基础教学(2)类的使用和面向对象】
  15. Rayman的绝顶之路——Leetcode每日一题打卡9
  16. idea分支切换注意事项
  17. Photoshop二次开发接口介绍
  18. 如何有效规避程序化交易的滑点?
  19. java中awt和swing是什么关系
  20. 乐观锁 VS 悲观锁

热门文章

  1. 红旗linux分区方案有,红旗Linux分区全攻略
  2. VMware vSphere虚拟机文件介绍
  3. 26,verilog之常数终极使用规则
  4. ERP项目实施的5个关键控制点
  5. c语言金字塔输出乘法表,python中打印金字塔和九九乘法表的几种方法
  6. 国富论(英语:The Wealth of Nations)
  7. 黑格尔《精神现象学》句读 -- 绪论
  8. 2022年打算转行软件测试的看过来,1篇文章让你了解什么是软件测试(超详细~)
  9. 个人简历中的自我评价
  10. FX3uPLC型号及三菱PLC的分类