樹莓派GPIO控制/使用的教程


一個樹莓派小白,對GPIO的使用一無所知,不斷的在網上找了很多文章看,現在找了兩篇比較好的文章,參考並記錄在這裏,供需要的人蔘考。

介紹

GPIO(General Purpose I/O Ports)意思爲通用輸入/輸出端口,通過它們可以輸出高低電平或者通過它們讀入引腳的狀態(是高電平或是低電平)。
樹莓派使用GPIO的方法有很多種,庫函數包括了wiringPi以及RPi.GPIO,這裏我主要介紹RPi.GPIO庫,這個庫是樹莓派系統自帶的。

使用說明

(一)導入庫

import RPi.GPIO as GPIO

(二)設置編碼規範

gpio.setmode(gpio.BOARD)

這裏需要解釋的是:因爲要使用GPIO口,那麼你得明確使用的是哪一個口(下面代碼中 pin 對應的就是端口號),這就引入了一個編號問題,目前存在的有三種編碼規範。
1)BOARD: 從左到右,從上到下:左邊基數,右邊偶數:1-40
2)BCM:編號側重 CPU 寄存器,根據 BCM2835 的 GPIO 寄存器編號
3)wpi: 編號側重實現邏輯,把擴展 GPIO 端口從 0 開始編號,這種編號方便編程。
通過一張圖我們就能看清楚

在這裏插入圖片描述

(三)引腳設置

# 將引腳設置爲輸入模式
GPIO.setup(pin, GPIO.IN)

# 將引腳設置爲輸出模式
GPIO.setup(pin, GPIO.OUT)

# 爲輸出的引腳設置默認值
GPIO.setup(pin, GPIO.OUT, initial=GPIO.HIGH)

(四)電平控制

GPIO.output(pin, state)

注意:狀態(state)可以設置爲低(0 / GPIO.LOW / False)或高( 1 / GPIO.HIGH / True)
也可以一次性設置多個引腳

pin_list = [11,12]
GPIO.output(pin_list, GPIO.LOW)

(五)讀取引腳的輸入狀態

GPIO.input(pin)

(六)釋放GPIO資源

GPIO.cleanup()

(七)示例代碼

import RPi.GPIO as gpio
import time

# 定義引腳,你怎麼接的怎麼改
in1 = 12
in2 = 16
# 設置GPIO口爲BOARD編號規範
gpio.setmode(gpio.BOARD)

# 設置GPIO口爲輸出
gpio.setup(in1, gpio.OUT)
gpio.setup(in2, gpio.OUT)
# 設置輸出電平
gpio.output(in1, gpio.HIGH)
gpio.output(in2, gpio.LOW)
# 秒級延遲
time.sleep(2)
# 釋放GPIO資源
gpio.cleanup()

(八)PWM設置

8.1 脈衝寬度調製(PWM)
  脈衝寬度調製(PWM)是一種高效的數字電壓控制技術,它利用微處理器的數字輸出來對模擬電路進行控制,通過控制固定電壓的直流電源開關頻率,改變負載兩端的電壓,進而達到控制要求的一種電壓調整方法。爲更好的理解和使用PWM,我們首先需要了解以下兩個概念。

頻率

頻率以Hz爲單位,一個脈衝信號時間週期的倒數。如果PWM的輸出頻率比較低,例如只有5Hz,那麼在控制一個LED時候,LED就會一閃一閃的,較高的頻率可以讓運行更爲平滑,但PWM的輸出頻率並不能無限的高,而且在高頻情況下,測定的PWM頻率會與作爲樹莓派參數提供的頻率略有出入。因此,在使用PWM時,應該選擇一個合適的頻率,對於控制一個LED亮度來說,一般100Hz就足夠了。

佔空比

佔空比就是輸出的PWM脈衝信號中,高電平保持的時間與該PWM的時鐘週期的時間之比,如圖6.1所示,佔空比=t1/T=t1/(t1+t2)。假設PWM脈衝的頻率爲1000Hz,那麼它的時鐘週期T就是1ms(即1000us),如果高電平持續時間t1爲200us,低電平的時間t2爲800us,那麼佔空比就是200:1000(即1:5)。
  在這裏插入圖片描述
  從應用的角度,我們可以簡單的將PWM理解爲通過改變脈衝信號的頻率和高電平的持續時間(或佔空比)來實現電壓控控制的一種方法。圖6.2顯示了三個由GPIO輸出的PWM信號(電壓爲3.3V),第一個信號是一個佔空比爲20%的PWM輸出,即在信號週期中,20%的時間爲高電平(邏輯1),其餘80%的時間爲低電平(邏輯0),對應的電壓爲滿幅值的20%(0.66V)。第二、三個信號分別是佔空比爲50%和80%的PWM輸出,對應的電壓分別爲1.65V和2.64V。
  在這裏插入圖片描述
8.2 樹莓派操控PWM
在樹莓派上,可以通過對GPIO的編程來實現PWM,RPi.GPIO庫就提供了一個PWM功能,以下是使用RPi.GPIO庫的PWM功能的方法。
創建一個PWM實例

pwm = GPIO.PWM(channel, frequency)  

channel:指定要輸出PWM信號的GPIO引腳;
frequency:指定PWM信號的初始頻率,單位爲Hz,其值應大於0.0。
啓用PWM

pwm.start(dc)  

dc:指定PWM信號的初始佔空比,取值範圍爲0.0 ≤ dc ≤ 100.0。
更改PWM頻率

pwm.ChangeFrequency(freq) 

freq:指定PWM的新頻率,單位爲Hz,其值應大於0.0。
更改PWM佔空比

pwm.ChangeDutyCycle(dc)  

dc:指定PWM的新佔空比,取值範圍爲0.0 ≤ dc ≤ 100.0。

8.3 PWM驗證實驗
接下來,我們將用一個具體的例子來演示樹莓派是如何使用PWM的。在這個實驗裏,您將可以手動改變LED的亮度,一方面我們將盡可能用上RPi.GPIO庫中PWM的相關函數,讓您更好了解這些函數的使用,另一方面讓您更爲直觀的理解PWM的基本原理。

import RPi.GPIO as GPIO                 # 引入GPIO模塊

if __name__ == '__main__':
    LedPin = 19
    freq = 100                          # 存放PWM頻率變量,這裏初始值爲100,可以根據實際需要修改
    dc = 0                              # 存放PWM佔空比變量,這裏初始值爲0,可以根據實際需要修改

    GPIO.setmode(GPIO.BCM)              # 使用BCM編號方式
    GPIO.setup(LedPin, GPIO.OUT)        # 將GPIO19設置爲輸出模式

    pwm = GPIO.PWM(LedPin, freq)        # 創建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資源

程序運行後,首先會要求您輸入PWM頻率(建議輸入的值在1到2000之間),然後您可以通過不斷的輸入新的PWM佔空比來改變LED的狀態。例如,您可以輸入一個100Hz的PWM頻率,然後分別輸入10、30、50、80、100的PWM佔空比,您將看到LED會一次比一次亮;當您輸入的PWM頻率爲5時,LED會不斷的閃爍,輸入不同的佔空比只會改變LED點亮的時間長度,而亮度基本不變,當佔空比爲100時,LED長亮。

參考鏈接1:
https://www.jianshu.com/p/449682146501
來源:簡書
參考鏈接2:https://blog.csdn.net/yzy_1996/article/details/83756357
來源CSDN

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