![]() 陳拓chentuo@ms.xab.ac.cn 2018.06.09/2018.06.10 從網(wǎng)上下載了幾張精美的圖片,感謝圖片的制作者! 0. 概述本文介紹樹莓派 Zero W的GPIO控制,并用LED看效果。 0.1 樹莓派GPIO編號(hào)方式
從左到右,從上到下:左邊奇數(shù),右邊偶數(shù):1-40 ![]()
編號(hào)側(cè)重CPU寄存器,根據(jù)BCM2835的GPIO寄存器編號(hào)。
編號(hào)側(cè)重實(shí)現(xiàn)邏輯,把擴(kuò)展GPIO端口從0開始編號(hào),這種編號(hào)方便編程。如圖 WiringPi一欄。 ![]() 操作GPIO時(shí)一定先要清楚使用那一套編號(hào)。 1. 準(zhǔn)備1.1 硬件
1.2 GPIO接口![]() 1.3 接線首先我們把LED和樹莓派連接。LED的正極串聯(lián)一個(gè)1KΩ電阻接樹莓派的GPIO18(pin12),負(fù)極接地。 ![]() 這個(gè)圖是用Fritzing畫的。 2. 測(cè)試2.1 連接電腦和Pi Zero W用putty連接電腦和Pi Zero W,看本文最后的參考文檔。Host Name填raspberrypi.local,端口22,用戶名pi,密碼raspberry。 注意:boot分區(qū)有一個(gè)名為ssh的空文本文件,這個(gè)ssh文件容易丟失,如果ssh不能登錄了,先檢查ssh是否丟失。 2.2 用Shell命令直接控制GPIO
pi@raspberrypi:~ $ sudo echo 18 > /sys/class/gpio/export > 是IO重定向符號(hào),IO重定向是指改變linux標(biāo)準(zhǔn)輸入和輸出的默認(rèn)設(shè)備,指向一個(gè)用戶定義的設(shè)備。echo 18 > export就是把18寫入到export文件中。 執(zhí)行該操作之后,/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 2.3 用Shell腳本控制GPIO
pi@raspberrypi:~ $ sudo nano ledonoff.sh 腳本寫下面的內(nèi)容: 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 說明:shell腳本可傳入?yún)?shù),例如$1代表第1個(gè)參數(shù),$2代表第2個(gè)參數(shù),以此類推。
pi@raspberrypi:~ $ sudo chmod +x ledonoff.sh
pi@raspberrypi:~ $ sudo ./ledonoff.sh 18 運(yùn)行結(jié)果:LED點(diǎn)亮,持續(xù)5秒鐘關(guān)閉。 2.4 用Python通過PRI.GPIO命令控制GPIO用Python控制GPIO,最便捷的方法就是使用python類庫,比如樹莓派系統(tǒng)本身集成的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 2.5 用Python腳本控制GPIO
pi@raspberrypi:~ $ sudo nano blinky.py 腳本寫下面的內(nèi)容: 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() 說明: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 來中斷循環(huán)。 3. 借助wiringPi GPIO用C語言控制GPIO樹莓派內(nèi)核中已經(jīng)編譯自帶了gpio的驅(qū)動(dòng),我們常通過一些第三方寫好的庫函數(shù)來完成具體的操作,比較常見的操作庫函數(shù)有:
Python GPIO已經(jīng)集成到了樹莓派內(nèi)核,為樹莓派官方資料中推薦且容易上手。python GPIO是一個(gè)小型的python庫,可以幫助用戶完成raspberry相關(guān)IO口操作,但是python GPIO庫還沒有支持SPI、I2C或者1-wire等總線接口。 常見C語言庫有:
wiringPi適合那些具有C語言基礎(chǔ),在接觸樹莓派之前已經(jīng)接觸過單片機(jī)或者嵌入式開發(fā)的人群。wiringPi的API函數(shù)和arduino非常相似,這也使得它廣受歡迎。作者給出了大量的說明和示例代碼,這些示例代碼也包括UART設(shè)備,I2C設(shè)備和SPI設(shè)備等。
BCM2835 C Library可以理解為使用C語言實(shí)現(xiàn)的相關(guān)底層驅(qū)動(dòng),BCM2835 C Library的驅(qū)動(dòng)庫包括GPIO. SPI和UART等,可以通過學(xué)習(xí)BCM2835 C Library熟悉BCM2835相關(guān)的寄存器操作。如果有機(jī)會(huì)開發(fā)樹莓派上的linux驅(qū)動(dòng),或自主開發(fā)python或PHP擴(kuò)展驅(qū)動(dòng),可以從BCM2835 C Library找到不少的“靈感”。 3.1 WiringPi GPIO安裝WiringPi是應(yīng)用于樹莓派平臺(tái)的GPIO控制庫函數(shù),WiringPi遵守GUN Lv3。wiringPi使用C或者C++開發(fā)并且可以被其他語言包轉(zhuǎn),例如python、ruby或者PHP等。 wiringPi包括一套gpio控制命令,使用gpio命令可以控制樹莓派GPIO管腳。用戶可以利用gpio命令通過shell腳本控制或查詢GPIO管腳。
更新列表: pi@raspberrypi:~ $ sudo apt-get update 更新軟件: pi@raspberrypi:~ $ sudo apt-get upgrade 安裝: pi@raspberrypi:~ $ sudo apt-get install wiringpi
wiringPi包括一套gpio命令,使用gpio命令可以控制樹莓派上的各種接口,通過以下指令可以測(cè)試wiringPi是否安裝成功。 pi@raspberrypi:~ $ gpio -v ![]()
pi@raspberrypi:~ $ gpio readall ![]() 3.2 編寫代碼
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) ; } } 說明:看看上一小節(jié)的圖,BCM編號(hào)的GPIO17引腳在wiringPi編號(hào)中是1。 3.3 編譯運(yùn)行
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 來中斷循環(huán)。 4. 借助BCM2835 C Library用C語言控制GPIO4.1 下載安裝先看看最新版本:http://www./mikem/bcm2835 ![]()
pi@raspberrypi:~ $ wget http://www./mikem/bcm2835/bcm2835-1.56.tar.gz
pi@raspberrypi:~ $ tar xvzf bcm2835-1.56.tar.gz
進(jìn)入壓縮之后的目錄: pi@raspberrypi:~ $ cd bcm2835-1.56 執(zhí)行配置命令: 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 4.2 編寫代碼
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; } 說明:GPIO的編號(hào)方式不同,采用PCB板的物理接口編號(hào),led連在樹莓派Zero W板子的12引腳上。 4.3 編譯運(yùn)行
pi@raspberrypi:~ $ gcc blink_led.c -o blink_led -l bcm2835 -l bcm2835表示動(dòng)態(tài)加載bcm2835共享庫
sudo ./blink_led 用 Ctrl+C 來中斷循環(huán)。 5. 引腳復(fù)用通過設(shè)置改變引腳的功能,見參考文檔“樹莓派Zero W添加音頻輸出”。 參考文檔晨之清風(fēng):樹莓派介紹?zhuanlan.zhihu.com![]() ![]()
|
|