重点来讲解一下什么是类库,如何使用,以及不同的GPIO类库的区别。
什么是类库
类库是别人写好的解决某类或某个问题的可以重复使用的代码集合。在面向对象编程(我们今后会讲到,可以简单理解为把程序设计为类似现实世界中各种对象的方式来解决问题)的编程语言里,类库里面包括了很多别人设计好的类对象,可以直接拿来使用,比如我们代码里面的sleep方法就来自于time库,可以让程序暂停(睡觉)指定的时间。有了类库,我们就不需要所有的事情都自己解决,对于别人已经解决的问题,可以直接使用他写好的类库,就像我们做机器人,轮子可以用现成的,不需要我们从原料开始做,选择合适尺寸,材料的轮子就行了,所以编程时要善于利用类库,不要做“重复发明轮子”的事情。类库也像我们搭积木是使用的不同形状和大小的积木块,拿来用就可以做出自己需要的东西。
类库可以分为两大类:
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库时,基本的使用方法是:
(想一想:如果电路连接不变,改用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个类库读取按钮的状态。
全部0条评论
快来发表一下你的评论吧 !