
陳拓chentuo@ms.xab.ac.cn 2018.06.09/2018.06.10
從網(wǎng)上下載了幾張精美的圖片,感謝圖片的制作者!
本文介紹樹(shù)莓派 Zero W的GPIO控制,并用LED看效果。
從左到右,從上到下:左邊奇數,右邊偶數:1-40

編號側重CPU寄存器,根據BCM2835的GPIO寄存器編號。
編號側重實(shí)現邏輯,把擴展GPIO端口從0開(kāi)始編號,這種編號方便編程。如圖 WiringPi一欄。

操作GPIO時(shí)一定先要清楚使用那一套編號。

首先我們把LED和樹(shù)莓派連接。LED的正極串聯(lián)一個(gè)1KΩ電阻接樹(shù)莓派的GPIO18(pin12),負極接地。

這個(gè)圖是用Fritzing畫(huà)的。
用putty連接電腦和Pi Zero W,看本文最后的參考文檔。Host Name填raspberrypi.local,端口22,用戶(hù)名pi,密碼raspberry。
注意:boot分區有一個(gè)名為ssh的空文本文件,這個(gè)ssh文件容易丟失,如果ssh不能登錄了,先檢查ssh是否丟失。
pi@raspberrypi:~ $ sudo echo 18 > /sys/class/gpio/export
> 是IO重定向符號,IO重定向是指改變linux標準輸入和輸出的默認設備,指向一個(gè)用戶(hù)定義的設備。echo 18 > export就是把18寫(xiě)入到export文件中。
執行該操作之后,/sys/class/gpio目錄下會(huì )增加一個(gè)gpio18文件夾。
pi@raspberrypi:~ $ cd /sys/class/gpio/gpio18
pi@raspberrypi:/sys/class/gpio/gpio18 $ ls

pi@raspberrypi:/sys/class/gpio/gpio18 $ sudo echo out > direction
pi@raspberrypi:/sys/class/gpio/gpio18 $ sudo echo 1 > value
pi@raspberrypi:/sys/class/gpio/gpio18 $ sudo echo 0 > value
pi@raspberrypi:/sys/class/gpio $ cd ~
pi@raspberrypi:~ $ sudo echo 18 > /sys/class/gpio/unexport
pi@raspberrypi:~ $ sudo nano ledonoff.sh
腳本寫(xiě)下面的內容:
echo $1 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio$1/direction
echo 1 > /sys/class/gpio/gpio$1/value
sleep 5 #延時(shí)5秒
echo 0 > /sys/class/gpio/gpio$1/value
echo $1 > /sys/class/gpio/unexport
說(shuō)明:shell腳本可傳入參數,例如$1代表第1個(gè)參數,$2代表第2個(gè)參數,以此類(lèi)推。
pi@raspberrypi:~ $ sudo chmod +x ledonoff.sh
pi@raspberrypi:~ $ sudo ./ledonoff.sh 18
運行結果:LED點(diǎn)亮,持續5秒鐘關(guān)閉。
用Python控制GPIO,最便捷的方法就是使用python類(lèi)庫,比如樹(shù)莓派系統本身集成的RPi.GPIO。
在putty的ssh終端輸入命令:
pi@raspberrypi:~ $ python
>>> 這是python的提示符。
>>> import RPi.GPIO as GPIO
引入之后,就可以使用 GPIO 模塊的函數了。
樹(shù)莓派3 GPIO分為如下的三種編碼方式:物理引腳BOARD編碼,BCM編碼,以及 wiringPi 編碼。
>>> GPIO.setmode(GPIO.BCM)
>>> GPIO.setup(18,GPIO.OUT)
>>> GPIO.output(18,GPIO.HIGH)
>>> GPIO.output(18,GPIO.LOW)
>>> GPIO.cleanup()
>>> Ctrl+D
pi@raspberrypi:~ $ sudo nano blinky.py
腳本寫(xiě)下面的內容:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(18,GPIO.OUT)
while True:
GPIO.output(18,GPIO.HIGH)
time.sleep(1)
GPIO.output(18,GPIO.LOW)
time.sleep(1)
GPIO.cleanup()
說(shuō)明:while True下面的循環(huán)體要縮進(jìn),用空格或Tab(但不能混用)鍵縮進(jìn)就行。
pi@raspberrypi:~ $ sudo chmod +x blinky.py
pi@raspberrypi:~ $ sudo python blinky.py
LED閃爍。
用 Ctrl+C 來(lái)中斷循環(huán)。
樹(shù)莓派內核中已經(jīng)編譯自帶了gpio的驅動(dòng),我們常通過(guò)一些第三方寫(xiě)好的庫函數來(lái)完成具體的操作,比較常見(jiàn)的操作庫函數有:
Python GPIO已經(jīng)集成到了樹(shù)莓派內核,為樹(shù)莓派官方資料中推薦且容易上手。python GPIO是一個(gè)小型的python庫,可以幫助用戶(hù)完成raspberry相關(guān)IO口操作,但是python GPIO庫還沒(méi)有支持SPI、I2C或者1-wire等總線(xiàn)接口。
常見(jiàn)C語(yǔ)言庫有:
wiringPi適合那些具有C語(yǔ)言基礎,在接觸樹(shù)莓派之前已經(jīng)接觸過(guò)單片機或者嵌入式開(kāi)發(fā)的人群。wiringPi的API函數和arduino非常相似,這也使得它廣受歡迎。作者給出了大量的說(shuō)明和示例代碼,這些示例代碼也包括UART設備,I2C設備和SPI設備等。
BCM2835 C Library可以理解為使用C語(yǔ)言實(shí)現的相關(guān)底層驅動(dòng),BCM2835 C Library的驅動(dòng)庫包括GPIO. SPI和UART等,可以通過(guò)學(xué)習BCM2835 C Library熟悉BCM2835相關(guān)的寄存器操作。如果有機會(huì )開(kāi)發(fā)樹(shù)莓派上的linux驅動(dòng),或自主開(kāi)發(fā)python或PHP擴展驅動(dòng),可以從BCM2835 C Library找到不少的“靈感”。
WiringPi是應用于樹(shù)莓派平臺的GPIO控制庫函數,WiringPi遵守GUN Lv3。wiringPi使用C或者C++開(kāi)發(fā)并且可以被其他語(yǔ)言包轉,例如python、ruby或者PHP等。
wiringPi包括一套gpio控制命令,使用gpio命令可以控制樹(shù)莓派GPIO管腳。用戶(hù)可以利用gpio命令通過(guò)shell腳本控制或查詢(xún)GPIO管腳。
更新列表:
pi@raspberrypi:~ $ sudo apt-get update
更新軟件:
pi@raspberrypi:~ $ sudo apt-get upgrade
安裝:
pi@raspberrypi:~ $ sudo apt-get install wiringpi
wiringPi包括一套gpio命令,使用gpio命令可以控制樹(shù)莓派上的各種接口,通過(guò)以下指令可以測試wiringPi是否安裝成功。
pi@raspberrypi:~ $ gpio -v

