樹莓派的pythonGPIO程式設計整理
阿新 • • 發佈:2019-02-06
#!/usr/bin/python
import RPi.GPIO as GPIO #匯入GPIO
GPIO.setmode(GPIO.BOARD) #將GPIO引腳設定為BOARD模式
GPIO.setmode(GPIO.BCM) #將GPIO引腳設定為BCM引腳方式
GPIO.setup(pin,GPIO.IN) #設定GPIO引腳通道 作為輸入
GPIO.setup(pin,GPIO.OUT) #作為輸出
GPIO.setup(pin,GPIO.OUT,initial=GPIO.HIGH) #設定初始化為高電平
#多通道設定方式
pinlist=[pin1,pin2,pin3,pinx]
GPIO.setup(pinlist,GPIO.OUT)
GPIO.setup(pinlist,GPIO.IN)
/**********************讀取GPIO的輸入值/中斷(interrupt)和邊沿檢測(edge detection)***************/
#讀取一個GPIO口的值
GPIO.input(pin)
input()方法可以讀取目前通道的輸出
#中斷的邊沿檢測可以為上升沿/上升臨界值(rising edge)或者下降沿/下降臨界值(falling edge)
如果您在輸入針腳上沒有連線任何元件,那麼它將是“浮動(float)”的。換句話說,因為
您沒有連線任何元件,在按下按鈕或開關之前,讀取的值是沒有意義的。由於電源的波動,
獲取到的值可能會有很大的變化。
/*********************上下拉方式***********************************/
1.硬體方式:接上/下拉電阻:
將一個 10K 的電阻連線在輸入通道與 3.3V(上拉)或 0V(下拉)之間是常用的做法
2.軟體實現上/下拉:
RPi.GPIO 也允許您通過軟體的方式對配置 Broadcom SOC 來達到目的:
GPIO.setup(pin,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(pin,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
/****************************輪詢檢測/中斷和邊沿檢測******************************/
一.輪詢(polling)檢測:
if GPIO.input(pin):
print 'Input is High'
else:
print 'Input is Low'
二.中斷和邊沿檢測:
為了避免您的程式在忙於處理其它的事物時而錯過了您按下按鈕的操作,這裡有兩種方法可以解決:
wait_for_edge()函式
add_event_detect() 函式 --該函式對一個引腳進行監聽,一旦引腳輸入狀態發生了改變,呼叫event_detected()函式會返回true
event_detected()函式 -----在檢測到邊緣時執行執行緒回撥函式
1.wait_for_edge函式:函式被設計用於在檢測到邊沿之前阻止程式的執行:
wait_for_edge()函式被設計用於在檢測到邊沿之前阻止程式的執行:
if channel is None:
print('Timeout occurred')
else:
print('Edge detected on channel', channel)
#設定一個超時引數,如果超時,程式將繼續執行。如果沒有超時引數,程式將一直等待邊沿。
2.add_event_detect() 函式 --該函式對一個引腳進行監聽,
一旦引腳輸入狀態發生了改變,呼叫event_detected()函式會返回True
例項:
GPIO.add_event_detect(channel, GPIO.RISING) # add rising edge detection on a channel
do_something()
// 下面的程式碼放在一個執行緒迴圈執行。
if GPIO.event_detected(channel):
print('Button pressed')
注:event_detected()/***多用於迴圈****/
event_detected()函式被用於迴圈中有其他東西時使用,不同於輪詢的是,他不會錯過當cpu忙於其他事物時的輸入狀態的
改變。這在類似使用Pygame或PyQt時主迴圈實時監聽和響應GUI的時間是很有用的。
執行緒回撥:
RPi.GPIO為回撥函式另外開啟一個執行緒。這意味這回調函式可以和你的主程式同時執行,及時的對邊沿做出響應。
例項:
def my_callback(pin):
print '這是一個邊沿事件的回撥函式'
print '在%d通道上進行的邊沿檢測'%pin
print '該程式與我的主程式在不同的程序中'
GPIO.add_event_detect(pin,GPIO.RISING,callback=my_callback)
pass#其他程式碼
2中的的程式碼需要自己新建一個執行緒去迴圈檢測event_detected()的值,還算是比較麻煩的。
不過可採用另一種辦法輕鬆檢測狀態,這種方式是直接傳入一個回撥函式:
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)
如果你想設定多個回撥函式,可以這樣:
def 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)
注意:回撥觸發時,並不會同時執行回撥函式,而是根據設定的順序呼叫它們。
/**************************************************/
例項應用:
import RPi.GPIO as GPIO //引入函式庫
import time
RPi.GPIO.setmode(GPIO.BOARD) //設定引腳編號規則
RPi.GPIO.setup(11, RPi.GPIO.OUT) //將11號引腳設定成輸出模式
while True
GPIO.output(channel, 1) //將引腳的狀態設定為高電平,此時LED亮了
time.sleep(1) //程式休眠1秒鐘,讓LED亮1秒
GPIO.output(channel, 0) //將引腳狀態設定為低電平,此時LED滅了
time.sleep(1) //程式休眠1秒鐘,讓LED滅1秒
GPIO.cleanup() //程式的最後別忘記清除所有資源
/*****************************************************/
GPIO.output(pin1,not GPIO.input(pin2))
#返回0 / GPIO.LOW /False 或 1 / GPIO.HIGH /True
/**********************************************************************/
#設定一個GPIO口的輸出值
GPIO.output(pin,state)
#state的之可以為0 / GPIO.LOW /False 或 1 / GPIO.HIGH /True
#設定多個通道的輸出
pinlist=[pin1,pin2,pin3,pinx]
GPIO.output(pinlist,GPIO.LOW)
GPIO.output([pin1,pin2],(GPIO.HIGH,GPIO.LOW))
##清空
GPIO.cleanup()
/*****time.sleep(t)延時函式***********/
time.sleep(t) #t是推遲執行的秒數
Python time sleep() 函式推遲呼叫執行緒的執行,可通過引數secs指秒數,表示程序掛起的時間。
/*****************PWM(脈衝寬度調製)**********************************/
建立PWM例項
Pwm=GPIO.PWM(pin,frequence)
啟動PWM
Pwm.start(dc) 0.0<dc<100.0
改變PWM頻率
Pwm.ChangeFrequency(freq) #where freq is the new frequency in HZ
改變PWM的佔空比
Pwm.ChangeDutyCycle(dc) #where 0.0<=dc <=100.0
停止PWM
Pwm.stop()
import RPi.GPIO as GPIO #匯入GPIO
GPIO.setmode(GPIO.BOARD) #將GPIO引腳設定為BOARD模式
GPIO.setmode(GPIO.BCM) #將GPIO引腳設定為BCM引腳方式
GPIO.setup(pin,GPIO.IN) #設定GPIO引腳通道 作為輸入
GPIO.setup(pin,GPIO.OUT) #作為輸出
GPIO.setup(pin,GPIO.OUT,initial=GPIO.HIGH) #設定初始化為高電平
#多通道設定方式
pinlist=[pin1,pin2,pin3,pinx]
GPIO.setup(pinlist,GPIO.OUT)
GPIO.setup(pinlist,GPIO.IN)
/**********************讀取GPIO的輸入值/中斷(interrupt)和邊沿檢測(edge detection)***************/
#讀取一個GPIO口的值
GPIO.input(pin)
input()方法可以讀取目前通道的輸出
#中斷的邊沿檢測可以為上升沿/上升臨界值(rising edge)或者下降沿/下降臨界值(falling edge)
如果您在輸入針腳上沒有連線任何元件,那麼它將是“浮動(float)”的。換句話說,因為
您沒有連線任何元件,在按下按鈕或開關之前,讀取的值是沒有意義的。由於電源的波動,
獲取到的值可能會有很大的變化。
/*********************上下拉方式***********************************/
1.硬體方式:接上/下拉電阻:
將一個 10K 的電阻連線在輸入通道與 3.3V(上拉)或 0V(下拉)之間是常用的做法
2.軟體實現上/下拉:
RPi.GPIO 也允許您通過軟體的方式對配置 Broadcom SOC 來達到目的:
GPIO.setup(pin,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(pin,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
/****************************輪詢檢測/中斷和邊沿檢測******************************/
一.輪詢(polling)檢測:
if GPIO.input(pin):
print 'Input is High'
else:
print 'Input is Low'
二.中斷和邊沿檢測:
為了避免您的程式在忙於處理其它的事物時而錯過了您按下按鈕的操作,這裡有兩種方法可以解決:
wait_for_edge()函式
add_event_detect() 函式 --該函式對一個引腳進行監聽,一旦引腳輸入狀態發生了改變,呼叫event_detected()函式會返回true
event_detected()函式 -----在檢測到邊緣時執行執行緒回撥函式
1.wait_for_edge函式:函式被設計用於在檢測到邊沿之前阻止程式的執行:
wait_for_edge()函式被設計用於在檢測到邊沿之前阻止程式的執行:
例項:
GPIO.wait_for_edge(pin,GPIO.RISING)--可以使用GPIO.RISING,GPIO.FALLING,GPIO.BOTH
對邊沿進行檢測。這種方式佔用的CPU資源少。例項:
# wait for up to 5 seconds for a rising edge (timeout is in milliseconds)
channel = GPIO.wait_for_edge(channel, GPIO_RISING, timeout=5000)if channel is None:
print('Timeout occurred')
else:
print('Edge detected on channel', channel)
#設定一個超時引數,如果超時,程式將繼續執行。如果沒有超時引數,程式將一直等待邊沿。
2.add_event_detect() 函式 --該函式對一個引腳進行監聽,
一旦引腳輸入狀態發生了改變,呼叫event_detected()函式會返回True
例項:
GPIO.add_event_detect(channel, GPIO.RISING) # add rising edge detection on a channel
do_something()
// 下面的程式碼放在一個執行緒迴圈執行。
if GPIO.event_detected(channel):
print('Button pressed')
注:event_detected()/***多用於迴圈****/
event_detected()函式被用於迴圈中有其他東西時使用,不同於輪詢的是,他不會錯過當cpu忙於其他事物時的輸入狀態的
改變。這在類似使用Pygame或PyQt時主迴圈實時監聽和響應GUI的時間是很有用的。
執行緒回撥:
RPi.GPIO為回撥函式另外開啟一個執行緒。這意味這回調函式可以和你的主程式同時執行,及時的對邊沿做出響應。
例項:
def my_callback(pin):
print '這是一個邊沿事件的回撥函式'
print '在%d通道上進行的邊沿檢測'%pin
print '該程式與我的主程式在不同的程序中'
GPIO.add_event_detect(pin,GPIO.RISING,callback=my_callback)
pass#其他程式碼
2中的的程式碼需要自己新建一個執行緒去迴圈檢測event_detected()的值,還算是比較麻煩的。
不過可採用另一種辦法輕鬆檢測狀態,這種方式是直接傳入一個回撥函式:
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)
如果你想設定多個回撥函式,可以這樣:
def 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)
注意:回撥觸發時,並不會同時執行回撥函式,而是根據設定的順序呼叫它們。
/**************************************************/
例項應用:
import RPi.GPIO as GPIO //引入函式庫
import time
RPi.GPIO.setmode(GPIO.BOARD) //設定引腳編號規則
RPi.GPIO.setup(11, RPi.GPIO.OUT) //將11號引腳設定成輸出模式
while True
GPIO.output(channel, 1) //將引腳的狀態設定為高電平,此時LED亮了
time.sleep(1) //程式休眠1秒鐘,讓LED亮1秒
GPIO.output(channel, 0) //將引腳狀態設定為低電平,此時LED滅了
time.sleep(1) //程式休眠1秒鐘,讓LED滅1秒
GPIO.cleanup() //程式的最後別忘記清除所有資源
/*****************************************************/
GPIO.output(pin1,not GPIO.input(pin2))
#返回0 / GPIO.LOW /False 或 1 / GPIO.HIGH /True
/**********************************************************************/
#設定一個GPIO口的輸出值
GPIO.output(pin,state)
#state的之可以為0 / GPIO.LOW /False 或 1 / GPIO.HIGH /True
#設定多個通道的輸出
pinlist=[pin1,pin2,pin3,pinx]
GPIO.output(pinlist,GPIO.LOW)
GPIO.output([pin1,pin2],(GPIO.HIGH,GPIO.LOW))
##清空
GPIO.cleanup()
/*****time.sleep(t)延時函式***********/
time.sleep(t) #t是推遲執行的秒數
Python time sleep() 函式推遲呼叫執行緒的執行,可通過引數secs指秒數,表示程序掛起的時間。
/*****************PWM(脈衝寬度調製)**********************************/
建立PWM例項
Pwm=GPIO.PWM(pin,frequence)
啟動PWM
Pwm.start(dc) 0.0<dc<100.0
改變PWM頻率
Pwm.ChangeFrequency(freq) #where freq is the new frequency in HZ
改變PWM的佔空比
Pwm.ChangeDutyCycle(dc) #where 0.0<=dc <=100.0
停止PWM
Pwm.stop()