一個樹莓派小白,對GPIO的使用一無所知,不斷的在網(wǎng)上找了很多文章看,現(xiàn)在找了兩篇比較好的文章,參考并記錄在這里,供需要的人參考。介紹GPIO(General Purpose I/O Ports)意思為通用輸入/輸出端口,通過它們可以輸出高低電平或者通過它們讀入引腳的狀態(tài)(是高電平或是低電平)。 樹莓派使用GPIO的方法有很多種,庫函數(shù)包括了wiringPi以及RPi.GPIO,這里我主要介紹RPi.GPIO庫,這個庫是樹莓派系統(tǒng)自帶的。 使用說明(一)導(dǎo)入庫(二)設(shè)置編碼規(guī)范gpio.setmode(gpio.BOARD) 這里需要解釋的是:因為要使用GPIO口,那么你得明確使用的是哪一個口(下面代碼中 pin 對應(yīng)的就是端口號),這就引入了一個編號問題,目前存在的有三種編碼規(guī)范。 1)BOARD: 從左到右,從上到下:左邊基數(shù),右邊偶數(shù):1-40 2)BCM:編號側(cè)重 CPU 寄存器,根據(jù) BCM2835 的 GPIO 寄存器編號 3)wpi: 編號側(cè)重實現(xiàn)邏輯,把擴展 GPIO 端口從 0 開始編號,這種編號方便編程。 通過一張圖我們就能看清楚 
(三)引腳設(shè)置# 將引腳設(shè)置為輸入模式GPIO.setup(pin, GPIO.IN)# 將引腳設(shè)置為輸出模式GPIO.setup(pin, GPIO.OUT)# 為輸出的引腳設(shè)置默認值GPIO.setup(pin, GPIO.OUT, initial=GPIO.HIGH) (四)電平控制GPIO.output(pin, state) 注意:狀態(tài)(state)可以設(shè)置為低(0 / GPIO.LOW / False)或高( 1 / GPIO.HIGH / True) 也可以一次性設(shè)置多個引腳 pin_list = [11,12]GPIO.output(pin_list, GPIO.LOW) (五)讀取引腳的輸入狀態(tài)GPIO.input(pin) (六)釋放GPIO資源(七)示例代碼import RPi.GPIO as gpioimport time# 定義引腳,你怎么接的怎么改in1 = 12in2 = 16# 設(shè)置GPIO口為BOARD編號規(guī)范gpio.setmode(gpio.BOARD)# 設(shè)置GPIO口為輸出gpio.setup(in1, gpio.OUT)gpio.setup(in2, gpio.OUT)# 設(shè)置輸出電平gpio.output(in1, gpio.HIGH)gpio.output(in2, gpio.LOW)# 秒級延遲time.sleep(2)# 釋放GPIO資源gpio.cleanup()123456789101112131415161718123456789101112131415161718 (八)PWM設(shè)置8.1 脈沖寬度調(diào)制(PWM) 脈沖寬度調(diào)制(PWM)是一種高效的數(shù)字電壓控制技術(shù),它利用微處理器的數(shù)字輸出來對模擬電路進行控制,通過控制固定電壓的直流電源開關(guān)頻率,改變負載兩端的電壓,進而達到控制要求的一種電壓調(diào)整方法。為更好的理解和使用PWM,我們首先需要了解以下兩個概念。 頻率 頻率以Hz為單位,一個脈沖信號時間周期的倒數(shù)。如果PWM的輸出頻率比較低,例如只有5Hz,那么在控制一個LED時候,LED就會一閃一閃的,較高的頻率可以讓運行更為平滑,但PWM的輸出頻率并不能無限的高,而且在高頻情況下,測定的PWM頻率會與作為樹莓派參數(shù)提供的頻率略有出入。因此,在使用PWM時,應(yīng)該選擇一個合適的頻率,對于控制一個LED亮度來說,一般100Hz就足夠了。 占空比 占空比就是輸出的PWM脈沖信號中,高電平保持的時間與該PWM的時鐘周期的時間之比,如圖6.1所示,占空比=t1/T=t1/(t1+t2)。假設(shè)PWM脈沖的頻率為1000Hz,那么它的時鐘周期T就是1ms(即1000us),如果高電平持續(xù)時間t1為200us,低電平的時間t2為800us,那么占空比就是200:1000(即1:5)。  從應(yīng)用的角度,我們可以簡單的將PWM理解為通過改變脈沖信號的頻率和高電平的持續(xù)時間(或占空比)來實現(xiàn)電壓控控制的一種方法。圖6.2顯示了三個由GPIO輸出的PWM信號(電壓為3.3V),第一個信號是一個占空比為20%的PWM輸出,即在信號周期中,20%的時間為高電平(邏輯1),其余80%的時間為低電平(邏輯0),對應(yīng)的電壓為滿幅值的20%(0.66V)。第二、三個信號分別是占空比為50%和80%的PWM輸出,對應(yīng)的電壓分別為1.65V和2.64V。  8.2 樹莓派操控PWM 在樹莓派上,可以通過對GPIO的編程來實現(xiàn)PWM,RPi.GPIO庫就提供了一個PWM功能,以下是使用RPi.GPIO庫的PWM功能的方法。 創(chuàng)建一個PWM實例 pwm = GPIO.PWM(channel, frequency) channel:指定要輸出PWM信號的GPIO引腳; frequency:指定PWM信號的初始頻率,單位為Hz,其值應(yīng)大于0.0。 啟用PWM pwm.start(dc) dc:指定PWM信號的初始占空比,取值范圍為0.0 ≤ dc ≤ 100.0。 更改PWM頻率 pwm.ChangeFrequency(freq) freq:指定PWM的新頻率,單位為Hz,其值應(yīng)大于0.0。 更改PWM占空比 pwm.ChangeDutyCycle(dc) dc:指定PWM的新占空比,取值范圍為0.0 ≤ dc ≤ 100.0。 8.3 PWM驗證實驗 接下來,我們將用一個具體的例子來演示樹莓派是如何使用PWM的。在這個實驗里,您將可以手動改變LED的亮度,一方面我們將盡可能用上RPi.GPIO庫中PWM的相關(guān)函數(shù),讓您更好了解這些函數(shù)的使用,另一方面讓您更為直觀的理解PWM的基本原理。 import RPi.GPIO as GPIO # 引入GPIO模塊if __name__ == '__main__': LedPin = 19 freq = 100 # 存放PWM頻率變量,這里初始值為100,可以根據(jù)實際需要修改 dc = 0 # 存放PWM占空比變量,這里初始值為0,可以根據(jù)實際需要修改 GPIO.setmode(GPIO.BCM) # 使用BCM編號方式 GPIO.setup(LedPin, GPIO.OUT) # 將GPIO19設(shè)置為輸出模式 pwm = GPIO.PWM(LedPin, freq) # 創(chuàng)建PWM對象,并指定初始頻率 pwm.start(dc) # 啟動PWM,并指定初始占空比 try: freq = int(input('Please input the frequency of PWM(1-2000Hz): ')) # 等待輸入新PWM頻率 pwm.ChangeFrequency(freq) # 改變PWM頻率 while True: dc = int(input('Please input the duty cycle(0-100): ')) # 等待輸入新PWM占空比 pwm.ChangeDutyCycle(dc) # 改變PWM占空比 finally: pwm.stop() # 停止PWM GPIO.cleanup() # 清理釋放GPIO資源 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
程序運行后,首先會要求您輸入PWM頻率(建議輸入的值在1到2000之間),然后您可以通過不斷的輸入新的PWM占空比來改變LED的狀態(tài)。例如,您可以輸入一個100Hz的PWM頻率,然后分別輸入10、30、50、80、100的PWM占空比,您將看到LED會一次比一次亮;當(dāng)您輸入的PWM頻率為5時,LED會不斷的閃爍,輸入不同的占空比只會改變LED點亮的時間長度,而亮度基本不變,當(dāng)占空比為100時,LED長亮。 參考鏈接1: https://www.jianshu.com/p/449682146501 來源:簡書 參考鏈接2:https://blog.csdn.net/yzy_1996/article/details/83756357 來源CSDN
|