樹莓派開發系列教程9——樹莓派GPIO控制


一、常用開源工程簡介

    樹莓派核心中已經編譯自帶了gpio的驅動,我們常通過一些第三方寫好的庫函式來完成具體的操作,比較常見的操作庫函式有:

1、python GPIO

    【開發語言】——python

    【簡單介紹】——樹莓派官方資料中推薦且容易上手。python GPIO是一個小型的python庫,可以幫助使用者完成raspberry相關IO口操作,但是python GPIO庫還沒有支援SPI、I2C或者1-wire等匯流排介面。

    【官方網站】—— https://code.google.com/p/raspberry-gpio-python/

2、wiringPi

    【開發語言】——C語言

    【簡單介紹】——wiringPi適合那些具有C語言基礎,在接觸樹莓派之前已經接觸過微控制器或者嵌入式開發的人群。wiringPi的API函式和arduino非常相似,這也使得它廣受歡迎。作者給出了大量的說明和示例程式碼,這些示例程式碼也包括UART裝置,I2C裝置和SPI裝置等。

    【官方網站】—— http://wiringpi.com/

3、BCM2835 C Library

    【開發語言】——C語言

    【簡單介紹】BCM2835 C Library可以理解為使用C語言實現的相關底層驅動,BCM2835 C Library的驅動庫包括GPIO、SPI和UART等,可以通過學習BCM2835 C Library熟悉BCM2835相關的暫存器操作。如果有機會開發樹莓派上的linux驅動,或自主開發python或PHP擴充套件驅動,可以從BCM2835 C Library找到不少的“靈感”。

    【官方網站】—— http://www.airspayce.com/mikem/bcm2835/

二、樹莓派GPIO編號方式

1、功能物理引腳:

從左到右,從上到下:左邊基數,右邊偶數:1-40

2、BCM:

編號側重CPU暫存器,根據BCM2835的GPIO暫存器編號。

3、wpi:

  編號側重實現邏輯,把擴充套件GPIO埠從0開始編號,這種編號方便程式設計。正如圖3 WiringPi一欄。


三、python GPIO

1、先安裝python-dev,輸入以下指令。

  sudo
apt-get install python-dev


2、安裝RPi.GPIO,依次輸入以下指令。

1)下載:$ wget http://raspberry-gpio-python.googlecode.com/files/RPi.GPIO-0.5.3a.tar.gz

2)解壓縮:$ tar xvzf RPi.GPIO-0.5.3a.tar.gz

3)進入解壓之後的目錄 :$ cd RPi.GPIO-0.5.3a
4)啟動安裝 :$ sudo python setup.py install

3、例子:

  1. # -*- coding: utf-8 -*-    
  2.  import RPi.GPIO as GPIO    
  3.  import time    
  4.  # BOARD編號方式,基於插座引腳編號    
  5.  GPIO.setmode(GPIO.BOARD)    
  6.  # 輸出模式    
  7.  GPIO.setup(11, GPIO.OUT)    
  8.      
  9.  while True:    
  10.      GPIO.output(11, GPIO.HIGH)    
  11.      time.sleep(1)    
  12.      GPIO.output(11, GPIO.LOW)    
  13.      time.sleep(1)   
   # -*- 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) 

4、執行:
sudo python led.py

5、說明:
1)GPIO.setmode(GPIO.BOARD),採用插座引腳編號方式。
2)由於採用插座引腳編號方式,此處的11腳相當於BCM2835暫存器編號方式的引腳11。

