Raspberry Pi 筆記(2):GPIO接腳與 I2C 及 SPI 安裝

Raspberry Pi支援輸入和輸出的控制,想學Raspberry Pi控制LED、步進馬達及繼電器等元件,就跟Arduino一樣,做一些自動控制的東西,於是動手收集Raspberry Pi控制輸入和輸出有關的資訊以及如何在Raspberry Pi安裝工具程式。
Raspberry Pi提供GPIO (General Purpose Input/Output)通用介面,可以透過程式做輸入或輸出的行為控制。Raspberry Pi的版子有2.54 mm 26-pin 的擴充頭,共有2排13個存取點,除了5V、3.3V及接地等pin外,還有其他17個可作為控制的pin腳,包括:

  • 8個 GPIO pin
  • 2個 UART pin
  • 2個 I2C pin
  • 5個 SPI pin




[UART通用非同步收發傳輸器]

UART (Universal Asynchronous Receiver/Transmitter)是一種非同步收發傳輸器,是電腦硬體的一部分,將資料由串列通信與並行通信間作傳輸轉換,最常見的是 RS232。UART訊框包括起始位元、資料位元、同位檢查位元、停止位元。UART包括RS232、RS449、RS423、RS422和RS485等介面和匯流排標準規範。


[I2C] 

I2C (Inter-Integrated Circuit)是一種串列通訊匯流排,使用多主從架構,由飛利浦公司在1980年代為了讓主機板、嵌入式系統或手機用以連接低速週邊裝置而發展。I2C的正確讀法為"I-squared-C"。I2C被應用在簡單的週邊,一些常見的應用如下:
  • 為了保存使用者的設定而存取NVRAM晶片。
  • 存取低速的數字模擬轉換器(DAC)。
  • 存取低速的模擬數字轉換器(ADC)。
  • 改變監視器的對比度、色調及色彩平衡設定(視訊資料通道)。
  • 改變音量大小。
  • 取得硬體監視及診斷資料,例如中央處理器的溫度及風扇轉速。
  • 讀取實時時鐘(Real-time clock)。
  • 在系統設備中用來開啟或關閉電源供應。

I2C的另一個強大用途在於微控制器的應用,利用兩根通用的輸入輸出接腳及軟體的規劃,可以讓微控制器控制一個小型網路。

週邊可以在系統仍然在運作的同時加入或移出匯流排,這代表對於有熱插拔需求的裝置而言是個理想的匯流排。

像I2C這樣的匯流排之所以流行起來,是因為電腦工程師發現到對於整合電路設計而言,許多的製造成本源自於封裝尺寸及接腳數量。更小的包裝通常能夠減少重量及電源的消耗,這對於行動電話及手持式電腦而言格外重要。

常見使用I2C進行通訊的模組有:
  • 1602- 6 x 2- LCD液晶模組
  • DS1302 Real Time Clock Board
  • 1.24吋 4位7段顯示器
  • OLED顯示螢幕 128*64
  • BME280 溫濕度及壓力感測器
  • 三軸加速度計- ADXL345 (I2C/SPI)

[SPI序列周邊介面匯流排]

SPI (Serial Peripheral Interface Bus),類似I²C,是一種4線同步序列資料協定,適用於可攜式裝置平臺系統,但使用率較 I²C少。SPI匯流排定義四組 logic signals:
  • SCLK—Serial Clock(自master輸出)
  • MOSI/SIMO—Master Output, Slave Input(自master輸出)
  • MISO/SOMI—Master Input, Slave Output(自slave輸出)
  • SS—Slave Select(active low;自master輸出)
要讓Raspberry Pi執行這三種控制,必須分別安裝對應的函數庫:GPIO可安裝RPi.GPIO或WiringPi,I²C需安裝 i2c-tools。
RPi.GPIO套件用來提供Raspberry Pi的GPIO控制,這個套件模組不適用於Real-time或要求比較高的應用程式,因為無法預測Python何時要忙碌,也由於需要Linux核心才能運作,較不適合即時或要求較高的程式。假使要求這些,可以改用 Arduino 。RPi.GPIO目前不支援SPI、I²C、PWM及串列通訊。您可參考:https://pypi.python.org/pypi/RPi.GPIO
WiringPi是一個存取GPIO的函數庫,以C語言寫成,讓Raspberry Pi的BCM2835晶片使用。WiringPi的語法跟Arduino很類似,同時可使用命令列的gpio指令,用來控制GPIO Pin腳,可以將命令列指令寫成shell scripts來控制Pin腳。相關資料可參考:http://wiringpi.com

[安裝RPi.GPIO]

RPi.GPIO各版本程式放在Python Package網站,下載位置:https://pypi.python.org/pypi/RPi.GPIO ,安裝方法如下:
$ sudo apt-get install python-dev
$ wget https://pypi.python.org/packages/source/R/RPi.GPIO/RPi.GPIO-0.5.4.tar.gz
$ tar xvzf RPi.GPIO-0.5.4.tar.gz
$ cd RPi.GPIO-0.5.4
$ sudo python setup.py install

安裝完成的畫面如下:

或輸入以下指令自動安裝:
$ sudo apt-get install python-rpi.gpio

可以列出目前GPIO的編號的指令及其結果
$ pinout




[安裝 I2C]

• 編輯文字檔 /etc/modules
$ sudo nano /etc/modules
加入以下兩行:
 i2c-bcm2708
 i2c-dev

• 再執行以下安裝程式指令:
$ sudo apt-get install python-smbus
$ sudo apt-get install i2c-tools

• 修改 raspi-blacklist.conf 檔案:
$ sudo nano /etc/modprobe.d/raspi-blacklist.conf

• 將以下兩行加上註解符號:
# blacklist spi-bcm2708
# blacklist i2c-bcm2708

• 當連接上I2C設備後,新的 Pi B版本可用下列指令察看:
$ sudo i2cdetect -y -a 1

• 舊的版本可用下列指令察看
$ sudo i2cdetect -y -a 0

如果出現以下的畫面,表示已經安裝成功。

一般用在控制Raspberry Pi 上的GPIO語言,常見使用有 Python 、Java以及 C語言,也有人直接使用Shell script來寫GPIO控制程式。

[安裝 SPI]

$ sudo vi /etc/modules
在最後一行加入 spidev

$ sudo vi /etc/modprobe.d/raspi-blacklist.conf
在blacklist spi-bcm2708 前加上#,變成
#blacklist spi-bcm2708

安裝SPI程式
$ sudo apt-get install python-dev
$ git clone git://github.com/doceme/py-spidev
$ cd py-spidev/
$ sudo python setup.py install

重新開機即可啟用SPI。

[參考資料]

3 留言

  1. 您好!
    想請問我是用Pi搭配spi介面的無線傳輸模組作測試
    近期要使用sensor時發現是ADC的 於是購買了MCP3008數位類比轉換的IC
    但該IC也是SPI介面的,想請問這樣使用會有問題嗎 ?

    回覆刪除
  2. 怎覺得你的貼圖跟說明都不相符??

    回覆刪除
  3. 安裝SPI程式:
    ...
    git clone https://github.com/doceme/py-spidev.git
    ...

    回覆刪除

張貼留言

較新的 較舊