0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

不同GPIO类库的区别

CHANBAEK 来源:和娃一起玩树莓派 作者:老孟K 2023-07-02 15:03 次阅读

重点来讲解一下什么是类库,如何使用,以及不同的GPIO类库的区别。

什么是类库

类库是别人写好的解决某类或某个问题的可以重复使用的代码集合。在面向对象编程(我们今后会讲到,可以简单理解为把程序设计为类似现实世界中各种对象的方式来解决问题)的编程语言里,类库里面包括了很多别人设计好的类对象,可以直接拿来使用,比如我们代码里面的sleep方法就来自于time库,可以让程序暂停(睡觉)指定的时间。有了类库,我们就不需要所有的事情都自己解决,对于别人已经解决的问题,可以直接使用他写好的类库,就像我们做机器人,轮子可以用现成的,不需要我们从原料开始做,选择合适尺寸,材料的轮子就行了,所以编程时要善于利用类库,不要做“重复发明轮子”的事情。类库也像我们搭积木是使用的不同形状和大小的积木块,拿来用就可以做出自己需要的东西。

类库可以分为两大类:

  • 编程语言自带的类库,比如Python编程语言自带的OS,sys,logging库,RPi.GPIO和time也是自带类库。
  • 第三方类库:除上面自带类库外的其他非官方类库都是。比如现在机器学习,数据分析常见的numpy,matplotlib 等。

from与import

Python有2种方式来使用类库,分别是import 和from。我们先看看import:

import 类库名1 [as 别名1], 类库名2 [as 别名2],...

使用这种语法格式的 import 语句,会导入指定类库中的所有成员(包括变量、函数、类等)。当需要使用类库中的成员时,需用该类库名(或别名)作为前缀,否则 Python 解释器会报错。

from的语法如下:

from 类库名 import 成员名1 [as 别名1],成员名2 [as 别名2],...

from只会导入模块中指定的成员,而不是全部成员。当程序中使用该成员时,无需附加任何前缀,直接使用成员名(或别名)就可以了。

我们的控制发光二极管的程序中,可以看到这2种使用类库的方式:

import RPi.GPIO as GPIO    #需要使用别人写好的类库
from time import sleep     #需要使用别人写好的类库
GPIO.setmode(GPIO.BCM)
GPIO.setup(27,GPIO.OUT)  #这2句把GPIO27设置为输出模式
while True:
    GPIO.output(27,True)   #在GPIO输出高电位1,此时LED
    sleep(1)             #等1秒
    GPIO.output(27,False)  #在GPIO输出低电位0,此时LED灭
    sleep(1)            #等待1秒

import引入了RPi.GPIO类库,并命名为别名GPIO,在程序中使用时,都需要加上GPIO这个别名,如GPIO.setmode(GPIO.BCM).

用from time import sleep引入了sleep,在代码中使用时,就不需要加上time这里类库名,而是直接使用sleep了。

GPIO的类库比较

上面讲了怎么把类库引入程序中,要想用好类库,还需要学习类库中各种类,函数等如何使用,此时就需要看类库对应的官方文档或者参考相关的文档了。

比如RPi.GPIO类库的官方文档网站是:

https://sourceforge.net/p/raspberry-gpio-python/wiki/BasicUsage/

一般这种网站都是英文的,比较考验大家英文水平,此时可以搜索国内的相应中文文档。

RPi.GPIO库

RPi.GPIO是比较老的GPIO库,使用时需要注意它有2种GPIO的引脚规则,分别为BOARD和BCM,使用时需要先指定用哪种规则,对应的代码为:

GPIO.setmode(GPIO.BOARD) #设置为BOARD模式
  # or
GPIO.setmode(GPIO.BCM)   #设置为BCM模式

我们先看看下面的图片以便理解接下来的讨论。

图片

BOARD模式是在程序中使用的是引脚的物理数字,也就是第几个引脚。BCM模式使用的是引脚的功能定义,比如GPIO27它的物理引脚数字是13,那么设置为BOARD模式时,我们在程序中输入的引脚数字应该是13

GPIO.setmode(GPIO.BOARD)
GPIO.setup(13,GPIO.OUT)  #把第13引脚(GPIO27)设置为输出模式

设置为BCM模式时,同样的引脚设置为输出模式代码为:

GPIO.setmode(GPIO.BCM)  
GPIO.setup(27,GPIO.OUT) #把GPIO27(第13引脚)设置为输出模式

大家使用时一定要注意区别。

使用RPi.GPIO库时,基本的使用方法是:

  1. 先设置引脚模式为BOARD还是BCM
  2. 设置引脚为OUTPUT(输出)还是INPUT(输入)
  3. 控制或读取引脚的数据。

想一想:如果电路连接不变,改用BOARD模式,我们的控制二极管程序应该如何修改呢?)

gpiozero库

大家可以看到使用RPi.GPIO库还是有点麻烦,于是有人在它的基础上开发了一个新的类库,让大家更方面的来控制GPIO,这个类库的名字叫做gpiozero,它的使用文档在这里:

https://gpiozero.readthedocs.io/en/stable/index.html

gpiozero是树莓派官方推荐的学习GPIO编程的类库,它创建了LED类用来控制发光二极管,Button类用来读取按钮状态,MotionSensor用于动作传感器等非常多的对象,我们可以直接使用。

使用它控制发光二极管的代码特别简单,还是以控制连接到GPIO27引脚的LED为例,代码如下:

from gpiozero import LED
from time import sleep


red = LED(27)     #创建一个led对象,命名为red,你可以可以用其他名字


while True:
    red.on()
    sleep(1)
    red.off()
    sleep(1)

可以看到gpiozero其实默认使用了BCM模式,只是我们不需要写在代码里了。

