Распиновка ESP32: какие GPIO пины следует использовать?
Чип ESP32 имеет 48 выводов с множеством функций. Не все выводы доступны на всех платах разработки ESP32, и некоторые выводы нельзя использовать.
Возникает множество вопросов о том, как использовать GPIO ESP32. Какие пины следует использовать? Каких пинов следует избегать в своих проектах? Данная статья призвана стать простым и удобным справочным руководством по GPIO ESP32.
На рисунке ниже показана распиновка ESP-WROOM-32. Вы можете использовать её как справочник, если используете чип ESP32 для создания собственной платы:
Примечание: не все GPIO доступны на всех платах разработки, но каждый конкретный GPIO работает одинаково независимо от используемой платы. Если вы только начинаете работу с ESP32, рекомендуем прочитать наше руководство: Начало работы с платой разработки ESP32.
Периферийные устройства ESP32
Периферийные устройства ESP32 включают:
2 цифро-аналоговых преобразователя (ЦАП)
2 интерфейса I2S
АЦП (аналого-цифровой преобразователь) и ЦАП (цифро-аналоговый преобразователь) привязаны к конкретным статическим пинам. Однако вы можете сами решить, какие пины будут UART, I2C, SPI, PWM и т.д. – вам просто нужно назначить их в коде. Это возможно благодаря функции мультиплексирования чипа ESP32.
Хотя вы можете задать свойства пинов программно, существуют пины, назначенные по умолчанию, как показано на следующем рисунке (это пример для платы ESP32 DEVKIT V1 DOIT с 36 пинами – расположение пинов может отличаться в зависимости от производителя).
Кроме того, существуют пины с определёнными особенностями, которые делают их пригодными или непригодными для конкретного проекта. В следующей таблице показано, какие пины лучше всего использовать в качестве входов, выходов, и к каким нужно относиться с осторожностью.
Пины, выделенные зелёным, можно свободно использовать. Пины, выделенные жёлтым, можно использовать, но нужно быть внимательным, так как они могут вести себя неожиданно, особенно при загрузке. Пины, выделенные красным, не рекомендуется использовать в качестве входов или выходов.
GPIO |
Вход |
Выход |
Примечания |
|---|---|---|---|
0 |
подтянут вверх |
OK |
выдаёт ШИМ-сигнал при загрузке, должен быть LOW для входа в режим прошивки |
1 |
TX пин |
OK |
вывод отладки при загрузке |
2 |
OK |
OK |
подключён к встроенному светодиоду, должен быть в плавающем состоянии или LOW для входа в режим прошивки |
3 |
OK |
RX пин |
HIGH при загрузке |
4 |
OK |
OK |
|
5 |
OK |
OK |
выдаёт ШИМ-сигнал при загрузке, strapping-пин |
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 |
загрузка не удастся при подтяжке вверх, strapping-пин |
13 |
OK |
OK |
|
14 |
OK |
OK |
выдаёт ШИМ-сигнал при загрузке |
15 |
OK |
OK |
выдаёт ШИМ-сигнал при загрузке, strapping-пин |
16 |
OK |
OK |
|
17 |
OK |
OK |
|
18 |
OK |
OK |
|
19 |
OK |
OK |
|
21 |
OK |
OK |
|
22 |
OK |
OK |
|
23 |
OK |
OK |
|
25 |
OK |
OK |
|
26 |
OK |
OK |
|
27 |
OK |
OK |
|
32 |
OK |
OK |
|
33 |
OK |
OK |
|
34 |
OK |
только вход |
|
35 |
OK |
только вход |
|
36 |
OK |
только вход |
|
39 |
OK |
только вход |
Продолжайте чтение для более подробного анализа GPIO ESP32 и их функций.
Пины только для входа
GPIO 34-39 – это GPI (пины только для входа). У этих пинов нет встроенных подтягивающих резисторов (pull-up или pull-down). Их нельзя использовать как выходы, поэтому используйте эти пины только как входы:
GPIO 34
GPIO 35
GPIO 36
GPIO 39
SPI флеш-память, интегрированная в ESP-WROOM-32
GPIO 6 – GPIO 11 выведены на некоторых платах разработки ESP32. Однако эти пины подключены к встроенной SPI флеш-памяти на чипе ESP-WROOM-32, и их не рекомендуется использовать для других целей. Поэтому не используйте эти пины в своих проектах:
GPIO 6 (SCK/CLK)
GPIO 7 (SDO/SD0)
GPIO 8 (SDI/SD1)
GPIO 9 (SHD/SD2)
GPIO 10 (SWP/SD3)
GPIO 11 (CSC/CMD)
Ёмкостные сенсорные GPIO
ESP32 имеет 10 встроенных ёмкостных сенсоров. Они могут определять изменения в любом объекте, несущем электрический заряд, например, в коже человека. Таким образом, они могут обнаруживать изменения, возникающие при прикосновении пальцем к GPIO. Эти пины легко интегрируются в ёмкостные панели и могут заменить механические кнопки. Ёмкостные сенсорные пины также могут использоваться для пробуждения ESP32 из глубокого сна.
Встроенные сенсоры подключены к следующим GPIO:
T0 (GPIO 4)
T1 (GPIO 0)
T2 (GPIO 2)
T3 (GPIO 15)
T4 (GPIO 13)
T5 (GPIO 12)
T6 (GPIO 14)
T7 (GPIO 27)
T8 (GPIO 33)
T9 (GPIO 32)
Узнайте, как использовать сенсорные пины в Arduino IDE: ESP32 Touch Pins with Arduino IDE
Аналого-цифровой преобразователь (АЦП)
ESP32 имеет 18 каналов 12-битного АЦП (тогда как ESP8266 имеет только 1 канал 10-битного АЦП). Вот GPIO, которые можно использовать как АЦП, и соответствующие каналы:
ADC1_CH0 (GPIO 36)
ADC1_CH1 (GPIO 37)
ADC1_CH2 (GPIO 38)
ADC1_CH3 (GPIO 39)
ADC1_CH4 (GPIO 32)
ADC1_CH5 (GPIO 33)
ADC1_CH6 (GPIO 34)
ADC1_CH7 (GPIO 35)
ADC2_CH0 (GPIO 4)
ADC2_CH1 (GPIO 0)
ADC2_CH2 (GPIO 2)
ADC2_CH3 (GPIO 15)
ADC2_CH4 (GPIO 13)
ADC2_CH5 (GPIO 12)
ADC2_CH6 (GPIO 14)
ADC2_CH7 (GPIO 27)
ADC2_CH8 (GPIO 25)
ADC2_CH9 (GPIO 26)
Узнайте, как использовать пины АЦП ESP32:
Примечание: пины ADC2 нельзя использовать при работе Wi-Fi. Поэтому, если вы используете Wi-Fi и у вас возникают проблемы с получением значений от GPIO ADC2, попробуйте использовать вместо этого GPIO ADC1. Это должно решить вашу проблему.
Входные каналы АЦП имеют 12-битное разрешение. Это означает, что вы можете получать аналоговые показания в диапазоне от 0 до 4095, где 0 соответствует 0В, а 4095 – 3,3В. Вы также можете настроить разрешение каналов и диапазон АЦП в коде.
Пины АЦП ESP32 не имеют линейного поведения. Вы, скорее всего, не сможете различить значения между 0 и 0,1В или между 3,2 и 3,3В. Это нужно учитывать при использовании пинов АЦП. Поведение будет похоже на то, что показано на следующем рисунке.
Цифро-аналоговый преобразователь (ЦАП)
ESP32 имеет 2 канала 8-битного ЦАП для преобразования цифровых сигналов в аналоговое напряжение. Вот каналы ЦАП:
DAC1 (GPIO25)
DAC2 (GPIO26)
RTC GPIO
ESP32 поддерживает RTC GPIO. GPIO, маршрутизированные в подсистему низкого энергопотребления RTC, могут использоваться, когда ESP32 находится в режиме глубокого сна. Эти RTC GPIO могут использоваться для пробуждения ESP32 из глубокого сна, когда работает сопроцессор сверхнизкого энергопотребления (ULP). Следующие GPIO могут использоваться как внешний источник пробуждения:
RTC_GPIO0 (GPIO36)
RTC_GPIO3 (GPIO39)
RTC_GPIO4 (GPIO34)
RTC_GPIO5 (GPIO35)
RTC_GPIO6 (GPIO25)
RTC_GPIO7 (GPIO26)
RTC_GPIO8 (GPIO33)
RTC_GPIO9 (GPIO32)
RTC_GPIO10 (GPIO4)
RTC_GPIO11 (GPIO0)
RTC_GPIO12 (GPIO2)
RTC_GPIO13 (GPIO15)
RTC_GPIO14 (GPIO13)
RTC_GPIO15 (GPIO12)
RTC_GPIO16 (GPIO14)
RTC_GPIO17 (GPIO27)
Узнайте, как использовать RTC GPIO для пробуждения ESP32 из глубокого сна: ESP32 Deep Sleep with Arduino IDE and Wake Up Sources
ШИМ (PWM)
Контроллер ШИМ светодиодов ESP32 имеет 16 независимых каналов, которые можно настроить для генерации ШИМ-сигналов с различными параметрами. Все пины, которые могут работать как выходы, могут использоваться как ШИМ-пины (GPIO 34-39 не могут генерировать ШИМ).
Для настройки ШИМ-сигнала необходимо задать в коде следующие параметры:
Частота сигнала;
Скважность (duty cycle);
Канал ШИМ;
GPIO, на который вы хотите вывести сигнал.
Узнайте, как использовать ШИМ ESP32 в Arduino IDE: ESP32 PWM with Arduino IDE
I2C
ESP32 имеет два канала I2C, и любой пин может быть настроен как SDA или SCL. При использовании ESP32 с Arduino IDE пины I2C по умолчанию:
GPIO 21 (SDA)
GPIO 22 (SCL)
Если вы хотите использовать другие пины при работе с библиотекой Wire, просто вызовите:
Wire.begin(SDA, SCL);
Подробнее о протоколе связи I2C с ESP32 в Arduino IDE: ESP32 I2C Communication (Set Pins, Multiple Bus Interfaces and Peripherals)
Дополнительные руководства по I2C с ESP32:
SPI
По умолчанию назначение пинов для SPI следующее:
SPI |
MOSI |
MISO |
CLK |
CS |
|---|---|---|---|---|
VSPI |
GPIO 23 |
GPIO 19 |
GPIO 18 |
GPIO 5 |
HSPI |
GPIO 13 |
GPIO 12 |
GPIO 14 |
GPIO 15 |
Подробнее о протоколе связи SPI с ESP32 в Arduino IDE: ESP32 SPI Communication: Set Pins, Multiple SPI Bus Interfaces, and Peripherals (Arduino IDE)
UART
ESP32 поддерживает до трёх интерфейсов UART: UART0, UART1 и UART2, в зависимости от модели платы ESP32.
UART0 обычно зарезервирован для связи с монитором порта во время загрузки и отладки. Однако вы также можете использовать его для связи с другими устройствами после загрузки кода, если монитор порта не нужен.
UART1 и UART2: доступны для связи с внешними устройствами.
Как и I2C и SPI, эти пины UART могут быть назначены на любой GPIO ESP32. Однако на большинстве моделей плат они имеют назначение по умолчанию.
Для большинства плат ESP32 назначение пинов UART следующее:
Порт UART |
TX |
RX |
Примечания |
|---|---|---|---|
UART0 |
GPIO 1 |
GPIO 3 |
Используется для монитора порта и загрузки кода; может быть назначен на другие GPIO; |
UART1 |
GPIO 10 |
GPIO 9 |
Должен быть назначен на другие GPIO |
UART2 |
GPIO 17 |
GPIO 16 |
Может быть назначен на другие GPIO |
О UART1 (GPIO 9 и GPIO 10) – эти GPIO подключены к SPI флеш-памяти ESP32, поэтому вы не можете использовать их напрямую. Чтобы использовать UART1 для связи с другими устройствами, необходимо назначить другие пины с помощью библиотеки HardwareSerial.
Подробнее о UART с ESP32: ESP32 UART Communication (Serial): Set Pins, Interfaces, Send and Receive Data (Arduino IDE)
Если вы используете ESP32-S3, назначение пинов совершенно другое. Ознакомьтесь с распиновкой ESP32-S3 здесь.
Прерывания
Все GPIO могут быть настроены как прерывания.
Узнайте, как использовать прерывания с ESP32:
Strapping-пины
Чип ESP32 имеет следующие strapping-пины:
GPIO 0 (должен быть LOW для входа в режим загрузчика)
GPIO 2 (должен быть в плавающем состоянии или LOW во время загрузки)
GPIO 4
GPIO 5 (должен быть HIGH во время загрузки)
GPIO 12 (должен быть LOW во время загрузки)
GPIO 15 (должен быть HIGH во время загрузки)
Они используются для перевода ESP32 в режим загрузчика или прошивки. На большинстве плат разработки со встроенным USB/Serial вам не нужно беспокоиться о состоянии этих пинов. Плата сама устанавливает пины в правильное состояние для режима прошивки или загрузки. Подробнее о выборе режима загрузки ESP32 можно прочитать здесь.
Однако, если к этим пинам подключены периферийные устройства, у вас могут возникнуть проблемы с загрузкой нового кода, прошивкой ESP32 новой прошивкой или перезагрузкой платы. Если у вас подключены периферийные устройства к strapping-пинам и возникают проблемы с загрузкой кода или прошивкой ESP32, возможно, эти периферийные устройства не позволяют ESP32 войти в нужный режим. Прочитайте документацию по выбору режима загрузки для получения подробных указаний. После сброса, прошивки или загрузки эти пины работают как обычно.
Пины с HIGH при загрузке
Некоторые GPIO изменяют своё состояние на HIGH или выдают ШИМ-сигналы при загрузке или сбросе. Это означает, что если к этим GPIO подключены выходные устройства, вы можете получить неожиданные результаты при сбросе или загрузке ESP32.
GPIO 1
GPIO 3
GPIO 5
GPIO 6 – GPIO 11 (подключены к встроенной SPI флеш-памяти ESP32 – не рекомендуется использовать).
GPIO 14
GPIO 15
Enable (EN)
Enable (EN) – это пин включения стабилизатора напряжения 3,3В. Он подтянут вверх, поэтому подключение к земле отключает стабилизатор 3,3В. Это означает, что вы можете использовать этот пин, подключённый к кнопке, для перезагрузки ESP32.
Максимальный ток GPIO
Абсолютный максимальный ток на один GPIO составляет 40 мА согласно разделу «Рекомендуемые условия эксплуатации» в техническом описании ESP32.
Встроенный датчик Холла ESP32
ESP32 также имеет встроенный датчик эффекта Холла, который обнаруживает изменения магнитного поля в окружающей среде.
Заключение
Мы надеемся, что это справочное руководство по GPIO ESP32 было полезным. Если у вас есть дополнительные советы по GPIO ESP32, поделитесь ими в комментариях.
Если вы только начинаете работу с ESP32, у нас есть отличные материалы для начала:
Источник: ESP32 Pinout Reference: Which GPIO pins should you use?