上次我們進(jìn)行了系統(tǒng)的安裝和環(huán)境的配置慕淡,實(shí)現(xiàn)了樹(shù)莓派的第一次喚醒忍疾,以及更改喚醒詞的演示,詳細(xì)見(jiàn)人工智能之我與樹(shù)莓派(1)
今天殿漠,我們進(jìn)行進(jìn)階操作赴精,研究如何通過(guò)語(yǔ)音,來(lái)控制GPIO端口绞幌,進(jìn)而控制LED燈和小車(chē)蕾哟。首先介紹GPIO接口和LED燈的使用。
GPIO接口介紹
樹(shù)莓派與其他的開(kāi)發(fā)板不同的是他有著40個(gè)GPIO口可以用來(lái)外部擴(kuò)展,GPIO指的是General Purpose Input Output (通用輸入/輸出)谭确,是樹(shù)莓派與其他硬件連接起來(lái)的橋梁帘营。
那么如何使用這些接口?開(kāi)源領(lǐng)域具有良好的分享精神逐哈,樹(shù)莓派同樣也集成了各種庫(kù)仪吧,最常用的有三個(gè):
【開(kāi)發(fā)語(yǔ)言】——python
【簡(jiǎn)單介紹】——該庫(kù)更確切的名稱(chēng)為raspberry-gpio-python,樹(shù)莓派官方資料中推薦且容易上手鞠眉。python GPIO是一個(gè)小型的python庫(kù)薯鼠,可以幫助用戶(hù)完成raspberry相關(guān)IO口操作。但是python GPIO庫(kù)還沒(méi)有支持SPI械蹋、I2C或者1-wire等總線(xiàn)接口出皇。除了python GPIO之外,還有眾多的python擴(kuò)展庫(kù)(例如webiopi)哗戈,毫無(wú)疑問(wèn)的說(shuō)python非常適合樹(shù)莓派郊艘,樹(shù)莓派也非常適合python。
【wiringPi】
【開(kāi)發(fā)語(yǔ)言】——C語(yǔ)言
【簡(jiǎn)單介紹】——wiringPi適合那些具有C語(yǔ)言基礎(chǔ)唯咬,在接觸樹(shù)莓派之前已經(jīng)接觸過(guò)單片機(jī)或者嵌入式開(kāi)發(fā)的人群纱注。wiringPi的API函數(shù)和arduino非常相似,這也使得它廣受歡迎胆胰。作者給出了大量的說(shuō)明和示例代碼狞贱,這些示例代碼也包括UART設(shè)備,I2C設(shè)備和SPI設(shè)備等蜀涨,毫無(wú)疑問(wèn)地說(shuō)wiringPi功能非常強(qiáng)大瞎嬉。
【開(kāi)發(fā)語(yǔ)言】——C語(yǔ)言
【簡(jiǎn)單介紹】BCM2835 C Library可以理解為使用C語(yǔ)言實(shí)現(xiàn)的相關(guān)底層驅(qū)動(dòng),它給我的感覺(jué)更像STM32的庫(kù)函數(shù)厚柳,BCM2835 C Library的驅(qū)動(dòng)庫(kù)包括GPIO氧枣、SPI和UART等,可以通過(guò)學(xué)習(xí)BCM2835 C Library熟悉BCM2835相關(guān)的寄存器操作别垮。如果有機(jī)會(huì)開(kāi)發(fā)樹(shù)莓派上的linux驅(qū)動(dòng)便监,或自主開(kāi)發(fā)python或PHP擴(kuò)展驅(qū)動(dòng),可以從BCM2835 C Library找到不少的“靈感”碳想。
在這里烧董,基于Python是最簡(jiǎn)單易用的編程語(yǔ)言之一以及其 豐富的擴(kuò)展能力,我當(dāng)然選擇的是Python的RPI.GPIO庫(kù)移袍,下面簡(jiǎn)單介紹一下它的用法:
RPI.GPIO
引腳編號(hào)方式
目前有兩種方式可以通過(guò) RPi.GPIO 對(duì) Raspberry Pi 上的 IO 針腳進(jìn)行編號(hào)解藻。
- 第一種方式是使用BOARD編號(hào)系統(tǒng)。該方式參考 Raspberry Pi 主板上 P1 接線(xiàn)柱的針腳編號(hào)葡盗。
- 第二種方式是使用BCM編號(hào)螟左。這是一種較底層的工作方式 – 該方式參考 Broadcom SOC 的通道編號(hào)啡浊。
所有的這兩種編碼方式所對(duì)應(yīng)的位置,你都可以在上面的圖中找到對(duì)應(yīng)的位置胶背。
在使用之前必須指定所使用的方式:
GPIO.setmode(GPIO.BOARD)
GPIO.setmode(GPIO.BCM)
配置通道
在使用某個(gè)接口之前巷嚣,還需要為每個(gè)用于輸入或輸出的針腳配置通道。通道有兩種钳吟,一種是IN廷粒,一種是OUT。
GPIO.setup(channel, GPIO.IN)
GPIO.setup(channel, GPIO.OUT)
通道編號(hào)是基于您所使用的編號(hào)系統(tǒng)所指定的(BOARD 或 BCM)红且。
GPIO.setup(channel, GPIO.OUT, initial = GPIO.HIGH)
當(dāng)GPIO的狀態(tài)是OUT時(shí)坝茎,還可以指定端口的初始狀態(tài),同樣是兩種HIGH和LOW暇番,對(duì)應(yīng)著輸出高電平和低電平嗤放。
輸入
讀取 GPIO 針腳的值:
GPIO.input(channel)
狀態(tài)可以為 0 / GPIO.LOW / False 或者 1 / GPIO.HIGH / True
輸出
設(shè)置 GPIO 針腳的輸出狀態(tài):
GPIO.output(channel, state)
狀態(tài)可以為 0 / GPIO.LOW / False 或者 1 / GPIO.HIGH / True。
清理
在任何程序結(jié)束后壁酬,養(yǎng)成清理用過(guò)的資源的好習(xí)慣次酌。使用 RPi.GPIO 也同樣需要這樣∮咔牵恢復(fù)所有使用過(guò)的通道狀態(tài)為輸入岳服,可以避免由于短路意外損壞您的 Raspberry Pi 針腳。僅會(huì)清理使用過(guò)的 GPIO 通道希俩。
GPIO.cleanup()
警告
可能樹(shù)莓派的 GPIO 上同時(shí)有多個(gè)腳本/循環(huán)吊宋。因此,如果 RPi.GPIO 檢測(cè)到某個(gè)針腳被設(shè)置為其它用途而非默認(rèn)的狀態(tài)(默認(rèn)為輸入)斜纪,會(huì)在運(yùn)行某腳本時(shí)得到警告消息贫母。
禁用該警告消息(不會(huì)產(chǎn)生副作用文兑,僅會(huì)覆蓋原來(lái)的端口電平信息):
GPIO.setwarnings(False)
通過(guò)GPIO口控制LED燈
安裝RPI.GPIO庫(kù)
# 下載
$ wget https://pypi.python.org/packages/e2/58/6e1b775606da6439fa3fd1550e7f714ac62aa75e162eed29dbec684ecb3e/RPi.GPIO-0.6.3.tar.gz
# 解壓縮
$ tar xvzf RPi.GPIO-0.6.3a.tar.gz
# 進(jìn)入解壓之后的目錄
$ cd RPi.GPIO-0.6.3a
# 啟動(dòng)安裝
$ sudo python setup.py install
主代碼
#!/usr/bin/env python
# encoding: utf-8
import RPi.GPIO
import time
# 指定GPIO口的選定模式為GPIO引腳編號(hào)模式
RPi.GPIO.setmode(RPi.GPIO.BCM)
# 指定GPIO14的模式為輸出模式,且初始狀態(tài)為低電平盒刚。
# 如果上面GPIO口的選定模式指定為主板模式的話(huà),這里就應(yīng)該指定8號(hào)而不是14號(hào)绿贞。
RPi.GPIO.setup(14, RPi.GPIO.OUT因块,initial = GPIO.LOW)
# 循環(huán)10次
for i in range(0, 10):
# 讓GPIO14輸出高電平(LED燈亮)
RPi.GPIO.output(14, True)
# 持續(xù)一段時(shí)間
time.sleep(0.5)
# 讓GPIO14輸出低電平(LED燈滅)
RPi.GPIO.output(14, False)
# 持續(xù)一段時(shí)間
time.sleep(0.5)
RPi.GPIO.cleanup()
# 清理GPIO口
系列教程
人工智能-樹(shù)莓派小車(chē)(1)——DuerOS語(yǔ)音喚醒
人工智能-樹(shù)莓派小車(chē)(2)——GPIO接口介紹
人工智能-樹(shù)莓派小車(chē)(3)——GPIO控制小車(chē)
人工智能-樹(shù)莓派小車(chē)(4)——通過(guò)語(yǔ)音玩轉(zhuǎn)智能小車(chē)
人工智能-樹(shù)莓派小車(chē)(5)——用微信控制智能小車(chē)