用gpiozero库,我们只需要定义一个led对象,然后调用对象的on, off方法就可以控制发光二级管了,对比RPi.GPIO,简单多了。

除了刚才介绍的这2个类库,还有其他的GPIO类库,比如pigpio,这里就不介绍了。

下一讲我们来聊聊如何通过这2个类库读取按钮的状态。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程语言
    +关注

    关注

    9

    文章

    1878

    浏览量

    33147
  • GPIO
    +关注

    关注

    16

    文章

    1136

    浏览量

    50582
  • 机器学习
    +关注

    关注

    66

    文章

    8131

    浏览量

    130573
  • python
    +关注

    关注

    51

    文章

    4677

    浏览量

    83473
收藏 人收藏

    评论

    相关推荐

    MIO与EMIO的关系解析 GPIO、MIO、EMIO的区别

    通过AXI点亮PL端LED。 1. MIO与EMIO 首先来理清楚MIO与EMIO的关系。MIO是PS的I/O引脚,一共有54个,分为Bank0与Bank1,可以接许多外设比如UART、SPI或GPIO
    的头像 发表于 11-24 14:32 2.1w次阅读
    MIO与EMIO的关系解析 <b class='flag-5'>GPIO</b>、MIO、EMIO的<b class='flag-5'>区别</b>

    GPIO不同模式间的区别与实现方式

    GPIO全称General Purpose Input Output 即通用输入/输出,其实GPIO的本质就是芯片的一个引脚,通常在ARM中所有的I/O都是通用的。
    的头像 发表于 10-09 15:09 1109次阅读

    GPIO 和 FGPIO的区别

    Kinetis 的GPIO和FGPIO除了在速度上的区别外,还有什么其他区别呢?
    发表于 03-10 10:42

    【Allwinner ClassA20分析】4.GPIO的使用

    ,如果想在Linux中直接设置GPIO寄存器需要做什么工作?基本上计算物理地址、获取映射地址、了解每个寄存器的作用、设置对应的位。。。。。。很是繁琐。而使用了封装的之后,只需要这样做: 只要从原理图
    发表于 04-23 09:23

    请问GPIO_MODE中的GPIO_MODE_IT_RISING和GPIO_MODE_EVT_RISING的区别是什么

    在学习CubeMX软件配置GPIO中断时,看到如图所示的选项:立刻就比较困惑,查了HAL后,看到GPIO_MODE的确有这样的定义如图:自己还在学习中,看了HAL的帮助文档,但不知道GPIO
    发表于 01-22 05:28

    请问这两访问有什么区别

    关于cpu访问GPIO、UART、I2C等接口,与cpu访问FLASH、ROM、SDRAM的区别?cpu访问GPIO、UART等外设,是通过特殊功能的寄存器,不也是在访问内存上的某一地址吗?而cpu访问FLASH、ROM也是访问
    发表于 09-10 05:45

    请问StringBuilder与string区别是什么?

    StringBuilder与string区别是什么
    发表于 11-06 06:16

    GPIO端口各种模式的区别

    GPIO端口各种模式的区别(1)GPIO_Mode_AIN 模拟输入(2)GPIO_Mode_IN_FLOATING 浮空输入(3)GPIO
    发表于 07-28 08:59

    HAL和标准的原理区别

    HAL的学习HAL和标准的原理区别串口通信实验包含的文件区别具体代码区别总结HAL
    发表于 07-29 08:48

    标准和HAL有啥区别

    ,程序瘫痪了,所以今天咱们来看看标准和HAL有啥区别,各个他的优点在哪里。标准串口通信GPIO
    发表于 08-04 08:22

    GPIO是什么?引脚和GPIO区别和联系

    )引脚和GPIO区别和联系?STM32的引脚中,有部分是做GPIO使用,部分是电源引脚/复位引脚/启动模式引脚/晶振引脚/调试下载引脚。(3)STM32F767IGT6 IO口引脚资源①一共有9组IO:PA~PI ②其中PA~
    发表于 01-11 06:43

    串口和普通gpio口功能的区别是什么

    GeneralPurposeInputOutput(通用输入/输出)简称为GPIO,或总线扩展器,人们利用工业标准I2C、SMBus或SPI接口简化了I/O口的扩展。当微控制器或芯片组没有足够的I/O端口,或当系统需要采用远端串行通信或控制时,GPIO产品能够提供额外的控
    发表于 11-25 10:55 4.5w次阅读
    串口和普通<b class='flag-5'>gpio</b>口功能的<b class='flag-5'>区别</b>是什么

    GPIO的定义和GPIO不同模式间的区别与实现方式

    保护二极管: 保护二极管从它的名字就不难想到他是用来对系统进行保护的,通过两个二极管的导通可以防止引脚外部输入电压过低或过高。当电压过高时,上方的保护二极管导通。当电压过低时,下方的二极管导通,防止不正常电压导入到芯片内部造成芯片烧毁。
    的头像 发表于 08-08 10:51 1651次阅读

    介绍GPIO的定义和GPIO不同模式间的区别与实现方式

    GPIO全称General Purpose Input Output 即通用输入/输出,其实GPIO的本质就是芯片的一个引脚,通常在ARM中所有的I/O都是通用的。
    的头像 发表于 08-25 18:25 1.9w次阅读
    介绍<b class='flag-5'>GPIO</b>的定义和<b class='flag-5'>GPIO</b>不同模式间的<b class='flag-5'>区别</b>与实现方式

    GPIO不同模式之间的区别与实现方式

    GPIO全称General Purpose Input Output ,即通用输入/输出。其实GPIO的本质就是芯片的一个引脚。由于每个开发板上都会设计不同的外围电路,这就造成了GPIO的功能可能有
    的头像 发表于 10-28 09:45 1313次阅读