四、python GPIO
1、說明:
    WiringPi是應用於樹莓派平臺的GPIO控制庫函式,WiringPi遵守GUN Lv3。wiringPi使用C或者C 開發並且可以被其他語言包轉,例如python、ruby或者PHP等。
    wiringPi包括一套gpio控制命令,使用gpio命令可以控制樹莓派GPIO管腳。使用者可以利用gpio命令通過shell指令碼控制或查詢GPIO管腳。wiringPi是可以擴充套件的,可以利用wiringPi的內部模組擴充套件模擬量輸入晶片,可以使用MCP23x17/MCP23x08(I2C 或者SPI)擴充套件GPIO介面。另外可通過樹莓派上的串列埠和Atmega(例如arduino等)擴充套件更多的GPIO功能。另外,使用者可以自己編寫擴充套件模組並把自定義的擴充套件模組整合到wiringPi中。WiringPi支援模擬量的讀取和設定功能,不過在樹莓派上並沒有模擬量裝置。但是使用WiringPi中的軟體模組卻可以輕鬆地應用AD或DA晶片。

2.wiringPi安裝
1)方案A——使用GIT工具

通過GIT獲得wiringPi的原始碼

git clone git://git.drogon.net/wiringPi
cd wiringPi
./build
build指令碼會幫助你編譯和安裝wiringPi

2)方案B——直接下載
我們可以在https://git.drogon.net/?p=wiringPi;a=summary網站上直接下載最新版本編譯使用

tar xfz wiringPi-xx.tar.gz
cd wiringPi-xx
./build

3、測試:

wiringPi包括一套gpio命令,使用gpio命令可以控制樹莓派上的各種介面,通過以下指令可以測試wiringPi是否安裝成功。
$gpio -v
$gpio readall

即可出現上面的io圖

4、例子:

  1. #include <wiringPi.h>    
  2. int main(void)    
  3. {    
  4.   wiringPiSetup() ;    
  5.   pinMode (0, OUTPUT) ;    
  6.   for(;;)     
  7.   {    
  8.     digitalWrite(0, HIGH) ; delay (500) ;    
  9.     digitalWrite(0,  LOW) ; delay (500) ;    
  10.   }    
  11. }   
#include <wiringPi.h>  
int main(void)  
{  
wiringPiSetup() ;  
pinMode (0, OUTPUT) ;  
for(;;)   
{  
digitalWrite(0, HIGH) ; delay (500) ;  
digitalWrite(0,  LOW) ; delay (500) ;  
}  
} 

5、編譯執行:
在樹莓派上:
gcc -Wall -o test test.c -lwiringPi
sudo ./test

在虛擬機器中:
am-linux-gcc -Wall -o test test.c -lwiringPi
sudo ./test

6、注意事項:
1)IO的編號方式略有不同,採用wiring編碼方式。
2)-lwiringPi表示動態載入wiringPi共享庫。

五、BCM2835 C Library

1、下載:               $ wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.35.tar.gz

2、解壓縮:             $tar xvzf bcm2835-1.35.tar.gz
3、進入壓縮之後的目錄:$cd bcm2835-1.35
4、 配置:              $./configure
5、從原始碼生成安裝包:$make
6、執行檢查:           $sudo make check
7、安裝 bcm2835庫:    $sudo make install

8、例子

  1. #include <bcm2835.h>    
  2.     
  3. // P1插座第11腳    
  4. #define PIN RPI_GPIO_P1_11    
  5.     
  6. int main(int argc, char **argv)    
  7. {    
  8.   if (!bcm2835_init())    
  9.   return 1;    
  10.     
  11.   // 輸出方式    
  12.   bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_OUTP);    
  13.     
  14.   while (1)    
  15.   {    
  16.     bcm2835_gpio_write(PIN, HIGH);    
  17.     bcm2835_delay(100);    
  18.         
  19.     bcm2835_gpio_write(PIN, LOW);    
  20.     bcm2835_delay(100);    
  21.   }    
  22.   bcm2835_close();    
  23.   return 0;    
  24. }   
#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;  
} 

9、注意事項:
1)IO的編號方式略有不同,採用wiring編碼方式。
2)-lwiringPi表示動態載入wiringPi共享庫。

六、文章參考以下連結
http://elinux.org/RPi_Low-level_peripherals
http://blog.csdn.net/xukai871105/article/details/23115627