重點來講解一下什么是類庫,如何使用,以及不同的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庫時,基本的使用方法是:
- 先設置引腳模式為BOARD還是BCM
- 設置引腳為OUTPUT(輸出)還是INPUT(輸入)
- 控制或讀取引腳的數據。
(想一想:如果電路連接不變,改用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個類庫讀取按鈕的狀態。
-
編程語言
+關注
關注
10文章
1964瀏覽量
39579 -
GPIO
+關注
關注
16文章
1328瀏覽量
56231 -
機器學習
+關注
關注
66文章
8553瀏覽量
136964 -
python
+關注
關注
57文章
4876瀏覽量
90058
發布評論請先 登錄
使用STM32 HAL庫進行GPIO控制的實例
請問GPIO_MODE中的GPIO_MODE_IT_RISING和GPIO_MODE_EVT_RISING的區別是什么
請問這兩類訪問有什么區別?
GPIO輸出--蜂鳴器
STM32F407標準庫學習筆記-GPIO
STM32G031K LL庫使用 - GPIO
HAL庫的GPIO八種工作模式
【STM32】標準庫與HAL庫對照學習教程三--使用庫函數配置GPIO點亮LED燈
00_STM32F4學習_HAL庫_GPIO函數
HAL庫-GPIO介紹
【STM32】標準庫與HAL庫對照學習教程特別篇--GPIO詳講
單片機GPIO配置不同輸出速度有何區別?
不同GPIO類庫的區別
評論