樹莓派GPIO使用手冊

RPI.GPIO 使用手冊

1 導(dǎo)入模塊
import RPi.GPIO as GPIO

通撑枪颍可以try catch該導(dǎo)入語句來檢查導(dǎo)入是否成功

2 引腳號

RPi.GPIO中揪阿,有兩種方法可以對Raspberry Pi上的IO引腳進(jìn)行編號。第一種是使用BOARD編號系統(tǒng)包警。這是指Raspberry Pi板上P1接頭上的引腳號。使用這種編號系統(tǒng)的優(yōu)點(diǎn)是底靠,無論樹莓派的電路板版本如何害晦,您的硬件都能正常工作。你不需要重新連接你的連接器或更改你的代碼暑中。

第二個編號系統(tǒng)是BCM號碼壹瘟。這是一種較低級別的工作方式 - 它指的是Broadcom SOC上的通道號碼。您必須始終使用那個通道編號所對應(yīng)的樹莓派板上哪個引腳的圖表鳄逾。您的腳本程序可能會在Raspberry Pi板的硬件修訂后而不能使用稻轨。

要指定您使用引腳編號方式:

GPIO.setmode(GPIO.BOARD)
  # or
GPIO.setmode(GPIO.BCM)

通過mode = GPIO.getmode()可以檢查設(shè)置的引腳編號方式

3警告
您可能在Raspberry PiGPIO上有多個腳本/電路。因此雕凹,如果RPi.GPIO檢測到引腳已被配置為默認(rèn)(輸入)以外的其他引腳殴俱,則在嘗試配置腳本時會收到警告。要禁用這些警告:

GPIO.setwarnings(False)

4枚抵、設(shè)置一個通道
您需要設(shè)置您用作輸入或輸出的每個通道线欲。將通道配置為輸入:

GPIO.setup(channel, GPIO.IN)

(其中通道是基于您指定的編號系統(tǒng)(BOARDBCM)的通道編號)。

有關(guān)設(shè)置輸入通道的更多高級信息可以在這里找到汽摹。

要將通道設(shè)置為輸出:

GPIO.setup(channel, GPIO.OUT)

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

GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH)

4李丰、設(shè)置多個頻道
您可以一次設(shè)置多個通道(從0.5.8開始)。例如:

chan_list  =  [ 11 逼泣,12 ]     #加你想盡可能多的渠道趴泌!
                       #你可以用元組代替舟舒,即:
                       #chan_list =(11,12)
GPIO.setup(chan_list, GPIO.OUT)

輸入
讀取GPIO引腳的值:

GPIO.input(channel)
  ( 其中通道是基于您指定的編號系統(tǒng)(BOARD或BCM)的通道編號)。這將返回0 / GPIO.LOW / False或1 / GPIO.HIGH / True嗜憔。

有幾種方法可以將GPIO輸入到您的程序中秃励。第一種也是最簡單的方法是在某個時間點(diǎn)檢查輸入值。這就是所謂的“輪詢”吉捶,如果你的程序在錯誤的時間讀取了值莺治,可能會錯過輸入。輪詢在循環(huán)中執(zhí)行帚稠,并可能是處理器密集型的谣旁。響應(yīng)GPIO輸入的另一種方式是使用'中斷'(邊沿檢測)。邊沿是從高電平到低電平(下降沿)或從低電平到高電平(上升沿)的意思滋早。

5.1 上拉/下拉電阻
如果你沒有連接到任何輸入引腳榄审,它將'浮空'。換句話說杆麸,讀入的值是未定義的搁进,因?yàn)樗挥性诎聪掳粹o或開關(guān)時才會連接到任何東西。由于引腳會接收到干擾昔头,可能讀取到變化的值饼问。

