樹莓派硬件編程——(一)用RPi.GPIO庫輸出信號

一、認識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庫,這是血淚教訓,因爲我想試驗命令安裝,然後把庫給卸載了,命令應該沒有錯,但是可能現實其他依賴會有問題,所以,沒事別瞎試;

三、引腳編號

我們通過上圖可以看見,我們可以通過三種編碼模式對樹莓派引腳進行控制,那麼這三種編碼分別是什麼意思呢?

  1. wiringPi編碼:這是在C++進行開發時所使用的編碼,這邊不做重點講解;
  2. BCM編碼:任何一個開發板想要進行控制,肯定會有一個主控芯片,那麼這個芯片就會有很多引腳,不同的引腳就有不同的功能,我們這裏引出的是40Pin,但是一般來講這個芯片是多於40個的,多出的引腳就要負責其他零部件的控制等等;那麼,BCM編碼我們可以理解成是主控芯片的引腳編號,直接通過主控芯片來進行控制當然是沒有問題的。但是這裏就有一個問題,樹莓派每個版本不一樣,或者升級之後,不能夠保證主控芯片不變,所以當樹莓派進行升級之後,以前的程序可能就不能用了,所以我們一般不用BCM編碼;
  3. BOARD編碼:這個就很好理解了,我們拿着樹莓派,從上到下這麼數過去,就是BOARD編碼,我們也叫它物理引腳;
    那麼BOARD編碼和BCM編碼有什麼聯繫呢?這麼來說吧,物理引腳和主控芯片的功能引腳一一對應,也就是說它始終和功能對應,所以當芯片升級或者其他原因,我們之前所寫的代碼都是可用的,這樣就可以保證極好的兼容性。
    那麼物理引腳是連到哪的呢?整個板子是由主控芯片控制的呀,物理引腳肯定也是和芯片引腳相連呀。

總結:我們一般使用python進行硬件開發的時候,最好使用BOARD編碼,這樣可以保證其兼容性。

四、使用RPi.GPIO庫控制LED燈閃爍

  1. 導入RPi.GPIO庫
    import RPi.GPIO as GPIO
  2. 指定編碼模式
    GPIO.setmode(GPIO.BOARD)
    # GPIO.setmode(GPIO.BCM)
  3. 設置引腳功能
    GPIO.setup(引腳編碼,引腳功能,initial=GPIO.HIGH)

    引腳編號:這個就是根據不同的編碼模式,配置其引腳編號

    pin_list = [15,16]
    GPIO.setup(pin_list,GPIO.OUT)    # 我們可以通過列表的方式,批量對引腳模式進行設置

    引腳功能:我們可以將引腳配置成輸出(GPIO.OUT)模式,輸入後面再講
    initial=GPIO.HIGH:這個表示其引腳的初始狀態爲高電平狀態,我們可以通過這麼參數設置引腳的初始狀態,且參數只有在輸出模式纔有

  4. 輸出高電平
    GPIO.output(引腳編號,狀態)

    引腳編號: 同上
    狀態:這裏其實就是一個邏輯值,我們可以用True/False或者用1/0或者用GPIO.HIGH/GPIO.LOW

  5. 清理引腳
    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燈的亮暗,直流電機的轉速、舵機的角度、無源蜂鳴器的頻率等等都可以控制,一句話總結:脈寬調製就是用數字信號來實現模擬信號輸出的一種技術。

  1. 庫導入、引腳編碼、引腳功能設置等是常規操作
    import RPi.GPIO as GPIO
    import time
    
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(16,GPIO.OUT)
  2. 劃重點,創建一個PWM對象
    p = GPIO.PWM(16,50)    # 創建一個PWM對象
    p.start(0)             # 啓動PWM,初始值爲0

    GPIO.PWM(引腳編號,頻率): 這裏的頻率是指單位時間內變化的次數,即頻率越高,亮暗過渡就越平滑

    上面從左到右,頻率分別是:10、20、50,大家可以對比他們的效果,區別還是比較明顯的;

  3. 實現效果
    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的佔空比,其實這裏我們可以理解成百分比,給他多少能量,他就可以發出多大的亮光;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章