使用RPi.GPIO需要學(xué)習(xí)更多的相關(guān)知識(shí),但是事實(shí)證明花費(fèi)這些精力是值得的。
為什么不直接使用GPIO Zero?
GPIO Zero并不是作為RPi.GPIO的替代品而創(chuàng)建的。它其實(shí)構(gòu)建在RPi.GPIO之上,旨在幫助初學(xué)者能夠盡可能輕松地使用RPi.GPIO。
通過直接使用RPi.GPIO,您可以更好地了解內(nèi)部的運(yùn)行操作,并且為之后的項(xiàng)目開發(fā)出更精細(xì)的控制功能。
通過GPIO Zero的API您可以對上拉和下拉電阻、高態(tài)動(dòng)作和低態(tài)動(dòng)作引腳等進(jìn)行修改。但是如果您過于頻繁的使用它,那么就失去GPIO在簡易性方面的優(yōu)勢了。
使用RPi.GPIO的另一個(gè)原因是駭客和制造商們分享了許多使用了RPi.GPIO的很棒的項(xiàng)目。一旦您掌握了這個(gè)模塊,就意味著這個(gè)領(lǐng)域的大門將會(huì)向您敞開!
也許有一天您會(huì)想使用諸如C或C++這樣的語言。這些語言更高級一些,但是會(huì)提供更多的控制功能以及使硬件的使用更加高效的功能。使用RPi.GPIO無法讓您直接實(shí)現(xiàn)這個(gè)目的,但是它可以幫助您朝這個(gè)方向邁進(jìn)。
目前不用擔(dān)心會(huì)消耗過多CPU周期。每個(gè)Raspberry Pi的處理能力都遠(yuǎn)遠(yuǎn)超過本項(xiàng)目所需。鏡像:Raspberry Pi。
導(dǎo)入RPi.GPIO庫
導(dǎo)入RPi.GPIO模塊的語法是:
import RPi.GPIO as GPIO
官方文檔和大多數(shù)已發(fā)布的項(xiàng)目都遵循該語法。如果您也使用該語句,可以直接借用他們的代碼。
RPi.GPIO 可讓您選擇引腳編號(hào)模式
有兩種對引腳進(jìn)行編號(hào)的方法。您可以通過它們在GPIO接頭中的放置位置來描述這些引腳,這種方法稱為“板編號(hào)”。
您也可以通過它們連接到Raspberry Pi核心中Broadcom芯片的順序來對其進(jìn)行描述。如果您覺得GPIO引腳編號(hào)與其在接頭中的位置無關(guān),可以使用該方法。
您可以使用RPi.GPIO’s setmode函數(shù)來對這兩種編號(hào)系統(tǒng)進(jìn)行選擇:
GPIO.setmode(GPIO.BOARD)
GPIO.setmode(GPIO.BCM)
如果在設(shè)置模式之前就分配引腳,那么Python會(huì)返回錯(cuò)誤信息。
我個(gè)人更喜歡Broadcom編號(hào)模式。因?yàn)樵谶@種模式下,哪些引腳是GPIO、接地或電源會(huì)更清晰。我還使用了GPIO擴(kuò)展板來構(gòu)建面包板原型,并且在該板上根據(jù)GPIO編號(hào)對每個(gè)引腳進(jìn)行標(biāo)記。
有人可能覺得板編號(hào)模式更容易一些。如果該模式適用于您的項(xiàng)目,那也很好!您可以自行選擇。
在本文的剩余部分,我們將會(huì)使用Broadcom編號(hào)模式。
如果您使用過解釋器,并且忘記了設(shè)置的是哪種模式,請使用以下指令:
GPIO.getmode()
設(shè)置及使用引腳
設(shè)置編號(hào)模式后,使用setup函數(shù)來將引腳分配為輸入或輸出引腳:
GPIO.setup(11, GPIO.OUT)
GPIO.setup(12, GPIO.IN)
對于輸入引腳,您通常需要設(shè)置一個(gè)上拉或下拉電阻來防止浮動(dòng)。您可以用以下方式來設(shè)置這些電阻:
GPIO.setup(12, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(12, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
要讀取輸入引腳的當(dāng)前狀態(tài),請使用:
GPIO.input(12)
您可以使用output函數(shù)來將輸出引腳設(shè)置為高電平或低電平,如下所示:
GPIO.output(11, True)
GPIO.output(11, False)
為引腳命名
如果您將引腳編號(hào)分配給描述性命名的變量,您的代碼將更具可讀性,如下所示:
redLED = 11
button = 12
GPIO.setup(redLED, GPIO.OUT)
GPIO.setup(button, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.output(redLED, True)
GPIO.input(button)
用這種代碼可以更清楚地顯示所執(zhí)行的操作,不是嗎?
您可能覺得即使不使用這些實(shí)用標(biāo)簽,項(xiàng)目也會(huì)進(jìn)行得很容易,但是最好養(yǎng)成這種習(xí)慣。當(dāng)您需要構(gòu)建更復(fù)雜的項(xiàng)目時(shí),以及暫時(shí)中止正在進(jìn)行的項(xiàng)目時(shí),或者其他人查看您的代碼的時(shí)候,這個(gè)習(xí)慣會(huì)給您帶來很大的便利。
完成后清除
如果您保留了對這些引腳的分配設(shè)置,很容易造成意外短路從而燒壞電路板。
當(dāng)腳本運(yùn)行結(jié)束或者您退出解釋器時(shí),GPIO Zero會(huì)自動(dòng)進(jìn)行重置。在RPi.GPIO中,我們使用以下函數(shù):
GPIO.cleanup()
該清除函數(shù)只會(huì)對您在RPi.GPIO中分配的引腳進(jìn)行重置,所以如果有另一個(gè)進(jìn)程正在使用其他引腳,則不會(huì)受到干擾。
您也可以重置特定的引腳,將這些引腳作為一個(gè)參數(shù)傳遞到函數(shù)中:
GPIO.cleanup(redLED)
GPIO.cleanup([redLED, button])
使用以上設(shè)置創(chuàng)建一個(gè)簡單的LED序列
對于本項(xiàng)目,您將需要:
一個(gè)帶電源的Raspberry Pi以及一個(gè)安裝了Raspbian的SD卡 installed | |
一個(gè)面包板 | |
一個(gè)GPIO擴(kuò)展板 | |
一個(gè)綠色LED, 一個(gè)紅色LED, 以及一個(gè)黃色LED |
您還需要一個(gè)可以讓您輸入指令的設(shè)備,例如SSH連接或者USB鍵盤和鼠標(biāo),幾根跨接電纜以及三個(gè)阻值在220Ω~1000Ω之間的電阻。
連接我們的紅色LED
首先,將GPIO擴(kuò)展板連接到您的Raspberry Pi GPIO接頭和面包板(如果尚未連接的話)。然后使用跨接電纜將接地引腳連接到面板板底部的負(fù)電源軌。
現(xiàn)在連接LED。D代表的是二極管,也就是說電流只能沿一個(gè)方向通過LED。
您可以識(shí)別出應(yīng)該如何連接LED,因?yàn)長ED的一個(gè)引腳比另一個(gè)稍長。較長的引腳是陽極,連接到正極,較短的是陰極,連接到負(fù)極。
在這個(gè)電路中,我們將把較長的引腳—陽極—連接到GPIO引腳,把較短的引腳—陰極—連接到負(fù)電源軌。
首先將紅色LED放在您的面包板上,距離擴(kuò)展板不遠(yuǎn)。水平放置LED引腳,使陽極更靠近擴(kuò)展板。然后將GPIO引腳(我使用的是引腳13)連接到陽極。
現(xiàn)在使用一個(gè)電阻來將陰極連接到負(fù)電源軌。使用電阻很重要,否則LED將會(huì)使用過大的電流從而燒壞您的Raspberry Pi。
測試紅色LED
首先啟動(dòng)Python解釋器,輸入:
python3
讓我們加載RPi.GPIO,并設(shè)置引腳編號(hào)模式,請記得Python對大小寫很敏感。
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
還記得之前為引腳編號(hào)提供實(shí)用名稱的建議嗎?在這里我們也這樣做。
redLED = 13
現(xiàn)在,將該引腳分配為輸出引腳,輸入以下指令:
GPIO.setup(redLED, GPIO.OUT)
如果一切連接正確,您將能夠使用以下指令來打開和關(guān)閉LED:
GPIO.output(redLED, True)
GPIO.output(redLED, False)
如果沒有正常工作,請檢查LED的連接方向是否正確,以及所有連接是否正確。也許是因?yàn)殡娮杈€接觸不良造成電路沒有接通。
連接并測試黃色和綠色LED
在紅色LED的右側(cè)放置黃色LED。以及,再次將引腳水平放置,并使陽極更靠近擴(kuò)展板。
然后將跨接電纜從GPIO引腳(我使用的是引腳16)連接到黃色LED的陽極。像之前所做的那樣,使用電阻將陰極連接到負(fù)軌。
現(xiàn)在為該引腳命名,將其分配為輸出引腳,并且測試是否可以打開和關(guān)閉LED:
yellowLED = 16
GPIO.setup(yellowLED, GPIO.OUT)
GPIO.output(yellowLED, True)
GPIO.output(yellowLED, False)
一切正常嗎?如果不是的話,請檢查LED的方向是否正確,以及所有的連接是否正確。
接下來是綠色LED。
將它并排放置在面包板上,引腳以一定的間隔水平放置,陽極靠近擴(kuò)展板。使用跨接線將陽極連接到GPIO引腳(我使用的是引腳21),然后使用一個(gè)電阻將陰極連接到負(fù)軌,接著輸入一些Python代碼:
greenLED = 21
GPIO.setup(greenLED, GPIO.OUT)
GPIO.output(greenLED, True)
GPIO.output(greenLED, False)
就是這樣!
編寫程序使LED按照順序點(diǎn)亮
為了防止運(yùn)行得太快而看不到點(diǎn)亮過程,我們將會(huì)使用sleep指令,輸入:
from time import sleep
現(xiàn)在,讓我們將所有引腳編號(hào)放入一個(gè)可以循環(huán)遍歷的元組中:
LEDs = (redLED, yellowLED, greenLED)
最后,編寫一個(gè)for循環(huán)語句來遍歷這個(gè)元組,從而打開和關(guān)閉LED。請記住Python對縮進(jìn)很敏感!
for i in range(100):
GPIO.output(LEDs[i % 3], True)
sleep(2)
GPIO.output(LEDs[i % 3], False)
再次按下回車鍵運(yùn)行該循環(huán)。
如果一切正常,您將會(huì)看到LED按照順序一個(gè)接一個(gè)亮起2秒鐘。這需要花費(fèi)幾分鐘來運(yùn)行,您也可以按ctrl+C來結(jié)束該程序。
如果您不明白該循環(huán)的工作原理,以下鏈接可能會(huì)有所幫助:
? for 循環(huán)
? range 函數(shù)
? 取模運(yùn)算(%)
清除
完成之后不要忘記清除引腳設(shè)置!輸入:
GPIO.cleanup()
您可以按ctrl+D退出解釋器。鏡像:Finished Product
這是簡單而強(qiáng)大的產(chǎn)品
您可以使用這些基本原理來完成很多事情,尤其是在加入輸入引腳之后。請繼續(xù)關(guān)注后續(xù)工作!
評論