為了解決這個問題,我們使用上拉或下拉電阻揭斧。這樣莱革,可以設(shè)置輸入的默認(rèn)值《锟可以在硬件上使用上拉/下拉電阻并使用軟件盅视。在硬件中,通常使用輸入通道和3.3V(上拉)或0V(下拉)之間的10K電阻旦万。RPi.GPIO模塊允許您配置Broadcom SOC以在軟件中執(zhí)行此操作:

GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP)
  # or
GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
(其中通道是基于您指定的編號系統(tǒng)的通道編號 - BOARD或BCM)
GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP)
  # or
GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

5.2 測試輸入(輪詢)
您可以立即讀取IO引腳的輸入值:

if GPIO.input(channel):
    print('Input was HIGH')
else:
    print('Input was LOW')

要通過輪詢輪詢等待按鈕按下

while GPIO.input(channel) == GPIO.LOW:
    time.sleep(0.01)  # wait 10 ms to give CPU chance to do other things

中斷和邊緣檢測
邊沿是電信號從低電平變?yōu)楦唠娖剑ㄉ仙兀┗驈母唠娖阶優(yōu)榈碗娖剑ㄏ陆笛兀┑臓顟B(tài)變化闹击。很多時候,我們更關(guān)心輸入狀態(tài)的變化而非價值成艘。這種狀態(tài)變化是一個事件赏半。

為了避免在程序忙于做其他事情時按下按鈕,有兩種方法可以解決這個問題:

wait_for_edge()函數(shù)
event_detected()函數(shù)
在檢測到邊緣時運(yùn)行線程的回調(diào)函數(shù)
wait_for_edge()函數(shù)
wait_for_edge()函數(shù)設(shè)計(jì)用于阻止程序的執(zhí)行淆两,直到檢測到邊緣断箫。換句話說,上面等待按鈕按下的示例可以被重寫為:

GPIO.wait_for_edge(channel, GPIO.RISING)

請注意琼腔,您可以檢測GPIO.RISING瑰枫,GPIO.FALLINGGPIO.BOTH類型的邊沿。這樣做的好處是它使用的CPU時間可以忽略不計(jì)丹莲,因此CPU還有很多工作要做光坝。

如果您只想等待一段時間,則可以使用timeout參數(shù):

#上升沿等待最多5秒(超時以毫秒為單位)
channel = GPIO.wait_for_edge(channel, GPIO_RISING, timeout=5000)
if channel is None:
    print('Timeout occurred')
else:
    print('Edge detected on channel', channel)
event_detected()函數(shù)
event_detected()函數(shù)設(shè)計(jì)用于與其他工作一起循環(huán)使用甥材,但與輪詢不同盯另,在CPU忙于處理其他事情時,不會錯過輸入狀態(tài)的變化洲赵。當(dāng)使用類似Pygame或PyQt的東西時鸳惯,這可能很有用,因?yàn)橹餮h(huán)會及時監(jiān)聽和響應(yīng)GUI事件叠萍。

GPIO.add_event_detect(channel, GPIO.RISING)  # add rising edge detection on a channel
do_something()
if GPIO.event_detected(channel):
    print('Button pressed')
請注意芝发,您可以檢測GPIO.RISING,GPIO.FALLING或GPIO.BOTH的事件苛谷。

Threaded回調(diào)
RPi.GPIO為回調(diào)函數(shù)運(yùn)行第二個線程辅鲸。這意味著回調(diào)函數(shù)可以與主程序同時運(yùn)行,并立即響應(yīng)邊緣事件腹殿。例如:

def my_callback(channel):
    print('This is a edge event callback function!')
    print('Edge detected on channel %s'%channel)
    print('This is run in a different thread to your main program')

GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback)  # add rising edge detection on a channel
...the rest of your program...
如果你想要多個回調(diào)函數(shù):

ef my_callback_one(channel):
    print('Callback one')

def my_callback_two(channel):
    print('Callback two')

GPIO.add_event_detect(channel, GPIO.RISING)
GPIO.add_event_callback(channel, my_callback_one)
GPIO.add_event_callback(channel, my_callback_two)

