樹莓派現(xiàn)在越來越火,網(wǎng)上樹莓派的資料也越來越多。樹莓派源自英國,國外嵌入式開源領(lǐng)域具有良好的分享精神,樹莓派各種集成庫也層出不窮。
樹莓派內(nèi)核中已經(jīng)編譯自帶了gpio的驅(qū)動,我們常通過一些第三方寫好的庫函數(shù)來完成具體的操作。
【python GPIO】
【開發(fā)語言】——python
【簡單介紹】——該庫更確切的名稱為raspberry-gpio-python,樹莓派官方資料中推薦且容易上手。python GPIO是一個小型的python庫,可以幫助用戶完成raspberry相關(guān)IO口操作。但是python GPIO庫還沒有支持SPI、I2C或者1-wire等總線接口。除了python GPIO之外,還有眾多的python擴(kuò)展庫(例如webiopi),毫無疑問的說python非常適合樹莓派,樹莓派也非常適合python。
【wiringPi】
【開發(fā)語言】——C語言
【簡單介紹】——wiringPi適合那些具有C語言基礎(chǔ),在接觸樹莓派之前已經(jīng)接觸過單片機(jī)或者嵌入式開發(fā)的人群。wiringPi的API函數(shù)和arduino非常相似,這也使得它廣受歡迎。作者給出了大量的說明和示例代碼,這些示例代碼也包括UART設(shè)備,I2C設(shè)備和SPI設(shè)備等,毫無疑問地說wiringPi功能非常強(qiáng)大。
【BCM2835 C Library】
【開發(fā)語言】——C語言
【簡單介紹】BCM2835 C Library可以理解為使用C語言實(shí)現(xiàn)的相關(guān)底層驅(qū)動,它給我的感覺更像STM32的庫函數(shù),BCM2835 C Library的驅(qū)動庫包括GPIO、SPI和UART等,可以通過學(xué)習(xí)BCM2835 C Library熟悉BCM2835相關(guān)的寄存器操作。如果有機(jī)會開發(fā)樹莓派上的linux驅(qū)動,或自主開發(fā)python或PHP擴(kuò)展驅(qū)動,可以從BCM2835 C Library找到不少的“靈感”。
【相關(guān)博文】
更多樹莓派學(xué)習(xí)筆記請參考——【樹莓派學(xué)習(xí)筆記——索引博文】
1.硬件準(zhǔn)備
【樹莓派】——在開始所有的實(shí)驗(yàn)之前,你需要一塊完整的樹莓派。
【IO擴(kuò)展板】——可以通過淘寶購買IO擴(kuò)展板,或者購買萬用板和杜邦線自行制作IO擴(kuò)展板。
圖1 樹莓派擴(kuò)展板——圖片來自 天貓 大菠蘿數(shù)碼專營店
圖2 運(yùn)行效果圖
2.注意事項(xiàng)
【編號方式】
圖3 GPIO編號方式——該圖片來自wiringPi說明文檔
樹莓派的軟件擴(kuò)展庫雖然很多,但也導(dǎo)致了擴(kuò)展庫“碎片化”的問題,例如操作樹莓派的GPIO端口,GPIO的編號便存在三種不同的方式
【1】插座編號方式
編號側(cè)重P1插座側(cè),從上到下,從左到右。正如圖3的Header一欄。
【2】BCM2835編號方式
編號側(cè)重CPU寄存器,根據(jù)BCM2835的GPIO寄存器編號。正如圖3 BCM GPIO一欄。
【3】wiringPi編號方式
編號側(cè)重實(shí)現(xiàn)邏輯,把擴(kuò)展GPIO端口從0開始編號,這種編號方便編程。正如圖3 WiringPi一欄。
【舉例說明】
插座編號方式 11 -》 BCM2835編號方式 17 -》 wiringPi編號方式 GPIO0。無論如何它都是同一個IO管腳。
【代碼寫在哪里】
【1】直接在樹莓派中編寫
樹莓派中有幾款代碼(文本)編輯軟件,可以在樹莓派中編寫代碼。
【2】在windows中編寫
可以在windows中編寫代碼,如果是Python腳本可通過FTP軟件傳輸?shù)綐漭芍校缓笫褂肧SH客戶端登錄到樹莓派中執(zhí)行Python腳本。如果是C語言文件,除了使用FTP傳輸之外還需要在樹莓派上編譯才可以生成可執(zhí)行文件(相當(dāng)于windows上的exe文件)。相關(guān)軟件操作請參考【樹莓派學(xué)習(xí)筆記——常用軟件匯總】
【3】在其他linux中編寫
與windows中編寫代碼不同,在其他linux發(fā)行版(例如ubuntu)中可安裝交叉工具鏈,交叉編譯C文件生成在樹莓派的可執(zhí)行文件,那么使用FTP傳輸可執(zhí)行文件至樹莓派即可。其實(shí)方式【1】和方式【3】是幾乎相同的。
【本例原理圖】
為了說明問題本例只有一個LED,接在了樹莓派IO擴(kuò)展插座的11腳。
圖4 原理圖
3Python GPIO實(shí)現(xiàn)
【安裝過程】
【1】先安裝python-dev,輸入以下指令。
sudo apt-get install python-dev
【2】安裝RPi.GPIO,依次輸入以下指令。特別說明,由于RPi.GPIO仍處于不斷完善的過程中,請參考前言中的鏈接下載最新的安裝代碼。
# 下載
$ wget http://raspberry-gpio-python.googlecode.com/files/RPi.GPIO-0.5.3a.tar.gz
# 解壓縮
$ tar xv*** RPi.GPIO-0.5.3a.tar.gz
# 進(jìn)入解壓之后的目錄
$ cd RPi.GPIO-0.5.3a
# 啟動安裝
$ sudo python setup.py install
【示例代碼】
新建一個名為led.py的文件,該文件具體內(nèi)容如下:
[python] view plain copy# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
# BOARD編號方式,基于插座引腳編號
GPIO.setmode(GPIO.BOARD)
# 輸出模式
GPIO.setup(11, GPIO.OUT)
while True:
GPIO.output(11, GPIO.HIGH)
time.sleep(1)
GPIO.output(11, GPIO.LOW)
time.sleep(1)
【運(yùn)行】
如果在windows上編寫代碼,請使用FTP軟件下載到樹莓派中,使用SSH客戶端登陸樹莓派,cd命令進(jìn)入文件所在目錄,然后輸入指令
sudo python led.py
好吧,擴(kuò)展板上的LED等開始閃爍了。最后使用Ctrl+C結(jié)束Python程序。
【簡單說明】
【1】GPIO.setmode(GPIO.BOARD),采用插座引腳編號方式。
【2】由于采用插座引腳編號方式,此處的11腳相當(dāng)于BCM2835寄存器編號方式的引腳11。
4 WiringPi實(shí)現(xiàn)
【安裝過程】
詳見【樹莓派學(xué)習(xí)筆記——wiringPi簡介、安裝和管腳說明】
【示例代碼】
新建一個名為blink.c文件,該文件具體內(nèi)容如下:
[cpp] view plain copy#include 《wiringPi.h》
int main(void)
{
wiringPiSetup() ;
pinMode (0, OUTPUT) ;
for(;;)
{
digitalWrite(0, HIGH) ; delay (500) ;
digitalWrite(0, LOW) ; delay (500) ;
}
}
【運(yùn)行】
如果在windows上編寫代碼,請使用FTP軟件下載到樹莓派中,使用SSH客戶端登陸樹莓派,cd命令進(jìn)入文件所在目錄,然后輸入gcc指令
gcc -Wall -o blink blink.c -lwiringPi
接著輸入以下命令執(zhí)行程序
sudo 。/blink
程序順利運(yùn)行,最后使用ctrl+c可以結(jié)束程序。
【簡單說明】
【1】不確定的最后狀態(tài),由于程序停止的時間未知,所有LED可能為點(diǎn)亮狀態(tài)也可能會熄滅狀態(tài)。
【2】和python的程序相比,GPIO的端口號似乎發(fā)生了變化,但是實(shí)際上為同一個IO,只是IO的編號方式略有不同。
【3】-lwiringPi表示動態(tài)加載wiringPi共享庫,如果不熟悉gcc指令和makefile,請參考系列博文——【Linux學(xué)習(xí)筆記——例說makefile 索引博文】
5 BCM2835 C Library
【安裝過程】
特別說明,由于BCM2835 C Library仍處于不斷完善的過程中,請參考前言中的鏈接下載最新的安裝代碼。
# 下載
$ wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.35.tar.gz
# 解壓縮
$ tar xv*** bcm2835-1.35.tar.gz
# 進(jìn)入壓縮之后的目錄
$ cd bcm2835-1.35
# 配置
。/configure
# 從源代碼生成安裝包
make
# 執(zhí)行檢查
sudo make check
# 安裝 bcm2835庫
sudo make install
【示例代碼】
新建一個名為blink.c的程序,程序的具體內(nèi)容如下:
[cpp] view plain copy#include 《bcm2835.h》
// P1插座第11腳
#define PIN RPI_GPIO_P1_11
int main(int argc, char **argv)
{
if (!bcm2835_init())
return 1;
// 輸出方式
bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_OUTP);
while (1)
{
bcm2835_gpio_write(PIN, HIGH);
bcm2835_delay(100);
bcm2835_gpio_write(PIN, LOW);
bcm2835_delay(100);
}
bcm2835_close();
return 0;
}
【運(yùn)行】如果在windows上編寫代碼,請使用FTP軟件下載到樹莓派中,使用SSH客戶端登陸樹莓派,cd命令進(jìn)入文件所在目錄,然后輸入gcc指令
gcc -o blink blink.c -lbcm2835
接著執(zhí)行該程序,輸入以下指令
sudo 。/blink
程序順利運(yùn)行,最后使用ctrl+c可以結(jié)束程序。
【1】和wiringPi的情況相似,若關(guān)閉程序LED燈可能點(diǎn)亮也可能熄滅。
【2】雖然GPIO端口再次發(fā)生了變化,但還是指向那個LED燈。
【3】-lbcm2835表示動態(tài)加載bcm2835共享庫,如果不熟悉gcc指令和makefile,請看看我的其他博文吧。
6 未來做些什么
實(shí)踐GPIO輸入功能,實(shí)踐SPI功能,實(shí)踐I2C功能等。最后綜合以上若干內(nèi)容結(jié)合web做些好玩的應(yīng)用。
評論
查看更多