使用GPIO Zero讓GPIO變得更容易

為兒童和年輕人開發的用於GPIO控制的簡單Python程式庫

如果您有過為Raspberry Pi的GPIO 引腳編寫代碼的經驗,那麼估計您已經使用過Python以及GPIO Zero模組了,因為這是最簡單的入門方式。
但是模組的簡單不意味著其缺乏靈活性和功能性。

GPIO Zero 完成所有工作細節的處理

GPIO Zero並不是之前Raspberry Pi上用於GPIO的Python模組的替代品,而是構建在那些模組之上。
GPIO使用RPi.GPIO來進行大多數操作,同時會混合使用PiGPIO和RPIO。

為什麼不直接使用這些模組?

因為GPIO Zero已經為您完成了很多工作細節的處理,您在專案中只需輸入幾行代碼就可以了。
來看一下這些代碼:
pir = MotionSensor(4)
pir.when_motion = myFunction

第一個指令表示引腳4上有一個運動感測器,第二個指令設置了一個在感測器產生脈衝信號時運行的函數。真的很簡單,對吧?

它是物件導向的

GPIO Zero透過為您可能連接到GPIO引腳的常見元件提供一系列配置好的類來進行工作。您可以使用這些類來創建與連接到GPIO引腳的特定元件相關聯的物件。
您在剛開始最感興趣的類應該是輸入類和輸出類,它們包括了一系列標準輸入和輸出元件。
除此之外還有其他多種類,比如用於將資料資料流到其他元件的SPI類,以及您可以用來創建自己的類的基類和通用類。暫時不用為這些類的使用擔心,目前您只要知道有這些類存在就可以了。

安裝和導入GPIO Zero

GPIO Zero已經安裝在了標準Raspbian映射上。如果您使用的是Raspbian Lite,或者更特別的Linux,那麼您需要對其進行安裝。
您可以使用以下指令將整個模組導入到Python中:
import gpiozero

然後,您可以透過在類前加上“gpiozero”來對其進行引用,如下所示:
button = gpiozero.Button(11)
greenLED = gpiozero.LED(13)
pir = gpiozero.MotionSensor(15)

只導入您正在使用的特定元件所需要的類會更方便一些:
from gpiozero import Button, LED, MotionSensor

這樣,您就可以在不帶首碼的情況下對其進行引用了,如下所示:
button = Button(11)
greenLED = LED(13)
pir = MotionSensor(15)

如此一來,您的代碼就不會因為冗餘資訊而變得雜亂無章,從而變得更具有可讀性。

使用GPIO Zero,按下按鈕播放聲音

讓我們透過將按鈕連接到GPIO引腳來嘗試在壓電蜂鳴器上播放一系列聲音,感受一下GPIO Zero的使用有多麼簡單。
為此,您將需要:

一個帶電源的Raspberry Pi以及一個安裝了Raspbian的SD卡 raspberry pi
一個麵包板 breadboard
一個GPIO擴展板 gpio extension

您還需要一個壓電蜂鳴器下推式開關、幾根跨接電纜以及某種Raspberry Pi的輸入裝置,例如SSH連接或者USB鍵盤和滑鼠。準備好了嗎?讓我們開始吧!

連接壓電蜂鳴器

如果您的GPIO擴展板尚未連接到Raspberry Pi和麵包板,請將它們連接在一起。然後將接地引腳連接到負電源軌。
您的壓電蜂鳴器應該有一根紅線和一根黑線。紅線連接到來自GPIO引腳的正電壓,黑線接地。

我使用跨接電纜將蜂鳴器連接到麵包板,您也可以直接將其插入。將蜂鳴器的黑色導線連接到負電源軌,紅色導線連接到麵包板中間的某處。
現在,將麵包板的這一排連接到GPIO引腳。我使用的是引腳13。

讓這個小元件發出尖叫聲

為此,需要打開Python解譯器。輸入:
python3

現在,我們需要為壓電蜂鳴器導入一個類,並使用它來創建一個物件。實際上有兩個類:Buzzer,只發出簡單的嗶嗶聲;以及TonalBuzzer,可以讓您改變音調。
我們將要播放幾種不同的音調,因此需要導入TonalBuzzer並將其設置為引腳13。
from gpiozero import TonalBuzzer
piezo = TonalBuzzer(13)

如果所有連接都正確,當您輸入以下內容時將會發出尖銳的聲音:
piezo.play(‘A4’)

如果所有連接都正確,當您輸入以下內容時將會發出尖銳的聲音:
piezo.stop()

您也可以播放其他音調的聲音!請嘗試以下指令:
piezo.play(‘C4’)
piezo.play(‘D4’)
piezo.play(‘E4’)

編寫播放一系列聲音的程式

現在讓我們把所有的指令放入同一個函數中,從而實現以不同的音調發出嗶嗶聲。我們將在一開始從time模組中導入sleep函數,這樣就可以避免播放過快而錯過了某個聲音。

from time import sleep

現在讓我們來定義一個簡單的函數,該函數的功能是播放特定音調的蜂鳴聲一秒鐘。請記住Python對縮進很敏感。
def playTone(pitch):
piezo.play(pitch)
sleep(1)
piezo.stop()

再次按回車鍵,讓Python知道您已經完成了函數的編寫。檢查一下是否工作正常也是個不錯的主意。
playTone(‘A4’)
playTone(‘C4’)

每個指令運行後應會各自發出不同音調的嗶嗶聲。如果不是的話,請檢查輸入的內容是否正確。
現在我們可以定義另外一個便捷的函數,該函數的功能是以不同的音調播放三次嗶嗶聲。
def playTones():
playTone(‘A4’)
playTone(‘D4’)
playTone(‘E4’)

再次按下回車鍵完成該函數,然後檢查是否工作正常。
playTones()

一切正常嗎?太棒了。

與按鈕連接

剩下的工作就是連接一個按鈕並進行程式設計,以使其能夠控制聲音的播放。
將按鈕放置在麵包板上,並跨越中心溝槽。
然後使用跨接電纜將按鈕的一個角連接到負電源軌,對角線相對的角連接到GPIO引腳,我使用的是引腳12。
現在,我們導入GPIO Zero中的Button類,並將其設置為引腳12:
from gpiozero import Button
button = Button(12)

接下來要做的就是使程式在按下按鈕時運行我們的函數。
button.when_pressed = playTones

現在按下按鈕。如果所有操作正確,此時將會播放聲音。
GPIO Zero 讓一切變得簡單
是不是很簡單?我們只用了三行代碼就配置了按鈕。
雖然表面看上去很簡單,但其實其中涉及了很多內容:上拉和下拉電阻以及高電平有效和低電平有效信號。不同的音調是使用一種被稱為“脈衝寬度調製”的技術生成的,其中引腳透過在啟動和關閉之間快速轉換來模仿類比電壓。GPIO Zero已經完成了所有這些工作的預配置。
當您掌握了基本要領後,就可以開始嘗試進行所有這些內容了。
與此同時,敬請享受透過GPIO Zero構建和學習專案的樂趣吧!