一、前言
GPIO 是微控制器上面最常用到的周邊(peripheral)之一,本篇將分成上篇(理論篇)與下篇(實作篇),介紹 ESP32 的 GPIO 接腳以及數位輸入輸出的使用。
二、GPIO 簡介
GPIO(General Purpose Input/Output),是微控制器或模組的數位輸入/輸出接腳,也是微控制器上面最常用到,也最通用的周邊(peripheral)之一。我們可以使用GPIO連接外部元件來讀取或控制接腳的狀態,並藉此達成各項功能與操作。舉例來說,當GPIO設定在輸入模式時,可以用來讀取按鈕的狀態或感測器的資料;當GPIO設定在輸出模式時,可以用來控制LED閃爍、調整LED的亮度或馬達運轉的速度等等。
在早期的微控制器上,每一隻 I/O 接腳只能專做輸入或輸出功能,而現代的微控制器除了少部分的接腳仍需保留給系統與特殊用途外,大部分的 I/O 接腳(也就是我們說的 GPIO)都是沒有特定用途的通用接腳,這些接腳可以由程式設定要做為輸入或輸出使用,這也是為什麼 GPIO 的名稱會叫做「通用輸入/輸出」的原因。
三、ESP32 的 GPIO
ESP32 開發板上總共有 38 隻接腳🦶,除了電源和 RESET 腳以外,所有的 I/O 接腳都有 GPIO 的功能。
💡 Tips
如果您使用的是不同型號的ESP32開發板,開發板的接腳數量與可用接腳可能會略有不同。
下圖是ESP32的腳位圖:
電氣特性
● 雖然我們可以透過 USB 的 5V 供電給開發板,但實際上 ESP32 的標準工作電壓是 3.3V,因此任何接腳的輸入和輸出都不能超出 3.3V。數位輸出的高態(HIGH)電壓和ADC輸入的最大電壓也都是 3.3V,和 Arduino 不同,在使用上請務必小心⚠️。
參數 | 最小值 | 標準值 | 最大值 | 單位 |
---|---|---|---|---|
供電電壓 | 3.0 | 3.3 | 3.6 | V |
外部電源供電電流 | 0.5 | – | – | A |
工作溫度 | -40 | – | 85 | °C |
💡 Tips
開發板上有一隻 VIN 5V 的接腳,它的功能與 Ardunio 開發板的 VIN 相同,即提供外部電源輸入。當我們使用USB供電給ESP32時,USB的5V電壓會先藉由穩壓器降壓到3.3V後再提供給ESP32使用。
● 外部電源輸入範圍:4.75V ~ 12V
● 在輸出模式下,高態時單一隻接腳最多可以流出40mA的電流(source current)。低態時最多可以流入28mA的電流(sink current)。
模式 | 電壓準位 | 流出電流 (source current) | 流入電流 (sink current) |
---|---|---|---|
數位輸出 | HIGH (3.3V) | 40mA (Max) | – |
數位輸出 | LOW (0V) | – | 28mA |
特殊接腳
雖然所有的I/O腳位都可以當作GPIO使用,但部分腳位仍然有使用上的限制。
- Flash/PSRAM 通訊接腳:GPIO 6, GPIO 7, GPIO 8, GPIO 9, GPIO 10, GPIO 11 這幾隻接腳都連接到模組內部的 flash/PSRAM,無論是輸入或輸出都不建議使用這些接腳。
- 只能用作輸入的接腳: GPIO 34、GPIO 35、GPIO 36、GPIO 39 只能設定成輸入模式(數位或類比皆可),且沒有內建上拉或下拉功能。
- USB to UART 通訊接腳:GPIO 1 (TX0)和GPIO 3(RX0)用來跟電腦 USB 通訊,若占用的話可能會無法上傳程式,也會沒辦法開啟序列埠監控視窗,因此也不建議使用。
- Strapping 接腳:晶片在啟動或重置的過程中會對 Strapping 接腳進行電壓採樣,復位完成後使用上就與一般接腳無異。GPIO 0, GPIO 2, GPIO 12 與 GPIO 15 都是Strapping接腳,不建議用在需要外部上拉或下拉的場合。
- 其它接腳:有些接腳會在晶片啟動或重置時產生短暫的輸出訊號,如果有作為輸出的元件或模組(例如: 繼電器、LED、蜂鳴器等)連接到這些接腳,可能會在此階段產生非預期的輸出結果。 包含:GPIO 1, GPIO 3, GPIO5, GPIO 6 ~ GPIO 11, GPIO 14, GPIO 15。
- EN/RST 接腳(非GPIO接腳):EN 接腳與開發板上的 EN 按鈕相通,可以透過高或低電位控制 ESP32 的開啟或關閉。正常運作時,EN接腳會接到高電位,若將接腳接地,就會關閉 ESP32 晶片。
- 中斷接腳:所有的 GPIO 接腳都能設定成中斷。
腳位參考表
下表標示綠色為建議使用的腳位,藍色的腳位可以當作一般 GPIO 使用,但是在某些時候需要特別注意,紅色為不建議使用的腳位,詳細的說明可以參考備註欄。
GPIO | 輸入 | 輸出 | 備註 |
---|---|---|---|
0 | OK(預設上拉) | OK | 1. 啟動時必須在高電位 2. 於燒錄模式(flashing mode)時必須保持在低電位 |
1 | TX (USB通訊) | OK | 與電腦UART通訊的接腳 |
2 | OK(預設下拉) | OK | 1. 啟動時必須在低電位 2. 連接到板載LED |
3 | OK | RX (USB通訊) | 與電腦UART通訊的接腳 |
4 | OK | OK | |
5 | OK(預設上拉) | OK | 啟動時必須在高電位 |
6 | X | X | 連接到模組內部的SPI |
7 | X | X | 連接到模組內部的SPI |
8 | X | X | 連接到模組內部的SPI |
9 | X | X | 連接到模組內部的SPI |
10 | X | X | 連接到模組內部的SPI |
11 | X | X | 連接到模組內部的SPI |
12 | OK(預設下拉) | OK | 啟動時必須在低電位 |
13 | OK | OK | |
14 | OK | OK | |
15 | OK(預設上拉) | OK | 啟動時必須在高電位 |
16 | OK | OK | |
17 | OK | OK | |
18 | OK | OK | |
19 | OK | OK | |
20 | OK | OK | |
21 | OK | OK | |
22 | OK | OK | |
23 | OK | OK | |
24 | OK | OK | |
25 | OK | OK | |
26 | OK | OK | |
27 | OK | OK | |
28 | OK | OK | |
29 | OK | OK | |
30 | OK | OK | |
31 | OK | OK | |
32 | OK | OK | |
33 | OK | OK | |
34 | OK | – | 1. 只能設定成輸入模式 2. 沒有內建上拉或下拉功能 |
35 | OK | – | 1. 只能設定成輸入模式 2. 沒有內建上拉或下拉功能 |
36 | OK | – | 1. 只能設定成輸入模式 2. 沒有內建上拉或下拉功能 |
39 | OK | – | 1. 只能設定成輸入模式 2. 沒有內建上拉或下拉功能 |
EN | – | – | 此接腳連接到EN按鈕,按下按鈕(接地)後可以重置 |
🧊 冷知識
ESP32 模組上並沒有 GPIO 37 以及 GPIO 38 接腳。ʅ(´◔౪◔)ʃ
周邊(pheripheral)
ESP32 的實體接腳除了可以當作一般的 GPIO 使用之外,也和其它微控制器一樣支援多種周邊(peripheral)介面,這些介面可以用來和其它感測器、模組或電路溝通。
以下是 ESP32 的周邊:
- 18個 ADC(Analog-to-Digital Converter)通道
- 3個 SPI 介面
- 3個 UART 介面
- 2個 I2C 介面
- 16個 PWM 輸出通道
- 2個 DAC (Digital-to-Analog Converters)
- 2個 I2S 介面
- 10個 電容感測器接腳
與 Arduino UNO 不同的是,ESP32有接腳多工(pin multiplexing)的功能,它可以讓我們自己指定周邊到任何 GPIO 接腳。在所有的周邊中,SPI、I2C、UART、PWM 和 DAC 都可以使用軟體指定接腳,只有 ADC 和電容感測器需要與特定的接腳綁定(請見ESP32腳位圖),這個功能的最大優點是可以在不改變物理接腳的情況下進行修改,也可以讓硬體規劃與設計更靈活。
💡 Tips
當開啟 Wi-Fi 功能時,會佔據 ADC2 的資源。如果要同時使用 Wi-Fi 和 ADC 功能,建議使用 ADC1 的 GPIO 資源。
四、使用 ESP32 GPIO 的注意事項
- ESP32 晶片使用的是 3.3V 的電壓,使用模組或是連接元件時請不要超過 3.3V。
- 接腳輸出最多 40mA,輸入最多 28mA,若超出最大值容易損壞接腳及元件。
- 開啟 Wi-Fi 功能時會占用 ADC2 腳位,但可以使用 ADC1 量測。
- GPIO 34, GPIO 35, GPIO 36, GPIO 39只能做為輸入使用,且沒有內建上拉或下拉電阻。
- 不建議使用的接腳:GPIO 6, GPIO 7, GPIO 8, GPIO 9, GPIO 10, GPIO 11。
五、小結
這篇文章介紹了 ESP32 的 GPIO 接腳、電器特性以及使用限制和注意事項,下一篇文章將以實作的方式說明數位輸入/輸出的控制語法,以及如何使用內建的上拉與下拉電阻簡化電路。