Hello,朋友們大家好,歡迎大家來(lái)到LIUSE網(wǎng)絡(luò)。
隨著Mini型PC越來(lái)越多,與之而來(lái)的創(chuàng)客也豐富起來(lái),比如說(shuō)Arduino就是一個(gè)非常好里例子。
不過(guò),Arduino畢竟是一塊適合入門型的基礎(chǔ)開(kāi)發(fā)板,無(wú)論是從性能上,還是處理復(fù)雜問(wèn)題的實(shí)現(xiàn)上,其本身都是有限的。所以有些時(shí)候我們會(huì)考慮成本更高的卡片式PC,類似于樹(shù)莓派、香蕉派、橙子派等等。
話雖然可以這么說(shuō),但作為PC跟GPIO一體的板卡,有些朋友剛拿到手確實(shí)是不知道何從下手,更不知道如何去控制各個(gè)GPIO引腳,那今天的文章,鄙人就綜合的說(shuō)一下常用的函數(shù)等等,其實(shí)好多地方跟Arduino的代碼是很相似的。
在這里還是要推薦下我自己建的Python開(kāi)發(fā)學(xué)習(xí)群:483546416,群里都是學(xué)Python開(kāi)發(fā)的,如果你正在學(xué)習(xí)Python ,小編歡迎你加入,大家都是軟件開(kāi)發(fā)黨,不定期分享干貨(只有Python軟件開(kāi)發(fā)相關(guān)的),包括我自己整理的一份2018最新的Python進(jìn)階資料和高級(jí)開(kāi)發(fā)教程,歡迎進(jìn)階中和進(jìn)想深入Python的小伙伴
先說(shuō)庫(kù)文件:
樹(shù)莓派我們編程一般都直接用高效的python,針對(duì)于GPIO編程,python也是有這一方面的庫(kù)的,這里最有名也是最常用的就是RPI.GPIO了。這個(gè)庫(kù)是專門為樹(shù)莓派GPIO編程所設(shè)計(jì)的,利用它你可以愉快的像Arduino那樣輕松控制GPIO管腳。
安裝:
sudo apt-get -y python-pip #安裝pip
sudo pip install rpi.gpio #安裝RPI.GPIO
安裝完成后在實(shí)際運(yùn)用的時(shí)候,我們也會(huì)像arduino那樣去設(shè)置輸入輸出,設(shè)置高低電平,獲取針腳值等等,那下面我就把整理的內(nèi)容函數(shù)都貼出來(lái)。
在這說(shuō)一下管腳,拿到樹(shù)莓派之后你會(huì)發(fā)現(xiàn)板子上有兩排管腳,這對(duì)應(yīng)這什么呢?請(qǐng)看下圖:
(管腳對(duì)應(yīng))
當(dāng)然如果說(shuō)你的版本不同可能會(huì)略有差別,你同樣可以使用gpio?readall命令來(lái)打印出所有管腳:
(打印管腳)
好,做完上面的拓?fù)洌覀儊?lái)講一下關(guān)于GPIO編程的一些常用函數(shù)。
1.導(dǎo)入庫(kù):
import RPi.GPIO as GPIO
2.設(shè)置引腳模式:
GPIO.setmode(GPIO.BMC/BOARD) #BMC或者BOARD模式
3.設(shè)置引腳為輸入:
GPIO.setup(pin,GPIO.IN)
4.設(shè)置引腳為輸出:
GPIO.setup(pin,GPIO.OUT)
5.設(shè)置初始化高電平:
GPIO.setup(pin,GPIO.OUT,initial=GPIO.HIGH)
6.設(shè)置初始化為低電平:
GPIO.setup(pin,GPIO.OUT,initial=GPIO.LOW)
當(dāng)然python的好處是可以創(chuàng)建一個(gè)列表,然后將列表帶入函數(shù)中,使其一次性執(zhí)行多個(gè)針腳的輸入輸出,如:
PinList=[pin1,pin2,pin3]
GPIO.setup(PinList,GPIO.IN)
通過(guò)創(chuàng)建一個(gè)列表將列表中加入引腳的定義,實(shí)現(xiàn)多引腳同時(shí)設(shè)定為輸入。
讀取輸入值:
GPIO.input(pinx) #input()方法可以讀取pinx引腳的值
當(dāng)然前提是你的引腳接了一些傳感器,比如溫度傳感器,光線傳感器等等。
上下拉:
先說(shuō)什么是上下拉
上拉和下拉是指GPIO輸出高電位(上拉)還是低電位(下拉)。上拉就是輸入高電平,然后接一個(gè)上拉電阻(起保護(hù)作用),知道上拉就表示該端口在默認(rèn)情況下輸入為高電平。下拉就是輸入低電平,然后接一個(gè)下拉電阻。
我們?cè)谧龉苣_的上下拉時(shí),在電路設(shè)計(jì)上一般都是加上下拉電阻,但在樹(shù)莓派身上如何不改變電路通過(guò)python去控制呢?
在python的GPIO初始化上可以用GPIO.setup(pinx,GPIO.IN,pull_up_down=GPIO.PUD_UP/GPIO.DOWN)來(lái)控制上下拉。
設(shè)置中斷:
設(shè)置終端通常有兩種方法,一種是wait_for_edge(),另一種為add_event_detect(),我們下面來(lái)介紹一下這兩個(gè)中斷。
1.wait_for_edge():用于檢測(cè)到邊沿之前阻止程序運(yùn)行
舉個(gè)例子:
channel = GPIO.wait_for_edge(channel, GPIO_RISING, timeout=5000)
if channel is None:
print('Timeout occurred')
else:
print('Edge detected on channel', channel)
延時(shí)5秒,如果超時(shí),程序繼續(xù)執(zhí)行,如果沒(méi)有超時(shí)將繼續(xù)等待。
2.add_event_detect():對(duì)一個(gè)引腳進(jìn)行監(jiān)聽(tīng),一旦引腳輸入發(fā)生了改變,調(diào)用event_detected()函數(shù)會(huì)返回True
舉個(gè)例子:
GPIO.add_event_detect(channel, GPIO.RISING)
do_something()
if GPIO.event_detected(channel):
print('Button pressed')
add_event_detect()多用于循環(huán)狀態(tài),并且它不會(huì)錯(cuò)過(guò)循環(huán)中輸入狀態(tài)的改變,多用在PyQt上。
PWM脈沖調(diào)節(jié):
PWM這個(gè)多用在控制電機(jī)上,特別是對(duì)我們做樹(shù)莓派小車對(duì)小車的控制上有很大的幫助。
我們用一個(gè)實(shí)例去說(shuō)明:
Pwm=GPIO.PWM(pin,frequence) #創(chuàng)建PWM實(shí)例
Pwm.start(dc) #啟動(dòng)PWM dc值(0.0
Pwm.ChangeFrequency(freq) #改變PWM頻率
Pwm.ChangeDutyCycle(dc) # 改變PWM的占空比0.0<=dc <=100.
Pwm.stop() #停止PWM
后面我們?cè)谡f(shuō)幾個(gè)常用的函數(shù),比如輸出、等待,并寫一個(gè)控制小燈閃爍的Demo
GPIO口輸出值:
GPIO.output(pinx,1/0)
1對(duì)應(yīng)GPIO.HIGH(高電平)0對(duì)應(yīng)GPIO.LOW(低電平)
延時(shí)函數(shù):
time.sleep(秒數(shù))
此函數(shù)為time庫(kù)里面的,你要想使用必須在之前import time
今天暫且介紹這么多,我們下面寫一個(gè)控制LED小燈閃爍的實(shí)例:
import RPi.GPIO as GPIO //引入函數(shù)庫(kù)
import time
RPi.GPIO.setmode(GPIO.BOARD) //設(shè)置引腳編號(hào)規(guī)則
RPi.GPIO.setup(11, RPi.GPIO.OUT) //將11號(hào)引腳設(shè)置成輸出模式
while True
GPIO.output(channel, 1) //將引腳的狀態(tài)設(shè)置為高電平,此時(shí)LED亮了
time.sleep(1) //程序休眠1秒鐘,讓LED亮1秒
GPIO.output(channel, 0) //將引腳狀態(tài)設(shè)置為低電平,此時(shí)LED滅了
time.sleep(1) //程序休眠1秒鐘,讓LED滅1秒