請注意独悴,在這種情況下,回調(diào)函數(shù)按順序運(yùn)行锣尉,而不是同時運(yùn)行刻炒。這是因?yàn)橹挥幸粋€線程用于回調(diào),每個回調(diào)都按照定義的順序運(yùn)行自沧。

5.4開關(guān)抖動
您可能會注意到坟奥,每次按下按鈕都會多次調(diào)用回調(diào)。這是所謂的“開關(guān)抖動”的結(jié)果拇厢。處理抖動有兩種方法:

在開關(guān)輸入腳上添加一個0.1uF的電容筏勒。
軟件去除抖動
以上兩種方法的結(jié)合
要使用軟件去抖動,請將bouncetime =參數(shù)添加到指定回調(diào)函數(shù)的函數(shù)中旺嬉。抖動時間應(yīng)以毫秒為單位指定管行。例如:

#在通道上添加上升沿檢測,忽略處理
   GPIO的開關(guān)抖動操作的進(jìn)一步邊緣200ms 邪媳。
GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback, bouncetime=200)
要么

GPIO.add_event_callback(channel, my_callback, bouncetime=200)

5.5 刪除事件檢測
如果由于某種原因捐顷,您的程序不再希望檢測邊緣事件,則可以刪除它們:

GPIO.remove_event_detect(channel)

6雨效、輸出
要設(shè)置GPIO引腳的輸出狀態(tài)迅涮,請執(zhí)行以下操作:

GPIO.output(channel, state)
(其中通道是基于您指定的編號系統(tǒng)(BOARD或BCM)的通道編號)。

狀態(tài)可以是0 / GPIO.LOW / False或1 / GPIO.HIGH / True徽龟。

A.設(shè)置輸出高電平:

GPIO.output(12, GPIO.HIGH)
 # or
GPIO.output(12, 1)
 # or
GPIO.output(12, True)

B.設(shè)置輸出低電平:

GPIO.output(12, GPIO.LOW)
 # or
GPIO.output(12, 0)
 # or
GPIO.output(12, False)

7叮姑、輸出到幾個通道
您可以一次設(shè)置輸出多個頻道(從0.5.8開始)。例如:

chan_list = [11,12]                             # also works with tuples
GPIO.output(chan_list, GPIO.LOW)                # sets all to GPIO.LOW
GPIO.output(chan_list, (GPIO.HIGH, GPIO.LOW))   # sets first HIGH and second LOW

8.在RPi.GPIO中使用PWM
要創(chuàng)建一個PWM實(shí)例:

p = GPIO.PWM(channel, frequency)

要啟動PWM:

p.start(dc)   # where dc is the duty cycle (0.0 <= dc <= 100.0)

要更改頻率:

p 。ChangeFrequency (freq )   #其中freq是以Hz為單位的新頻率

要改變占空比:

p.ChangeDutyCycle(dc)  # where 0.0 <= dc <= 100.0
要停止PWM:
p.stop()

請注意传透,如果實(shí)例變量'p'超出范圍耘沼,PWM也會停止。

每兩秒閃爍一次LED的示例:

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.OUT)

p = GPIO.PWM(12, 0.5)
p.start(1)
input('Press return to stop:')   # use raw_input for Python 2
p.stop()
GPIO.cleanup()

增亮/調(diào)暗LED的示例:

import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.OUT)

p = GPIO.PWM(12, 50)  # channel=12 frequency=50Hz
p.start(0)
try:
    while 1:
        for dc in range(0, 101, 5):
            p.ChangeDutyCycle(dc)
            time.sleep(0.1)
        for dc in range(100, -1, -5):
            p.ChangeDutyCycle(dc)
            time.sleep(0.1)
except KeyboardInterrupt:
    pass
p.stop()
GPIO.cleanup()

