Добрый день, уважаемый читатель!
Я уже кратко писал о модулях ESP32, платах на их основе, и о том какие выводы можно либо нельзя использовать и почему. Сегодня я хочу немного продолжить данную тему, а конкретно – ещё раз пройтись по теме допустимых к использованию выводов GPIO. Речь в данной статье будет идти про распиновку популярной платы ESP32 DevKitC V4 для модификаций WROOM или WROVER, с печатной антенной или с внешней. Но вы можете использовать эту статью и для других плат / модификаций, так как подход везде один и тот же, разве что некоторые GPIO могут быть уже использованы для каких-то встроенных целей.
А заодно хочу предложить вам очень удобный способ распределения выводов ESP32 при старте очередного проекта с помощью Excel.
Я давно уже использовал подобный файл, но сегодня решил его “довести до ума”. Скачать его можно будет по ссылке в конце статьи. Для начала напомню, какие выводы можно использовать в своих проектах.
Выводы питания
VIN — контакт для подключения внешнего источника питания 5V. На плате установлен типовой стабилизатор AMS1117-3.3, который позволяет подавать на плату питание в широком диапазоне от 5 до 10 V, но без дополнительного охлаждения возможен его перегрев, так что не увлекайтесь.
3.3V – контакт, на который подается выходное напряжение внутрисхемного стабилизатора. Его можно использовать для питания подключаемых к плате датчиков, но сильно мощную нагрузку лучше запитать от отдельного стабилизатора.
GPIO
GPIO (General Purpose Input & Output) — контакты ввода/вывода общего назначения. Могут быть сконфигурированы как входы или выходы и программно назначены на различные функции. Максимальный ток, который вы можете пропустить через GPIO, составляет 40 мА при высоком уровне (и 28 мА при низком уровне), но при сбросе контроллера по умолчанию настроено ограничение на более низкий ток.
Чисто теоретически, все выводы (кроме земли, питания и сброса, разумеется), могут быть сконфигурированы как GPIO через IO_MUX (например режим 2 в таблице ниже).
Но на плате ESP32 DevKit часть выводов модуля уже занята под служебные надобности.
Выводы, которые нельзя использовать в проектах
- GPIO 1 и GPIO 3 заняты основным ( programable ) портом UART0
- GPIO 6-11 (D0, D1, D2, D3, SCK, CMD) заняты внешней FLASH-памятью, подключенной внутри модуля к чипу
- Примечание: GPIO 16 и GPIO 17 на модулях WROVER заняты под интерфейс внешней QSPI оперативной памяти. Но на платах с WROOM вы можете использовать их совершенно свободно.
Использование UART0 возможно только в тех случаях, когда на плате нет встроенного преобразователя интерфейса TTL <-> USB. Выводы GPIO6-11 нельзя использовать вообще.
Выводы, которые следует использовать с особой осторожностью
Некоторые выводы используются как так называемые “Пины обвязки” или Stapping pins. Что это означает. При сбросе микроконтроллера процессор считывает логические уровни на этих выводах и по ним определяет некоторые режимы работы.
Поэтому физическая подтяжка этих выводов к земле или питанию (в том числе и через переходы транзисторов и оптронов управления нагрузкой) настоятельно не рекомендуется. Хотя после выхода “в режим” вы можете использовать их как вам заблагорассудится. В частности поэтому иногда платы “не прошиваются” автоматически и требуется удерживать кнопку прошивки на плате.
Давайте ещё раз перечислим эти выводы:
- GPIO 0 – при низком уровне на этом выводе при старте MCU процессор “понимает”, что нужно ждать на UART0 поток двоичных данных для записи прошивки на FLASH. То есть низкий уровень переводит плату в режим прошивки через UART0. При высоком уровне (по умолчанию) плата стартует как обычно. Поэтому отсюда вывод, как перевести любую плату в режим прошивки (даже без автоматической схемы с DTR) – зажимаете одновременно RESET (EN) и PROG, а затем отпускаете вначале RESET и только после этого PROG. Если вы подтяните этот вывод к “земле” резистором или оптроном, то ваш контроллер просто не сможет нормально запуститься, не делайте этого.
- GPIO 2 – для входа в режим прошивки, кроме низкого уровня на GPIO0, необходимо обеспечить низкий уровень и на GPIO2. По умолчанию на нем и так уже низкий уровень, так что просто не подтягивайте его к питанию.
- GPIO 5 используется для управления внешней flash-памятью, подключенной внутри модуля к чипу – “Timing of SDIO Slave”. По умолчанию на нем высокий уровень. Изменение уровня при старте системы может нарушить работу flash-памяти.
- GPIO 12 управляет напряжением питания внешней flash-памяти. Если при сбросе MCU на нём установлен высокий уровень, напряжение флэш-памяти (VDD_SDIO) составляет 1,8 В вместо 3,3 В по умолчанию. Это может препятствовать прошивке и загрузке, если в модуле используется флэш-память 3,3 В, а этот контакт вытянут на высокий уровень, что приводит к физическому отключению флэш-памяти по питанию. И наоборот, при использовании низковольтной памяти можно её сжечь установкой неправильного уровня при старте. На ESP32 DevKit v4 имеет внутреннюю слабую подтяжку к земле, то есть делаем вывод что используется память с напряжением питания 3,3В.
- GPIO 15 управляет отладочными сообщениями при запуске микроконтроллера. Если задано значение “0“, отключаются загрузочные сообщения, распечатываемые загрузчиком. Имеет внутреннюю слабую подтяжку к питанию, поэтому по умолчанию на данном выводе будет высокий уровень. Не сильно критично для запуска, так что этот вывод вполне можно использовать в своих целях, но нужно учитывать, что “по умолчанию” он подтянут к питанию с помощью внутренней слабой подтяжки (~50kOm).
В связи с этим может возникнуть вопрос: можно ли использовать перечисленные выше GPIO в своих проектах? Ответ: можно, если осторожно, пример разумного использования данных GPIO можно найти в этом проекте.
Выводы, которые могут изменять уровень при загрузке
Некоторые GPIO изменяют свое состояние или выводят ШИМ-сигналы при загрузке или сбросе:
- GPIO 1
- GPIO 3
- GPIO 5
- GPIO 14
- GPIO 15
Это означает, что если у вас есть выходы, подключенные к этим GPIO, вы можете получить неожиданные включения / отключения нагрузки при перезагрузке или загрузке ESP32.
Выводы только для работы на вход
GPIO 34-39 являются GPI – “только вход”. Эти контакты не имеют внутренних подтягивающих резисторов, а также не могут быть использованы как выходы.
Прерывания
Все выводы GPIO могут быть настроены для генерации прерываний. Об этом я уже писал на данном сайте: Обработка прерываний GPIO на ESP32
ADC / Аналого-цифровой преобразователь
ESP32 имеет на борту 2 входных канала АЦП 12 бит. 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)
Вроде бы входов ADC и много, но тут есть довольно большая засада: канал ADC2 нельзя использовать при использовании Wi-Fi. А поскольку WiFi – это то, из-за чего этот чип, собственно, обычно и покупается, то канала ADC2 мы лишены “по умолчанию”.
Входные каналы АЦП имеют разрешение 12 бит. Это означает, что вы можете преобразовать аналоговое напряжение в цифровое в диапазоне от 0 до 4095, в которых 0 соответствует 0 В, а 4095 – максимальному напряжению, определяемому аттенюатором, который имеет 4 значения:
- ADC_ATTEN_DB_0 – входное ослабление отсутствует, АЦП может измерять приблизительно до 800 мВ
- ADC_ATTEN_DB_2_5 – входное напряжение АЦП будет ослаблено на 2,5 дБ, диапазон измерения примерно до 1,33 В
- ADC_ATTEN_DB_6 – входное напряжение АЦП будет ослаблено на 6 дБ, диапазон измерения примерно до 2 В
- ADC_ATTEN_DB_11 – входное напряжение АЦП будет ослаблено на 11 дБ, диапазон измерения примерно до 3,55 В
К сожалению АЦП ESP32 работают довольно не линейно, особенно на краях диапазона, и это следует учитывать. По сети “гуляет” примерный график получаемых значений в зависимости от напряжения:
Так что если вам требуется большая точность и линейность – используйте внешние I2C преобразователи.
DAC / Цифро-аналоговый преобразователь (ЦАП)
На ESP32 также имеются два 8-битных канала ЦАП для преобразования цифровых сигналов в аналоговые выходные сигналы напряжения:
- DAC1 (GPIO25)
- DAC2 (GPIO26)
Я до сих пор не удосужился ими воспользоваться.
PWM / ШИМ модулятор
ШИМ-модулятор ESP32 имеет 16 независимых каналов, которые можно настроить для генерации ШИМ-сигналов с различными свойствами. Все выводы, которые могут выступать в качестве выходов, могут использоваться в качестве выводов PWM (то есть GPIO с 34 по 39 не могут генерировать ШИМ). Например с помощью PWM можно легко заставить звучать обычный пассивный зуммер или динамик. Для генерации ШИМ-сигнала необходимо в программе задать частоту сигнала, скважность, выбрать ШИМ-канал, а также GPIO, на котором вы хотите вывести сигнал.
RTC / Ядро низкого энергопотребления
ESP32 имеет сопроцессор с ультранизким энергопотреблением (Ultra Low Power — ULP). Выводы RTC GPIO, перенаправленные в подсистему с низким энергопотреблением, могут использоваться для выхода ESP32 из глубокого сна при работе сопроцессора (ULP). В качестве RTC могут быть использованы большинство GPIO общего назначения после соответствующей программной настройки.
TOUCH / Сенсорные кнопки
Некоторые GPIO можно использовать как контакты ёмкостных сенсорных датчиков. Реагируют не изменение ёмкости в электрической цепи вывода, вызванное прикосновением пальца к соответствующему контакту. Эти контакты могут заменять механические кнопки. TOUCH-контакты также могут служить источником пробуждения ESP32 из энергосберегающих режимов.
Шины обмена данными
ESP32 поддерживает несколько типов шин для “физического” обмена данными между цифровыми устройствами:
- UART / RS232 / RS485 – до трех экземпляров одновременно
- I2C – до двух экземпляров одновременно на любых выводах GPIO
- SPI – до четырех экземпляров одновременно на любых выводах GPIO
Следует только учитывать, что всё это богатство возможностей имеется только при программировании из-под legacy фреймворка ESP-IDF, а под Arduino количество доступных шин ограничено средой разработки и выводы могут быть фиксированными.
Встроенный датчик Холла
ESP32 также имеет встроенный датчик Холла, который обнаруживает изменения магнитного поля в окружающей среде. Чтобы его задействовать, используются GPI SENSOR_VN (39) и SENSOR_VP (36).
EXCEL файл для подготовки проекта
Теперь мы с вами подошли к самой главной цели статьи. Когда периферии (входов, реле, датчиков) к микроконтроллеру подключается много – запутаться очень легко, особенно поначалу. Конечно, есть множество картинок pinout-ов, но постоянно переключаться между Sprint Layout и рисунком – то ещё удовольствие.
Дабы не держать в голове все эти детали и номера выводов, я уже давно сделал себе простенький excel-файлик, в котором отразил все самые существенные моменты. Используя этот файл, легко и непринужденно можно учесть все “тонкие моменты.
Однако в последнее время я усовершенствовал этот файл, добавил “учёт” strapping pins и он стал ещё удобнее:
Скачать его вы можете с моего GitHub. Он рассчитан под плату ESP32 DevKitC V4 ( NodeMCU ), так как чаще всего я использую именно их, но вы можете переделать его под свои нужды.
Как этим файлом пользоваться?
- Столбец “№ вывода” (ближайший к рисунку платы) обозначает номер вывода модуля, а не номер GPIO. Это удобно, если в дальнейшем вы будете использовать “чистый” модуль
- Столбец “Обозначение” – это и есть собственно обозначение вывода на плате. Ничего особенного.
- Столбец “ADC” сообщает, можно ли использовать этот вывод для измерения аналогового напряжения и номер канала ADC.
- Столбец “Pull EXT” содержит информацию о том, можно ли подтягивать вывод к питанию или земле внешними резисторами или другими деталями (не забывайте о том, что светодиод, оптрон и переход биполярного транзистора для MCU по сути та же самая подтяжка). Если стоит “+”, то можно. Если стоит “x”, то нельзя. Если указано “D” – можно подтянуть к земле, но не к питанию.
- Столбец “Pull INТ” обозначает, можно ли настроить внутреннюю слабую подтяжку ESP32. Если вместо “+” – то можно, и по умолчанию подтяжки нет. Если указано “х” – то нельзя (для выводов GIO 34-39). В случае, если указана буква, то это означает, что по умолчанию подтяжка уже включена – “D” (Weak Pull Down) или “U” (Weak Pull Up).
- Столбец “Выход” содержит информацию о том, можно ли использовать этот вывод “на выход”, то есть для управления устройствами. В случае зеленого “+” вы можете делать это произвольным образом (с учетом тока до 40мА). В случае “х” вывод на выход использовать никак невозможно. Если в данной ячейке стоит “!”, то в принципе можно, но только если осторожно. То есть нельзя изменять нагрузкой логический уровень на выводе в момент его сброса. В случае красного “+” следует учитывать, что в момент сброса состояние выхода может измениться, и нагрузка будет переключена.
- Столбец “Вход” – то же самое, но для считывания логических уровней со входа. То есть для кнопок и различных датчиков. Принципы обозначения те же самые, что и в предыдущем случае.
- В столбце “Функция” указана типовая функция вывода в Arduino.
- Столбец “Назначение в проекте” вы можете использовать для обозначения того, что будет подключено к плате или модулю в вашем проекте.
На этом пока всё, до встречи на сайте и на telegram-канале!
💠 Полный архив статей вы найдете здесь
Пожалуйста, оцените статью:
Добрый день.
Разрабатываем проект на базе ESR32.
Нужна консультация специалиста по ним, как можно с Вами связаться?
Напишите на почту)
Добрый! Контакты есть на главной странице в самом низу.
на картинке pull ext, в описании pull out.
Спасибо за внимательность, текст поправил!
Только вот на GitHub файл выглядит чуть иначе и в нём уже заполнены “Назначение в проекте” функциями в какой-то сигнализации.
Именно так! Ведь файл выложен в проекте сигнализации и телеметрии для дачи. И в качестве примера для использования.
А что мешает Вам очистить нужные поля и заполнить своими данными?
Ничего не мешает. 🙂 Просто нашёл поиском, увидел картинку, перешёл по ссылке на GitHub…
Спасибо за реализацию! 🙂
Добрый день. Делаю проект Ё-радио (строго по схемам, ибо нет знаний в этом деле, поэтому повторяю). Вопрос от ламера:
На схеме подключения дисплея к плате Wrover есть такие пины, под названием MISO и MOSI. Если на модуле vs1053b они присутствуют и я просто “тупо” соединю их с пинами платы, то на дисплее 1.88″ ST7735 нет таких пинов (MISO и MOSI).
Есть только (исключая питание) BL, SC,RES, SDA, SCK. И вот тут я зависаю, ибо не понию, что такое MISO и MOSI, поэтому не понимаю, какие куда.
Подскажите?
Поиск выдает следующее:
MOSI (Master Out Slave In) – это линия, по которой микроконтроллер отправляет данные на периферийное устройство.
MISO (Master In Slave Out) – это линия, по которой периферийное устройство отправляет данные микроконтроллеру.
SCK (Serial Clock) – это линия, по которой генерируется тактовый сигнал для синхронизации передачи данных.
Назначение выводов модуля ST7735
• SCK, MOSI, MISO – линии протокола SPI. Альтернативные названия – DO/DI, SCL/SDA. Вывод MISO отсутствует.
• CS – выбор чипа. Активный уровень низкий.
• DC – выбор типа записываемого в модуль слова – данные или команда. Возможны и иные обозначения этого вывода – A0, RS.
• RESET – аппаратный сброс. В состав команд ST7735 входит команда программного сброса, так что на этом выводе можно сэкономить. Однако, следует иметь в виду, что для некоторых регистров контроллера значения по аппаратному и программному сбросу не совпадают.
• VCC, GND – линии питания контроллера. Диапазон напряжения – от 3.3В до 5В.
• LED (или BL) – питание дисплея. Максимально допустимое значение подаваемого на этот вывод напряжения – 3.3 В. В последних модификациях обычно имеется преобразователь 5В –> 3.3 В. Если вы обнаружили его на оборотной стороне своего модуля, можно соединить между собой выводы LED и VCC и подавать любое из указанного диапазона удобное для вас напряжение.
Обобщая все сказанное, можно сделать вывод, что
SCL ESP == SCL ST7735
MOSI ESP == SDA ST7735
MISO ESP -> не подключен
Наверное как-то так
Спасибо, очень пригодилось!
А почему номера выводов начинаются со 2-го, а у питания 5В номера нет совсем?
Очепятка или в этом какой то смысл?
См. https://wiki.iarduino.ru/file/esp32-en.pdf, раздел 2.1
Котяра! Респект и уважуха! Это лучший русскоязычный(да и мировой) ресурс по esp32! Спасибо тебе! Ты экономишь кучу времени, и гору седых волос на голове)))
Здравствуйте. Мне не понятно каким алгоритмом Вы пользуетесь для того, что бы понять можно ли использовать определённый GPIO для входа или выхода. Можете пояснить? Необходимо ведь учитывать ещё подключения на плате, которые нигде не описаны
Очень просто: есть изначально “запрещенные” GPIO, есть “только входы” 4 шт., остальные – универсальные. Из универсальных часть можно использовать с оговорками. Но можно. Все это как раз и описано в статье.
В моем последнем проекте как раз использованы абсолютно все не запрещенные GPIO.
Спасибо за материалы, реально помогает понять некоторые аспекты.
Небольшое дополнение – AMS1117-3.3 – выдает на выходе именно 3.3. С него питается сама ESPшка.
Если я верно понял даташит, есть разные AMS1117, от 1.2 до по моему 5 вольт. Есть настраиваемые (adjustable), которые на соответствующей ноге выдают напряжение, которое задаётся обвязкой. В даташите эта информация есть.
Я просто уже столкнулся с проблемой по AMS1117-3.3, потому и решил прокомментировать.
Мне пришла плата (esp32-c6), у которой вместо 3.3 выдается 4.12.
Что удивительно – еспшка работает и шьётся (на простые демки, без периферии, т.к. боюсь ее пожечь), Исходно она грелась (да и сейчас), только поэтому внимание и обратил. При том на плате именно AMS1117-3.3 (а не AMS1117 adj)
Я не знаю, что там в чипе теперь (сгорело или не сгорело), куплю нормальный AMS1117-3.3 в sot-89, проверю. Пока на пины боязно что-то вешать, лежит без дела. Продавец просто вернул деньги и не стал требовать возврата, так что плата кинута в дальний ящик (на озоне AMS1117-3.3 в sot-89 по 100 штук продается, буду ждать пока партии поменьше появятся)
Добрый день!
AMS1117-3.3 по техпаспорту должен выдавать именно 3,3В. И если у вас почему-то по другому – значит он просто неисправен. Или перемаркирован. Про другие модификации я знаю.
У меня недавно LM2596S-5.0 тоже выдавал 2,5 вместо 5,0. Заменил на другой – заработало. Бывает.
Он исправен. С платой проблемы. С землёй. Толи с разводкой что-то не то, толи какой-то элемент по пути от земли к 1му контакту 1117 мёртвый. Честно – искать лень, я пока в электронике так себе, решил вопрос проще.
Сдул 1117, подключил отдельно от esp32, выдает 3.3
Запаял обратно, кинул на 1ю ногу 1117й принудительно землю, на проце стало 3.3 (но встроенный на плату диод 3528 похоже уже сгорел от 4.12, во всяком случае я не смог зажечь встроенный ргб, который вроде как на 8 пине, никакими примерами и стандартными библиотеками, включая адафруктовский неопиксель).
Запустить посторонние диоды на разных выводах получилось, подключить 1309 олед экран – тоже, как и динамик. Вайфай и блютуз также оказались рабочими. Похоже, сама esp32c6 смогла пережить 4.12. Насчёт флеша и оперативки не уверен (у меня версия с 8 флеша, а не 4), но простыми примерами шьётся и работает.
Если дадите какой-то совет по поводу встроенного ргб диода – буду признателен (как именно его зажечь).
А я всё о своём, о наболевшем.
Если Вы (уважаемый автор заметок) когда-нибудь доберетесь до esp32-c6 (в моем случае с маркировкой nanoESP32-C6 v1.0) и сможете подключить SPI дисплей 128×160 TFT/ST7735 SPI (тот что с кардридером и 8 пинами дисплея), и выложите howto процесса, я буду счастлив.
Мне так и не удалось это сделать. Равно как и не получилось диод запустить (он, возможно, сгорел от 4+ вольт?)
Выше сообщением я ошибся, подключал I2C ssd1306 (а не 09). Вполне заработало.
Сделать это удалось, поменяв в настроечном файле платы в ардуине sck на пин 7, а sda на пин 6. Адафруктовский пример после этого отработал без проблем.
А вот на ST7735 уже кучу пинов перебрал, ничего не выходит. Вот последняя распиновка (в конфиге платы):
sck 7
sda 6
a0 13
reset -1
cs 12
Названия с пинов экрана, в файле конфига например a0 – это DC.
Сам экран заведомо рабочий (на классическом esp32 я его включал)
И если для классической ESP32 можно найти схемы и понять, к каким пинам что тыкать, то с C6 в сети совсем грустно, материалов по ней считай нет, ни на русском, ни на английском.