天天看點

樹莓派(一)python接口RPi.GPIO介紹導入 RPi.GPIO 子產品:引腳編号設定channel設定多個通道擷取輸入設定輸出輸出到多個通道清理RPi 闆資訊和 RPi.GPIO 版本一個完整的例子

樹莓派(一)python接口RPi.GPIO介紹導入 RPi.GPIO 子產品:引腳編号設定channel設定多個通道擷取輸入設定輸出輸出到多個通道清理RPi 闆資訊和 RPi.GPIO 版本一個完整的例子

目錄

導入 RPi.GPIO 子產品:

引腳編号

設定channel

設定多個通道

擷取輸入

設定輸出

輸出到多個通道

清理

RPi 闆資訊和 RPi.GPIO 版本

導入 RPi.GPIO 子產品:

try:
    import RPi.GPIO as GPIO
except RuntimeError:
    print("Error importing RPi.GPIO!  This is probably because you need superuser privileges.  You can achieve this by using 'sudo' to run your script")
           

通過這種方式,您可以在腳本的其餘部分将其稱為 GPIO。

引腳編号

樹莓派(一)python接口RPi.GPIO介紹導入 RPi.GPIO 子產品:引腳編号設定channel設定多個通道擷取輸入設定輸出輸出到多個通道清理RPi 闆資訊和 RPi.GPIO 版本一個完整的例子

有兩種方法可以在 RPi.GPIO 中對 Raspberry Pi 上的 IO 引腳進行編号。首先是使用 BOARD 編号系統。這是指 Raspberry Pi 闆的 P1 接頭上的引腳編号。使用這種編号系統的優勢在于,無論 RPi 的電路闆版本如何,您的硬體都将始終工作。您無需更改代碼。

第二個編号系統是 BCM 編号。這是一種較低級别的工作方式 - 它指的是 Broadcom SOC 上的通道号。您必須始終使用圖表,說明哪個通道号連接配接到 RPi 闆上的哪個引腳。您的腳本可能會在 Raspberry Pi 闆的修訂之間中斷。

樹莓派(一)python接口RPi.GPIO介紹導入 RPi.GPIO 子產品:引腳編号設定channel設定多個通道擷取輸入設定輸出輸出到多個通道清理RPi 闆資訊和 RPi.GPIO 版本一個完整的例子
GPIO.setmode(GPIO.BOARD) # 或者 GPIO.setmode(GPIO.BCM)

要檢測已設定的引腳編号系統(例如,通過另一個 Python 子產品):

模式 = GPIO.getmode() 模式将為 GPIO.BOARD、GPIO.BCM 或無

警告
您的 Raspberry Pi 的 GPIO 上可能有多個腳本/電路。是以,如果 RPi.GPIO 檢測到引腳已配置為預設值(輸入)以外的内容,則在嘗試配置腳本時會收到警告。要禁用這些警告:
GPIO.setwarnings(False)

設定channel

您需要将您使用的每個通道設定為輸入或輸出。要将通道配置為輸入:

GPIO.setup(channel,GPIO.IN)

(其中通道是基于您指定的編号系統(BOARD 或 BCM)的通道号)。

要将通道設定為輸出:

GPIO.setup(channel,GPIO.OUT)

(其中通道是基于您指定的編号系統(BOARD 或 BCM)的通道号)。

您還可以為輸出通道指定初始值:

GPIO.setup(通道,GPIO.OUT,初始=GPIO.HIGH)

設定多個通道

您可以為每次通話設定多個頻道(從 0.5.8 版本開始)。例如:

chan_list = [11,12] # 添加任意數量的頻道!

# 你可以用元組代替,即:

# chan_list = (11,12)

GPIO.setup(chan_list, GPIO.OUT)

擷取輸入

要讀取 GPIO 引腳的值:

GPIO.input(channel)

(其中通道是基于您指定的編号系統(BOARD 或 BCM)的通道号)。這将傳回 0 / GPIO.LOW / False 或 1 / GPIO.HIGH / True。

設定輸出

設定 GPIO 引腳的輸出狀态:

GPIO.output(channel, state)

(其中通道是基于您指定的編号系統(BOARD 或 BCM)的通道号)。

狀态可以是 0 / GPIO.LOW / False 或 1 / GPIO.HIGH / True。

輸出到多個通道

您可以在同一個調用中輸出到多個通道(從 0.5.8 版本開始)。例如:

chan_list = [11,12] # 也适用于元組

GPIO.output(chan_list, GPIO.LOW) # 将所有設定為 GPIO.LOW

GPIO.output(chan_list, (GPIO.HIGH, GPIO.LOW)) # 設定第一個 HIGH 和第二個 LOW

清理

在任何程式的最後,清理您可能使用過的任何資源都是一個好習慣。這與 RPi.GPIO 沒有什麼不同。通過将您使用過的所有通道傳回到輸入而不上拉/下拉,您可以通過短接引腳來避免意外損壞您的 RPi。請注意,這隻會清理腳本使用的 GPIO 通道。請注意,GPIO.cleanup() 還會清除正在使用的引腳編号系統。

在腳本結束時進行清理:

GPIO.cleanup()

當您的程式退出時,可能不想清理每個通道而留下一些設定。您可以清理單個頻道、頻道清單或頻道元組:

GPIO.cleanup(channel1)

GPIO.cleanup((channel1,channel2))

GPIO.cleanup([channel1,channel2])

RPi 闆資訊和 RPi.GPIO 版本

要發現有關您的 RPi 的資訊:

GPIO.RPI_INFO

要發現 Raspberry Pi 闆修訂版:

GPIO.RPI_INFO['P1_REVISION']

一個完整的例子

下面代碼控制蜂鳴器發出聲音,其中用到的PWM功能會在後面文章講解

import time
import random
try:
    import RPi.GPIO as GPIO
except RuntimeError:
    print("Error importing RPi.GPIO!  This is probably because you need superuser privileges.  You can achieve this by using 'sudo' to run your script")

# GPIO.setwarning(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(32, GPIO.OUT)
# use 
p = GPIO.PWM(32, 300)
p.start(1)
# input('Press return to stop:')   # use raw_input for Python 2

try:
  while True:
    for dc in range(0, 101, 5):
      p.ChangeFrequency(random.randrange(300, 2000))
      p.ChangeDutyCycle(dc)
      time.sleep(0.5 * random.random())
except KeyboardInterrupt:
  pass
p.stop()
GPIO.cleanup()