2021年1月27日 星期三

樹莓派學習筆記 : GPIO 輸出入介面

樹莓派的 GPIO (General Purpose Input Output, 通用輸出入介面) 是樹莓派與外界感測器 (sensor, 例如溫溼度, 亮度, 聲音, 氣壓等) 與致動器 (actuator, 例如馬達, LED, 繼電器等) 溝通的介面, 早期第一代樹莓派 Pi B+ 的 GPIO 為 26 支接腳, 但 Pi 2 之後的樹莓派板子則都是 40 支腳, 前 26 支接腳與 Pi B+ 的完全一樣 (即腳位相容), 因此以前為 Pi 1 B+ 所寫的 GPIO 程式仍可在 Pi 2 以後的樹莓派上順利執行, 參考 :


參考書籍 :



1. GPIO 硬體接腳配置 : 

GPIO 腳的編號方式有兩種 : 
  • BCM : 與 CPU 的 IO 腳編號相同.
  • BOARD : 腳座在上, 下排最左為腳 1, 上排最左為 2, 上下交替排列至上排最右為腳 40.
通常使用 BCM 編號較方便. 




配合 RPi.GPIO 模組, 部分 GPIO 接腳有特定用途, 如下表所示  : 


 特定功能 說明
 UART 14 (TX), 15 (RX)
 I2C 0 (EEPROM Data), 1 (EEPROM clock), 2 (SDA), 3 (SCL)
 SPI0 7 (CE1), 8 (CE0), 9 (MISO), 10 (MOSI), 11 (SCLK) 
 SPI1 16 (CE2), 17 (CE1), 18 (CE2), 19 (MISO), 20 (MOSI), 21 (SCLK)
 PWM  12, 13, 18, 19 (硬體 PWM), 全部 GPIO 均可軟體設定為 PWM 功能


注意, 硬體 PWM 能提供誤差較小且穩定的輸出 (伺服馬達控制需要穩定之 PWM), 目前 RPi.GPIO 尚未支援硬體 PWM, 但 WiringPi2 函式庫則有. 其次, 基本上 SPI 有 MOSI,MISO, SCLK 與 SS (Slave Select) 這四支腳, SS 腳用來致能 (enable) 特定裝置 (即 Slave 設備) 用的, 但樹莓派不用 SS 這名稱,而是用 CE (chip select).

參考 : 


這些 GPIO 腳可用母-公杜邦線接到麵包板, 若杜邦線不夠長, 也可以先用 40P 母-母排線全部接出來, 再用公-公杜邦線接到麵包板上, 或搭配 T 型轉板 (擴展板).  參考 :



2. RPi.GPIO 模組 : 

樹莓派使用 RPi.GPIO 套件控制 GPIO 接腳, 此套件已內建於樹莓派 Raspbian 作業系統的 Python 中毋須安裝, 直接 import 即可使用 : 

>>> import RPi.GPIO as GPIO   
>>> GPIO.VERSION            #檢視 RPi.GPIO 版本 (也可以在終端機下 pip3 list)
'0.6.3'   
>>> dir(GPIO)      #檢視物件內容
['BCM', 'BOARD', 'BOTH', 'FALLING', 'HARD_PWM', 'HIGH', 'I2C', 'IN', 'LOW', 'OUT', 'PUD_DOWN', 'PUD_OFF', 'PUD_UP', 'PWM', 'RISING', 'RPI_INFO', 'RPI_REVISION', 'SERIAL', 'SPI', 'UNKNOWN', 'VERSION', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'add_event_callback', 'add_event_detect', 'cleanup', 'event_detected', 'getmode', 'gpio_function', 'input', 'output', 'remove_event_detect', 'setmode', 'setup', 'setwarnings', 'wait_for_edge']

目前最新版本為 0.7.0, 可以直接用 pip 附 upgrade 參數升級 RPi.GPIO 版本 : 

sudo pip install --upgrade RPi.GPIO

pi@raspberrypi:~ $ sudo pip install --upgrade RPi.GPIO    
Collecting RPi.GPIO
  Downloading https://www.piwheels.org/simple/rpi-gpio/RPi.GPIO-0.7.0-cp35-cp35m-linux_armv7l.whl (67kB)
Installing collected packages: RPi.GPIO
  Found existing installation: RPi.GPIO 0.6.3
    Not uninstalling rpi.gpio at /usr/lib/python3/dist-packages, outside environment /usr
Successfully installed RPi.GPIO-0.7.0

安裝好後再次進入 Python 環境檢查 :

pi@raspberrypi:~ $ python   
Python 3.5.3 (default, Sep 27 2018, 17:25:39)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import RPi.GPIO as GPIO   
>>> GPIO.VERSION    
'0.7.0'   

可見確實已升級到最新版本.

參考 : 


但要注意的是, 由於 Linux 是多人多工作業系統, 所以 RPi.GPIO 模組不適合用在實時控制 (real time) 的場合, 對 timing 要求很高的話應該改用 RTOS 作業系統. 


3. 上拉電阻與下拉電阻 : 

GPIO數位輸入腳時應該視功能需要 (即預設值) 添加一個上拉電阻 (pull-up, 低態動作時) 或下拉電阻 (pull-down, 高態動作時), 如果懸空的話其位準為不確定, 雖然對於 CMOS 來說通常會是 High, 但那並不保證, 可能造成程式執行結果異常, 因為懸空的輸入腳宛如天線, 電磁干擾會使其處於非預期的位準. 外加的上拉或下拉電阻建議不要低於 10K 歐姆 (特別是電池供電時). 

樹莓派的 CPU 本身有內建上拉電阻或下拉電阻 (預設關閉, 需設定才會開啟), 利用此功能可以不需用外加電阻即可達到避免接腳浮接 (floating) 造成的位準不確定問題. 不過哪支 GPIO 腳具有上拉或下拉電阻是特定的, GPIO 0~8 內建上拉電阻, 而 GPIO 9~27 內建下拉電阻 : 


 內建電阻 GPIO 腳 (BCM 編號)
 上拉電阻 0 ~ 8
 下拉電阻 9 ~ 27


內建上拉與下拉電阻值大約是 50K~65K 歐姆 (接內部的 3.3V 或 GND), 但 GPIO2 與 GPIO3 例外, 因為此二腳內定為 I2C 的 SDA 與 SCL 接腳, 內部固定為 1.8K 歐姆上拉電阻, 且無法用軟體取消. 參考 :



4. 類比輸出入 : 

樹莓派 GPIO 全部都是數位輸出入腳, 沒有提供類比輸出入腳, 必須透過外接晶片支援類比輸出與讀取, 例如讀取類比輸入可用 MCP 3004/3008 (ADC),  輸出類比信號可用 MCP 4901/4911/4912 (DAC) 等晶片. 

參考 : 

沒有留言 :