9朱盐、GPIO恢復(fù)默認(rèn)
在程序的末尾群嗤,清理您可能使用的任何資源是一種很好的做法。這與RPi.GPIO沒有什么不同兵琳。通過將您用過的所使用的通道返回到到無上拉/下拉輸入的狀態(tài)狂秘,這樣可以避免短接GPIO引腳來導(dǎo)致意外損壞您的樹莓派。請注意躯肌,這樣只會清除你寫的腳本中使用的GPIO通道者春。請注意,GPIO.cleanup()也會清除正在使用的引腳編號系統(tǒng)清女。

在你的腳本程序的末尾寫上:

GPIO.cleanup()

當(dāng)您的程序退出時钱烟,可能不希望清理每個通道,而留下一些設(shè)置校仑。您可以清理個別通道忠售,使用通道的元組或列表做為參數(shù)輸入:

GPIO.cleanup(channel)
GPIO.cleanup( (channel1, channel2) )
GPIO.cleanup( [channel1, channel2] )

10、RPi板信息和RPi.GPIO版本
發(fā)現(xiàn)有關(guān)您的RPi的信息:

GPIO.RPI_INFO
發(fā)現(xiàn)Raspberry Pi電路板版本:

GPIO.RPI_INFO [ 'P1_REVISION']
GPIO.RPI_REVISION(不建議使用)
要發(fā)現(xiàn)RPi.GPIO的版本:

GPIO.VERSION

11迄沫、編寫一個測試程序blinkled.py
這個測試程序控制樹莓派上一GPIO 25每2秒變化一個電平稻扬,如果接一個LED燈到這個IO上面,就會看到這個燈亮2秒滅2秒羊瘩。

#!/usr/bin/python
#*coding:utf-8*
#GPIO控制LED燈程序
import RPi.GPIO as GPIO
import time
pin = 25
GPIO.setmode(GPIO.BCM)
GPIO.setup(pin, GPIO.OUT)
 
while True:
    GPIO.output(pin, GPIO.HIGH)
    time.sleep(2)
    GPIO.output(pin, GPIO.LOW)
    time.sleep(2)

https://blog.csdn.net/fhqlongteng/article/details/80395059
https://sourceforge.net/p/raspberry-gpio-python/wiki/BasicUsage/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泰佳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子尘吗,更是在濱河造成了極大的恐慌逝她,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件睬捶,死亡現(xiàn)場離奇詭異黔宛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)擒贸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門臀晃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人介劫,你說我怎么就攤上這事徽惋。” “怎么了座韵?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵险绘,是天一觀的道長。 經(jīng)常有香客問我,道長宦棺,這世上最難降的妖魔是什么瓣距? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮渺氧,結(jié)果婚禮上旨涝,老公的妹妹穿的比我還像新娘蹬屹。我一直安慰自己侣背,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布慨默。 她就那樣靜靜地躺著贩耐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪厦取。 梳的紋絲不亂的頭發(fā)上潮太,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機(jī)與錄音虾攻,去河邊找鬼铡买。 笑死,一個胖子當(dāng)著我的面吹牛霎箍,可吹牛的內(nèi)容都是我干的奇钞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼漂坏,長吁一口氣:“原來是場噩夢啊……” “哼景埃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起顶别,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谷徙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后驯绎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體完慧,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年剩失,在試婚紗的時候發(fā)現(xiàn)自己被綠了屈尼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡赴叹,死狀恐怖鸿染,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情乞巧,我是刑警寧澤涨椒,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響蚕冬,放射性物質(zhì)發(fā)生泄漏免猾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一囤热、第九天 我趴在偏房一處隱蔽的房頂上張望猎提。 院中可真熱鬧,春花似錦旁蔼、人聲如沸锨苏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伞租。三九已至,卻和暖如春限佩,著一層夾襖步出監(jiān)牢的瞬間葵诈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工祟同, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留作喘,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓晕城,卻偏偏與公主長得像泞坦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子广辰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容