重點(diǎn)來講解一下什么是類庫,如何使用,以及不同的GPIO類庫的區(qū)別。
什么是類庫
類庫是別人寫好的解決某類或某個問題的可以重復(fù)使用的代碼集合。在面向?qū)ο?a href="http://www.asorrir.com/v/tag/1315/" target="_blank">編程(我們今后會講到,可以簡單理解為把程序設(shè)計為類似現(xiàn)實(shí)世界中各種對象的方式來解決問題)的編程語言里,類庫里面包括了很多別人設(shè)計好的類對象,可以直接拿來使用,比如我們代碼里面的sleep方法就來自于time庫,可以讓程序暫停(睡覺)指定的時間。有了類庫,我們就不需要所有的事情都自己解決,對于別人已經(jīng)解決的問題,可以直接使用他寫好的類庫,就像我們做機(jī)器人,輪子可以用現(xiàn)成的,不需要我們從原料開始做,選擇合適尺寸,材料的輪子就行了,所以編程時要善于利用類庫,不要做“重復(fù)發(fā)明輪子”的事情。類庫也像我們搭積木是使用的不同形狀和大小的積木塊,拿來用就可以做出自己需要的東西。
類庫可以分為兩大類:
- 編程語言自帶的類庫,比如Python編程語言自帶的OS,sys,logging庫,RPi.GPIO和time也是自帶類庫。
- 第三方類庫:除上面自帶類庫外的其他非官方類庫都是。比如現(xiàn)在機(jī)器學(xué)習(xí),數(shù)據(jù)分析常見的numpy,matplotlib 等。
from與import
Python有2種方式來使用類庫,分別是import 和from。我們先看看import:
import 類庫名1 [as 別名1], 類庫名2 [as 別名2],...
使用這種語法格式的 import 語句,會導(dǎo)入指定類庫中的所有成員(包括變量、函數(shù)、類等)。當(dāng)需要使用類庫中的成員時,需用該類庫名(或別名)作為前綴,否則 Python 解釋器會報錯。
from的語法如下:
from 類庫名 import 成員名1 [as 別名1],成員名2 [as 別名2],...
from只會導(dǎo)入模塊中指定的成員,而不是全部成員。當(dāng)程序中使用該成員時,無需附加任何前綴,直接使用成員名(或別名)就可以了。
我們的控制發(fā)光二極管的程序中,可以看到這2種使用類庫的方式:
import RPi.GPIO as GPIO #需要使用別人寫好的類庫
from time import sleep #需要使用別人寫好的類庫
GPIO.setmode(GPIO.BCM)
GPIO.setup(27,GPIO.OUT) #這2句把GPIO27設(shè)置為輸出模式
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的類庫比較
上面講了怎么把類庫引入程序中,要想用好類庫,還需要學(xué)習(xí)類庫中各種類,函數(shù)等如何使用,此時就需要看類庫對應(yīng)的官方文檔或者參考相關(guān)的文檔了。
比如RPi.GPIO類庫的官方文檔網(wǎng)站是:
https://sourceforge.net/p/raspberry-gpio-python/wiki/BasicUsage/
一般這種網(wǎng)站都是英文的,比較考驗大家英文水平,此時可以搜索國內(nèi)的相應(yīng)中文文檔。
RPi.GPIO庫
RPi.GPIO是比較老的GPIO庫,使用時需要注意它有2種GPIO的引腳規(guī)則,分別為BOARD和BCM,使用時需要先指定用哪種規(guī)則,對應(yīng)的代碼為:
GPIO.setmode(GPIO.BOARD) #設(shè)置為BOARD模式
# or
GPIO.setmode(GPIO.BCM) #設(shè)置為BCM模式
我們先看看下面的圖片以便理解接下來的討論。
BOARD模式是在程序中使用的是引腳的物理數(shù)字,也就是第幾個引腳。BCM模式使用的是引腳的功能定義,比如GPIO27它的物理引腳數(shù)字是13,那么設(shè)置為BOARD模式時,我們在程序中輸入的引腳數(shù)字應(yīng)該是13
GPIO.setmode(GPIO.BOARD)
GPIO.setup(13,GPIO.OUT) #把第13引腳(GPIO27)設(shè)置為輸出模式
設(shè)置為BCM模式時,同樣的引腳設(shè)置為輸出模式代碼為:
GPIO.setmode(GPIO.BCM)
GPIO.setup(27,GPIO.OUT) #把GPIO27(第13引腳)設(shè)置為輸出模式
大家使用時一定要注意區(qū)別。
使用RPi.GPIO庫時,基本的使用方法是:
- 先設(shè)置引腳模式為BOARD還是BCM
- 設(shè)置引腳為OUTPUT(輸出)還是INPUT(輸入)
- 控制或讀取引腳的數(shù)據(jù)。
(想一想:如果電路連接不變,改用BOARD模式,我們的控制二極管程序應(yīng)該如何修改呢?)
gpiozero庫
大家可以看到使用RPi.GPIO庫還是有點(diǎn)麻煩,于是有人在它的基礎(chǔ)上開發(fā)了一個新的類庫,讓大家更方面的來控制GPIO,這個類庫的名字叫做gpiozero,它的使用文檔在這里:
https://gpiozero.readthedocs.io/en/stable/index.html
gpiozero是樹莓派官方推薦的學(xué)習(xí)GPIO編程的類庫,它創(chuàng)建了LED類用來控制發(fā)光二極管,Button類用來讀取按鈕狀態(tài),MotionSensor用于動作傳感器等非常多的對象,我們可以直接使用。
使用它控制發(fā)光二極管的代碼特別簡單,還是以控制連接到GPIO27引腳的LED為例,代碼如下:
from gpiozero import LED
from time import sleep
red = LED(27) #創(chuàng)建一個led對象,命名為red,你可以可以用其他名字
while True:
red.on()
sleep(1)
red.off()
sleep(1)
可以看到gpiozero其實(shí)默認(rèn)使用了BCM模式,只是我們不需要寫在代碼里了。
用gpiozero庫,我們只需要定義一個led對象,然后調(diào)用對象的on, off方法就可以控制發(fā)光二級管了,對比RPi.GPIO,簡單多了。
除了剛才介紹的這2個類庫,還有其他的GPIO類庫,比如pigpio,這里就不介紹了。
下一講我們來聊聊如何通過這2個類庫讀取按鈕的狀態(tài)。
-
編程語言
+關(guān)注
關(guān)注
10文章
1955瀏覽量
36087 -
GPIO
+關(guān)注
關(guān)注
16文章
1272瀏覽量
53571 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8492瀏覽量
134087 -
python
+關(guān)注
關(guān)注
56文章
4825瀏覽量
86178
發(fā)布評論請先 登錄
使用STM32 HAL庫進(jìn)行GPIO控制的實(shí)例
請問GPIO_MODE中的GPIO_MODE_IT_RISING和GPIO_MODE_EVT_RISING的區(qū)別是什么
請問這兩類訪問有什么區(qū)別?
標(biāo)準(zhǔn)庫和HAL庫有啥區(qū)別
GPIO輸出--蜂鳴器
STM32F407標(biāo)準(zhǔn)庫學(xué)習(xí)筆記-GPIO

STM32G031K LL庫使用 - GPIO

HAL庫的GPIO八種工作模式

【STM32】標(biāo)準(zhǔn)庫與HAL庫對照學(xué)習(xí)教程三--使用庫函數(shù)配置GPIO點(diǎn)亮LED燈

00_STM32F4學(xué)習(xí)_HAL庫_GPIO函數(shù)

HAL庫-GPIO介紹

【STM32】標(biāo)準(zhǔn)庫與HAL庫對照學(xué)習(xí)教程特別篇--GPIO詳講

單片機(jī)GPIO配置不同輸出速度有何區(qū)別?

評論