pi@raspberrypi:~ $ gpio readall

pi@raspberrypi:~ $ sudo nano led_blink.c
#include <wiringPi.h>
int main(void) {
wiringPiSetup();
pinMode (1, OUTPUT);
for(;;) {
digitalWrite(1, HIGH);delay (500);
digitalWrite(1, LOW);delay (500) ;
}
}
說(shuō)明:看看上一小節的圖,BCM編號的GPIO17引腳在wiringPi編號中是1。
pi@raspberrypi:~ $ gcc led_blink.c -o led_blink -l wiringPi
-l wiringPi表示動(dòng)態(tài)加載wiringPi共享庫。
pi@raspberrypi:~ $ sudo ./led_blink
用 Ctrl+C 來(lái)中斷循環(huán)。
先看看最新版本:http://www.airspayce.com/mikem/bcm2835

pi@raspberrypi:~ $ wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.56.tar.gz
pi@raspberrypi:~ $ tar xvzf bcm2835-1.56.tar.gz
進(jìn)入壓縮之后的目錄:
pi@raspberrypi:~ $ cd bcm2835-1.56
執行配置命令:
pi@raspberrypi:~/bcm2835-1.56 $ ./configure
pi@raspberrypi:~/bcm2835-1.56 $ make
pi@raspberrypi:~/bcm2835-1.56 $ sudo make check
pi@raspberrypi:~/bcm2835-1.56 $ sudo make install
pi@raspberrypi:~/bcm2835-1.56 $ cd ~
pi@raspberrypi:~ $ sudo nano blink_led.c
#include <bcm2835.h>
#define PIN RPI_GPIO_P1_12
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(500);
bcm2835_gpio_write(PIN, LOW);
bcm2835_delay(500);
}
bcm2835_close();
return 0;
}
說(shuō)明:GPIO的編號方式不同,采用PCB板的物理接口編號,led連在樹(shù)莓派Zero W板子的12引腳上。
pi@raspberrypi:~ $ gcc blink_led.c -o blink_led -l bcm2835
-l bcm2835表示動(dòng)態(tài)加載bcm2835共享庫
sudo ./blink_led
用 Ctrl+C 來(lái)中斷循環(huán)。
通過(guò)設置改變引腳的功能,見(jiàn)參考文檔“樹(shù)莓派Zero W添加音頻輸出”。


聯(lián)系客服