一、認識RPi.GPIO庫
樹莓派硬件編程不僅可以用Python進行開發,也可以用C++進行開發,那麼想要對硬件進行控制,就需要了解樹莓派的電路設計和芯片的控制規則,只有知道了這些,我們才能驅動我們的樹莓派。那麼RPi.GPIO庫就是Python對樹莓派的控制庫,它提供了很多函數可以讓我們獲取引腳信息、與外部設備進行數據交互等等,所以RPi.GPIO是我們硬件編程非常重要的工具。
二、如何下載安裝RPi.GPIO庫
一般來講,樹莓派官方鏡像已經默認安裝了RPi.GPIO庫的,我們可以用 pip3 list 來查看一下已安裝庫列表
如果沒有安裝的話,那麼我們可以通過 pip3 install rpi.gpio 來對其進行安裝,或者 apt-get install python3-rpi.gpio 進行安裝;
這邊友情提醒,不要好好的去卸載RPi.GPIO庫,這是血淚教訓,因爲我想試驗命令安裝,然後把庫給卸載了,命令應該沒有錯,但是可能現實其他依賴會有問題,所以,沒事別瞎試;
三、引腳編號
我們通過上圖可以看見,我們可以通過三種編碼模式對樹莓派引腳進行控制,那麼這三種編碼分別是什麼意思呢?
- wiringPi編碼:這是在C++進行開發時所使用的編碼,這邊不做重點講解;
- BCM編碼:任何一個開發板想要進行控制,肯定會有一個主控芯片,那麼這個芯片就會有很多引腳,不同的引腳就有不同的功能,我們這裏引出的是40Pin,但是一般來講這個芯片是多於40個的,多出的引腳就要負責其他零部件的控制等等;那麼,BCM編碼我們可以理解成是主控芯片的引腳編號,直接通過主控芯片來進行控制當然是沒有問題的。但是這裏就有一個問題,樹莓派每個版本不一樣,或者升級之後,不能夠保證主控芯片不變,所以當樹莓派進行升級之後,以前的程序可能就不能用了,所以我們一般不用BCM編碼;
- BOARD編碼:這個就很好理解了,我們拿着樹莓派,從上到下這麼數過去,就是BOARD編碼,我們也叫它物理引腳;
那麼BOARD編碼和BCM編碼有什麼聯繫呢?這麼來說吧,物理引腳和主控芯片的功能引腳一一對應,也就是說它始終和功能對應,所以當芯片升級或者其他原因,我們之前所寫的代碼都是可用的,這樣就可以保證極好的兼容性。
那麼物理引腳是連到哪的呢?整個板子是由主控芯片控制的呀,物理引腳肯定也是和芯片引腳相連呀。
總結:我們一般使用python進行硬件開發的時候,最好使用BOARD編碼,這樣可以保證其兼容性。
四、使用RPi.GPIO庫控制LED燈閃爍
- 導入RPi.GPIO庫
import RPi.GPIO as GPIO
- 指定編碼模式
GPIO.setmode(GPIO.BOARD) # GPIO.setmode(GPIO.BCM)
- 設置引腳功能
GPIO.setup(引腳編碼,引腳功能,initial=GPIO.HIGH)
引腳編號:這個就是根據不同的編碼模式,配置其引腳編號
pin_list = [15,16] GPIO.setup(pin_list,GPIO.OUT) # 我們可以通過列表的方式,批量對引腳模式進行設置
引腳功能:我們可以將引腳配置成輸出(GPIO.OUT)模式,輸入後面再講
initial=GPIO.HIGH:這個表示其引腳的初始狀態爲高電平狀態,我們可以通過這麼參數設置引腳的初始狀態,且參數只有在輸出模式纔有 - 輸出高電平
GPIO.output(引腳編號,狀態)
引腳編號: 同上
狀態:這裏其實就是一個邏輯值,我們可以用True/False或者用1/0或者用GPIO.HIGH/GPIO.LOW - 清理引腳
GPIO.cleanup()
這裏爲什麼需要清理引腳呢?這是因爲我們在結束程序的時候,我們要將所有的引腳恢復成初始的狀態,一般來講爲輸入模式,這是要避免短路造成設備的損壞。
OK,下面我們就舉個LED燈閃爍的栗子:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setup(16,GPIO.OUT)
try:
while True:
GPIO.output(16,GPIO.HIGH)
time.sleep(1)
GPIO.output(16,GPIO.LOW)
time.sleep(1)
except KeyboardInterrupt: # 異常處理,如果Ctrl+C退出程序
GPIO.output(16,GPIO.LOW)
GPIO.cleanup()
五、使用RPi.GPIOk庫實現呼吸燈效果
對於什麼是呼吸燈,呼吸燈是怎麼實現的,我的另一篇文章(炫酷LED呼吸燈)應該講的比較清楚了,這裏就不做贅述;
那麼這邊我們使用的還是PWM脈寬調製來實現LED燈的呼吸燈效果,PWM的實質就是控制高低電平的時間比,單位時間內,高電平比例越高,那麼LED燈工作的時間就越長,也就越亮。PWM不僅可以控制LED燈的亮暗,直流電機的轉速、舵機的角度、無源蜂鳴器的頻率等等都可以控制,一句話總結:脈寬調製就是用數字信號來實現模擬信號輸出的一種技術。
- 庫導入、引腳編碼、引腳功能設置等是常規操作
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BOARD) GPIO.setup(16,GPIO.OUT)
- 劃重點,創建一個PWM對象
p = GPIO.PWM(16,50) # 創建一個PWM對象 p.start(0) # 啓動PWM,初始值爲0
GPIO.PWM(引腳編號,頻率): 這裏的頻率是指單位時間內變化的次數,即頻率越高,亮暗過渡就越平滑
上面從左到右,頻率分別是:10、20、50,大家可以對比他們的效果,區別還是比較明顯的; - 實現效果
try: while 1: for i in range(0,100,5): p.ChangeDutyCycle(i) time.sleep(0.05) for i in range(100,0,-5): p.ChangeDutyCycle(i) time.sleep(0.05) except KeyboardInterrupt: p.ChangeDutyCycle(0) GPIO.cleanup()
我們可以用 ChangeDutyCycle([0,100]) 來控制PWM的佔空比,其實這裏我們可以理解成百分比,給他多少能量,他就可以發出多大的亮光;