樹莓派的 GPIO (General Purpose Input Output, 通用輸出入介面) 是樹莓派與外界感測器 (sensor, 例如溫溼度, 亮度, 聲音, 氣壓等) 與致動器 (actuator, 例如馬達, LED, 繼電器等) 溝通的介面, 早期第一代樹莓派 Pi B+ 的 GPIO 為 26 支接腳, 但 Pi 2 之後的樹莓派板子則都是 40 支腳, 前 26 支接腳與 Pi B+ 的完全一樣 (即腳位相容), 因此以前為 Pi 1 B+ 所寫的 GPIO 程式仍可在 Pi 2 以後的樹莓派上順利執行, 參考 :
參考書籍 :
# Beginning Robotics with Raspberry Pi and Arduino (Apress, 2020)
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 型轉板 (擴展板). 參考 :
# T型GPIO擴展板+樹莓派40P排線 $175
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) 等晶片.
參考 :
沒有留言:
張貼留言