ESP32 教學系列(三):數位輸入與輸出-原理篇

ESP32 教學系列(三):數位輸入與輸出(上)

一、前言

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的腳位圖:

ESP32 教學系列(三):數位輸入與輸出(上)

電氣特性

● 雖然我們可以透過 USB 的 5V 供電給開發板,但實際上 ESP32 的標準工作電壓是 3.3V,因此任何接腳的輸入和輸出都不能超出 3.3V。數位輸出的高態(HIGH)電壓和ADC輸入的最大電壓也都是 3.3V,和 Arduino 不同,在使用上請務必小心⚠️。

參數最小值標準值最大值單位
供電電壓3.03.33.6V
外部電源供電電流0.5A
工作溫度-4085°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輸入輸出備註
0OK(預設上拉)OK1. 啟動時必須在高電位
2. 於燒錄模式(flashing mode)時必須保持在低電位
1TX (USB通訊)OK與電腦UART通訊的接腳
2OK(預設下拉)OK1. 啟動時必須在低電位
2. 連接到板載LED
3OKRX (USB通訊)與電腦UART通訊的接腳
4OKOK
5OK(預設上拉)OK啟動時必須在高電位
6XX連接到模組內部的SPI
7XX連接到模組內部的SPI
8XX連接到模組內部的SPI
9XX連接到模組內部的SPI
10XX連接到模組內部的SPI
11XX連接到模組內部的SPI
12OK(預設下拉)OK啟動時必須在低電位
13OKOK
14OKOK
15OK(預設上拉)OK啟動時必須在高電位
16OKOK
17OKOK
18OKOK
19OKOK
20OKOK
21OKOK
22OKOK
23OKOK
24OKOK
25OKOK
26OKOK
27OKOK
28OKOK
29OKOK
30OKOK
31OKOK
32OKOK
33OKOK
34OK1. 只能設定成輸入模式
2. 沒有內建上拉或下拉功能
35OK1. 只能設定成輸入模式
2. 沒有內建上拉或下拉功能
36OK1. 只能設定成輸入模式
2. 沒有內建上拉或下拉功能
39OK1. 只能設定成輸入模式
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 接腳、電器特性以及使用限制和注意事項,下一篇文章將以實作的方式說明數位輸入/輸出的控制語法,以及如何使用內建的上拉與下拉電阻簡化電路。