Перейти к содержимому

Добрый день, уважаемые читатели!

В данной статье я решил собрать часто задаваемые вопросы и проблемы ESP32 и методы их решения, найденные не только и не столько мной, а вообще на просторах интернета – на форумах, сайтах и т.д. В формате вопрос – краткий ответ. На некоторые вопросы я уже отвечал в своих статьях, поэтому буду просто приводить ссылки на них.

Пока список FAQ очень не большой, но он, надеюсь, будет постоянно пополняться. Вы также можете оставить свои вопросы в комментариях, и я постараюсь на них ответить. Если смогу.

 


Чипы, модули, платы…

Почему все носятся с этим ESP32, когда скажем STM32 гораздо круче?

Ответ прост: это, пожалуй, единственный массовый микроконтроллер с WiFi и BT “на борту”. И довольно дешевый. Да он далеко не идеален, но альтернатив с таким же набором характеристик и такой же ценой – по сути нет.

 

Большая “микросхема” с жестяной крышечкой и антенной это и есть чип ESP?

Нет, это модуль. Внутри него, под этой самой крышечкой, установлен собственно сам чип (SoC – то есть CPU вместе с памятью и другими элементами), кварцевый резонатор, микросхема flash-памяти, иногда микросхема дополнительной PSRAM памяти, схема согласования антенны радиоканала и некоторые другие элементы. То есть все минимально необходимые для работы SoC компоненты, без который он не сможет нормально работать. Об этом можно подробнее почитать в статье “Чипы, модули, платы“.

 

Что обозначает буква (и иногда цифра) после ESP32 – например ESP32-C, ESP32-S, ESP32-P  и т.д.?

Буква обозначает серию (семейство, линейку) SoC. В настоящее время компания Espressif выпускает следующие серии чипов:

Серия Позиционирование Архитектура CPU Беспроводная связь Ключевые особенности
ESP8266 Ветеран, первый чип широкого распространенный с WiFi Tensilica L106 (одноядерный) @ 160 МГц Только Wi-Fi 4 (802.11 b/g/n) Минимальная цена, простейшая обвязка, колоссальное сообщество. Нет Bluetooth, нет аппаратной защиты памяти. Мало памяти (тянет только одно TLS одновременно).
ESP32  Универсальная и не стареющая классика Xtensa LX6 (двухъядерный) @ 240 МГц Wi-Fi 4 + Bluetooth Classic + BLE 4.2 Единственная серия с Classic BT для аудио. Огромное количество периферии (сенсоры, Ethernet, CAN т.д.).
ESP32-C Современный бюджетная серия (идейный наследник 8266) RISC-V (одно- или двухъядерный) Wi-Fi 4/6 + BLE 5.x
(+ Thread/Zigbee в C6)
Самая низкая цена среди RISC-V процессоров Espressif. C3 — прямая замена 8266 по цене, но с BT и безопасностью.
ESP32-S Современная серия, с упором на производительность и AI (например для графики и камер) Xtensa LX7 (одно- или двухъядерный) @ 240 МГц Wi-Fi 4 + BLE 5.0 (кроме S2) Ускорители нейросетей, интерфейс LCD/Камера. Максимальный объем RAM (до 512 КБ)
ESP32-H Mesh-сети (Thread/Zigbee), без WiFi RISC-V (одно- или двухъядерный) BLE 5.x + Thread + Zigbee
Без Wi-Fi
Минимальное энергопотребление в спящем режиме (мкА). Для батарейных датчиков.
ESP32-P Edge AI, HMI и вычислительный монстр Высокопроизводительный RISC-V (двухъядерный) @ до 400 МГц Отсутствует (только внешний чип) Поддержка USB 2.0 HS, MIPI-CSI (камеры), I3C. Самый мощный CPU среди всех серий Espressif.

Каталог серий и SoC от Espressif – здесь вы сможете найти официальную документацию по любому чипу

 

Сравнение чипов и модулей ESP различных серий

ESP32 - это давно уже не один чип, а целое семейство разных SoC: с разными характеристиками, процессорами и набором протоколов беспроводной связи. На текущий момент на сайте производителя доступны для заказа больше десятка различных серий ESP8266 и ESP32. Сравним чипы ESP различных серий и их основные характеристики, которые могут быть существенными для вашего проекта. Например плата ESP32-DevKit-V1 (с модулем ESP32-WROOM-32E на базе SoC ESP32-D0WD-V3), и другая плата с надписью ESP32-C3 Super Mini (с распаянным на ней чипом ESP32-C3) — это совершенно разные устройства, несмотря на общее название и общую среду разработки. И выбор между ними может повлиять на то, заработает ли ваш проект вообще.

В таблице приведены только чипы (SoC). Определившись с SoC, уже можно будет выбрать подходящий модуль или плату. Для каждого SoC указаны следующие характеристики:

  • CPU — количество ядер и максимальная тактовая частота для всех ядер процессора (включая Low Power), в том числе обозначены: HP - основные High Performance ядра, LP - экономичные Low Power ядра, ULP - сверхэкономичные Ultra Low Power ядра.
  • SRAM — объем основной быстрой оперативной памяти, встроенной в чип, и доступной процессору для стека, кучи и прочих надобностей в режиме обычного энергопотребления.
  • PSRAM — наличие теоретической возможности подключения дополнительной PSRAM-памяти, её максимальный объем и размер кеша. Это совсем не означает, что PSRAM будет вообще в вашем конкретном модуле.
  • WiFi — наличие встроенного радиоканала для подключения к сетям WiFi, дополнительно указан частотный диапазон. 
  • BT — наличие встроенного радиоканала для создания Bluetooth соединения, дополнительно указаны поддерживаемые стандарты соединения.
  • Thread, Zigbee — поддержка современных mesh-протоколов беспроводной связи с низким энергопотреблением на базе стандарта IEEE 802.15.4
  • Ethernet — наличие встроенного EMAC-контроллера, который позволяет подключаться к проводным Ethernet-сетям по RMII-протоколу (но потребуется дополнительный чип уровня PHY (приемопередатчик)). Отсутствие такого контроллера не означает, что выбранный SoC не имеет возможности подключения к сетям Ethernet вообще - это можно сделать с помощью SPI - чипов, например W5500.
  • GPIO — количество выводов, доступных для чипа (для некоторых модулей, особенно PICO, количество выводов может быть существенно меньше). Уточняйте эту информацию в техническом руководстве или на сайте производителя. Из них: strapping - специальные выводы обвязки (их использовать можно, но осторожно), flash - используются для SPI-интерфейсов FLASH-памяти (в модулях нельзя использовать совсем), доступно - количество GPIO, доступных для работы в проекте, включая strapping.
  • USB - наличие и тип встроенного в чип USB-контроллера (и это не USB-UART мост). Не все USB одинаково полезны — USB OTG может "притворятся" клавиатурой или флешкой, USB JTAG используется только для отладки и прошивки. Некоторые SoC имеют на борту сразу два контроллера - и OTG, и JTAG - позволяя переключаться между ними.
  • Interfaces — перечислены основные (SPI, I2C, UART, I2S) аппаратные контроллеры интерфейсов, встроенные в чип. Для SPI интерфейсов иногда указаны 2 цифры: ДОСТУПНО ПОЛЬЗОВАТЕЛЮ (ВСЕГО КОНТРОЛЛЕРОВ) - как правило 2 или 1 SPI используется для подключения FLASH памяти. Для SoC, где поле GPIO / flash не заполнено - это означает, что FLASH встроена в чип, GPIO не используются и в этом столбце указано одно "честное" количество SPI.
  • Типичное применение — назначение SoC по мнению производителя на основе официальной документации.

Попытка вместить сразу всю эту информацию в одну таблицу HTML провалилась (да и была заранее обречена на провал), поэтому я сделал её в виде "картинки", которую можно увеличить, кликнув по ней мышкой. Прошу понять и простить.

Сравнение основных характеристик для SoC различных серий. Нажмите для увеличения. В таблице есть небольшая ошибочка - P4 поддерживает Ethernet 10/100 Мбит/с

Примечания:

  • Количество GPIO указанно для SoC. Для модулей количество доступных GPIO может быть существенно меньше. Уточняйте эту информацию в техническом руководстве.
  • Модули ESP32 (классика) могут иметь и 8 МБ и даже 16 МБ PSRAM, однако "прозрачно" доступны только первые 4 МБ, так что не обольщайтесь.
  • ESP32-S2 не имеет Bluetooth — это не ошибка в таблице и не брак производителя.
  • ESP32-P4 не имеет встроенного радио — для подключения к сети Wi-Fi/BT ему нужен внешний чип (например, ESP32-C6).
  • ESP32-E22 напротив — предназначена для подключения к другим SoC, например тому же ESP32-P4, как средство связи.
  • AI/ML: ESP32-S3 и ESP32-P4 имеют AI-расширения и FPU; P4 дополнительно поддерживает H.264 кодирование и MIPI-интерфейсы.

Более подробную информацию вы можете получить на сайте производителя чипов.

 

Как выбрать нужный для проекта модуль и не запутаться в этих самых сериях?

Можно ориентироваться на следующий алгоритм:

  • Вам нужно дешево и сердито, только Wi-Fi, без сложной логики (включить свет, отправить одну цифру на сервер без TLS раз в минуту) → берите ESP8266. Это все еще рабочий вариант для самых простых проектов, хотя и устаревший.
  • Нужен Wi-Fi + Bluetooth или чуть больше памяти → выберите ESP32-C3, он почти такой же дешевый, как 8266, но современный и безопасный.
  • Для первого знакомства или просто если ничего не понятно → берите оригинальный ESP32, он все ещё остается актуальным выбором для множества проектов. Если нужна отладочная плата – возьмите ESP32-DevKitC-V4 от производителя чипов – не дорогой и надежный выбор, весьма рекомендую.
  • Нужен Wi-Fi + Bluetooth Classic (для колонки) или хотите использовать очень много готовых библиотек → ваш выбор оригинальный ESP32.
  • Нужны Zigbee/Thread (Matter) и работа от батареек → выбирайте ESP32-H2, у него нет Wi-Fi, но у него есть другие протоколы и он потребляет единицы мкА.
  • Нужна работа с камерой, дисплеем или голосовой ассистент → берите ESP32-S3. Ну и это просто современный выбор взамен “классики”, который покрывает почти все потребности.
  • Нужна мощь без встроенного радио (обработка видео, USB-накопители) → ESP32-P4. Но для того, чтобы с него выйти в сеть, потребуется дополнительно ESP32-C6.

Важное предостережение про ESP8266: не пытайтесь использовать его в промышленных устройствах, которым нужна защита от взлома, или в проектах с большим количеством RAM, прерываний и таймеров — его архитектура для этого не предназначена. Но для прототипов и простейшей домашней автоматики — вполне подойдет.

Если всё ещё сомневаетесь, что взять для проекта → берите ESP32-S3 с большим объемом FLASH и дополнительной PSRAM, например N16R8. Да, это чуть дороже “классики”, но его возможностей хватит почти на любой проект, включая обработку изображений и работу с большими дисплеями (кроме Bluetooth Classic, Zigbee/Thread и батарейного питания).

Каталог серий и SoC от Espressif – здесь вы сможете найти официальную документацию по любому чипу

 

Чем отличается модуль ESP32-WROOM от ESP32-WROVER?

Для классической линейки ESP32 модули WROVER дополнительно оснащены микросхемой внешней оперативной памяти, которая работает через достаточно узкое “окно” в адресном пространстве (для новых линеек возможен доступ к внешней памяти уже через DMA). Но взамен мы теряем два GPIO ( #16 и #17 ), которые как раз и заняты обслуживанием этой самой внешней памяти. Для новых линеек таких модулей нет, так как Espressif отказались от этой маркировки. Более подробно о чипах и модулях классической линейки я рассказывал в другой статье. 

 

Почему у ESP32 такой небольшой размер ROM (ПЗУ)? Есть ли EEPROM? Где вообще хранится прошивка и данные?

У ESP8266 и ESP32 вообще нет чипа EEPROM в классическом понимании. А в ROM самого чипа хранится только специальная программа-загрузчик первой очереди. Вся информация (и прошивка(и) и ваши данные) хранятся на внешней микросхеме Flash-памяти, которая находится под крышечкой модуля. Весь объем Flash-памяти разбивается на несколько разделов – в некоторых из них хранится прошивка, в которых – различные данные. Подробнее об этом читайте здесь, здесь и здесь.

 

Что означает сочетание символов “NxRx” (например N8R2), которое сейчас указываются в характеристиках модулей и плат с ESP32?

Таким образом указан объем flash-памяти (после буквы N) и дополнительной внешней RAM (ОЗУ) (после буквы R) – все это в мегабайтах. Таким образом N8R2 означает, что объем встроенной flash-памяти составляет 8 МБ, и объем дополнительной RAM 2 МБ. На старых модулях (и модулях производства сторонних компаний) такого обозначения может и не быть, но на новых модулях, произведенных espressif, новая маркировка обязательно присутствует, например MFN4 ( = N4R0 ) или MGN16R8 ( =N16R8 ).

 

Чем отличаются отладочные платы разработчика ESP32 DevKit V1(ESP32 DevKitС, NodeMCU) с разными чипами USB-моста (CH340, CP2102, FT232)?

С точки зрения программирования никаких отличий нет. Но потребуется установить разные драйверы в Windows. И, возможно, будет немного отличатся максимальная скорость прошивки.

 

Зачем на новых платах разработчика с ESP32 два USB-порта?

Классический ESP32 можно было программировать только через последовательный порт UART0, поэтому на платах с “классикой” имеется встроенный USB-UART мост. На современных сериях чипов ESP32 (ESP32-S, например) добавили поддержку встроенного USB JTAG-интерфейса. Но старый и проверенный UART тоже не убрали и он по прежнему отлично работает. Поэтому некоторые производители плат оставляют оба варианта – а вы можете выбрать тот, который вам больше подходит.

 

Можно ли на ESP32 подавать 5В? Будет ли он работать при напряжении питания 5 вольт?

Подавать 5В на чип или модуль – однозначно и категорически нельзя!. Согласно datasheet-у, допустимое напряжение питания должно находиться в пределах 3,2~3.6В. Примерно то же самое относится и к GPIO (подробнее ниже, в разделе GPIO).

Но что за 5В на выводах платы DevKit или NodeMCU? Те 5 вольт, которые подаются на плату типа DevKit, преобразуются в необходимые для питания микроконтроллера 3,3В дополнительным стабилизатором, установленным на самой плате. Если вы планируете использовать “голый” модуль или чип, вы должны будете озаботиться напряжением питания модуля самостоятельно.

 

Brownout detector was triggered

Иногда после прошивки и сброса микроконтроллер начинает циклически перезагружаться с ошибкой Brownout detector was triggered — причина этого недостаточное питание: источник питания “просаживается” при запуске WiFi и это приводит к аварийному сбросу микроконтроллера. При запуске WiFi ESP32 может потреблять ток до 800 мА. Смените кабель или порт USB, либо используйте внешний источник питания помощнее.

 


Программирование ESP32

Как прошивать ESP32 самостоятельно (самому написать прошивку)? Какую программу (IDE), язык программирования и framework (платформу) можно использовать для программирования ESP32?

Официальных платформы две – Arduino core for ESP32 и ESP-IDF, и обе используют язык C/C++ и обе основаны на операционной системе FreeRTOS. По сути – Arduino core for ESP32 это “обертка” вокруг ESP-IDF,  сделанная специально под Arduino IDE. 

Что выбрать? Сложный вопрос, каждый выбирает то, что ему ближе… Я попытался описать все эти тонкости в статье “Как и на чем программировать ESP32 и ESP8266“. Схему возможных вариантов вы можете посмотреть ниже (но это не всё):

 

Если же вас интересует вопрос, касающийся собственно загрузки уже готовой прошивки в память ESP32 – перейдите к другому разделу.

 

Что такое ESP-IDF, как оно расшифровывается и для чего оно используется?

ESP-IDF – это основная API-платформа (framework) для программирования SoC семейства ESP32. Расшифровывается оно как Espressif IoT Development Framework. ESP-IDF содержит все необходимые API для всех аппаратных возможностей микроконтроллеров семейства. Написано это все на языке Си и в качестве основы использует операционную систему реального времени FreeRTOS. Все остальные фреймворки (например самый популярный Arduino core for ESP32) – это по сути “обертки” поверх ESP-IDF.

 

Что такое Arduino core (другие названия – Arduino32 или Arduino esp32)?

Это платформа-“обертка” вокруг ESP-IDF. созданная специально для того, чтобы “впихнуть” ESP-IDF в очень популярную систему разработки для начинающих Arduino IDE. Авторы – та же самая Espressif, это такая же официальная платформа, но с несколько ограниченными возможностями. И таки да, она также работает на основе FreeRTOS.

 

Как избавиться от FreeRTOS из ESP32!!!??? Зачем он мне? Что, на ESP32 без FreeRTOS никак нельзя?

Увы, но никак нельзя. Даже если вы пишете код в Arduino – вы вполне можете “делать вид”, что жизни на марсе FreeRTOS не существует, но FreeRTOS будет работать на ESP32 по “тихому”, не зависимо от вас и вашего кода. Избавится наверное теоретически можно, но вам придется написать свой собственный загрузчик, а также свой собственный SDK для работы с “железом”, так как весь стандартный API заточен под FreeRTOS.

 

Почему при компиляции простейших примеров типа “Blink” и “Hello, world” получается огромный бинарник (скомпилированный файл) и используется так много памяти?

Причина та же самая, что и предыдущем случае – даже в самом простейшем случае используется FreeRTOS, а значит запускается планировщик и служебные задачи. Отсюда и накладные расходы.

 

Как установить ESP-IDF на свой компьютер?

Сейчас есть достаточно простая и удобная утилита для этого – ESP-IDF Installation Manager, подробнее об ней читайте в статье “Установка ESP-IDF с помощью ESP-IDF Installation Manager“.

 

Можно ли из ESP-IDF IDE использовать Arduino-совместимый код?

Начиная с версии ESP-IDF 5.3 можно! Для этого вам нужно создать проект ESP-IDF и подключить Arduino core for ESP32 как компонент ESP-IDF. Таким образом вы получаете возможность работать с Arduino-кодом из проекта ESP-IDF и бонусом получаете возможность настройки проекта.

 

Как установить PlatformIO IDE на свой компьютер?

Это достаточно подробно было разобрано в статьях “Установка PlatformIO” и “Переползаем с Arduino IDE на VSCode + PlatformIO“.

 


Аппаратные особенности ESP32

Как используются ядра на двухядерных версиях ESP32?

По умолчанию на первом (нулевом) ядре процессора работает WDT (сторожевой таймер), планировщик FreeRTOS, сетевые драйверы и некоторые другие служебные задачи. Второе ядро по умолчанию отдано под прикладную задачу или задачи, если их несколько.

Но ничто не мешает вам изменить это поведение программным способом – особенно средствами ESP-IDF. Да и в последних версиях платформы Arduino core for ESP32 появилась опция, позволяющая изменить это поведение с помощью стандартных настроек IDE.

 

В спецификациях всех ESP-чипов указан очень небольшой размер ПЗУ (ROM)! Почему?

ESP в чем то очень похож на обычный компьютер. На всех чипах ESP встроенное ПЗУ используется только для хранения специальной программы – bootloader-а или загрузчик первой очереди (точно также как это делает BIOS на компьютере). Ваша прошивка и все данные вместо ПЗУ хранится на внешней микросхеме FLASH-памяти.

 

Что такое bootloader или загрузчик?

В относительно небольшом (ROM) ПЗУ ESP хранится только специальная программа – bootloader (загрузчик). Bootloader это специальная служебная мини-программа, которая позволяет загружать скомпилированный вами код в микроконтроллер без использования специальных аппаратных программаторов. То есть по сути это программный программатор ESP (каламбур-с). Именно он берет на себя функции получения двоичных данных из UART (или USB) и записи на flash-память. Но, кроме функций программатора, bootloader выполняет и другие функции – он управляет выбором OTA раздела и запуском записанного туда ранее кода. Как это делается:

  • После запуска загрузчик подключает микросхему FLASH-памяти (подключенную через интерфейс SPI) и загружает таблицу разделов (почти точно также как это делается на “большом” компьютере), а затем запускает загрузчик второй очереди, который хранится в специальном разделе.
  • Загрузчик второй очереди проверяет состояние специальных выводов – Strapping pins, и на основании этих данных принимает решение – запускать ранее записанную прошивку или загружать новую.
    • Если выбран режим обычной загрузки (GPIO0 == 1 ), то он выбирает активный раздел для запуска прошивки, загружает ее в память и передает ей бразды правления.
    • Если выбран режим записи новой прошивки (GPIO0 == 0 ), то он выбирает раздел для записи прошивки и готовится принимать данные программы через UART или USB.

 

Почему программа (прошивка, скетч) не помещается в память?

Неужели flash-память такая маленькая, а ведь обещали 4Мб / 8Мб / 16Мб ? Опять китайцы обманули?

Дело в том, что подключенная к микроконтроллеру flash-память используется не только для хранения кода прошивки, но и для других целей. Принцип организации flash памяти примерно тот же, что и на диске вашего компьютера – весь общий доступный объем памяти разбит на несколько отдельных разделов, в каждом из которых может что-то храниться – прошивка, ваши данные, служебные данные, файловая система, дамп памяти и т.д. Причем разделов, используемых под хранение кода прошивки, может быть несколько. Поэтому размер раздела, выделенного под код, много меньше общего доступного объема. Подробнее об этом читайте здесь.

 


GPIO

Все ли выводы подряд можно использовать у ESP32?

Нет, не все. Некоторое категорически нельзя, некоторые можно, но осторожно.

  • GPIO 1 и GPIO 3 заняты основным ( programable ) портом UART0, и ни на что другое их использовать нельзя.
  • GPIO 6-11 (D0, D1, D2, D3, SCK, CMD) заняты под SPI-интерфейс, к которому подключена flash-память – эти выводы использовать в проектах совсем нельзя (зачем тогда их вывели – а для подключения внешней дополнительной памяти и вывели, на новых модулях ESP их уже нет).
  • Есть еще Strapping pins, про которые чуть подробнее ниже.

Подробнее об выводах можно почитать в других статьях: 

 

Что такое Strapping pins и можно ли их использовать?

Все ESP имеют специальные Strapping pins или “выводы обвязки”, с помощью которых можно управлять режимом работы микроконтроллера при его запуске.

  • Например самый “известный”  из них – GPIO0, который включает “режим прошивки”.
  • Самый критичный (для ESP32) – MTDI (GPIO12), который управляет напряжением Flash-памяти.

Все Strapping pins работают одинаково – при запуске процессора логические уровни на них записываются в специальные защелки и эти состояния используются для настройки МК, после чего их можно использовать как обычные GPIO. Поэтому общий совет таков: “не трогать” их во время сброса / запуска, а после запуска делайте с ними что хотите.

У разных серий ESP разные Strapping pins – обязательно сверяйтесь с паспортом чипа или модуля. Ниже таблица – пример для классической серии.

Strapping pins для ESP32

 

Можно ли подключать к ESP32 периферийные устройства с TTL-уровнями 5 вольт?

Я бы категорически не советовал так делать. Согласно datasheet-у, максимально допустимый уровень напряжения на входе – VDD+0.3В, то есть 3,3+0,3 = 3,6В.

Если напряжение на входе будет выше указанного значения – откроется внутренний защитный диод, и “сбросит” излишки напряжения на шину питания. Но ничего хорошего это точно не дает. По крайней мере, я совершенно точно знаю, что шина I2C в условиях подтяжки линий к +5В работать отказалась.

 

А что же делать, если ну очень-очень-очень нужно подключить к ESP32 5в устройство?

В зависимости от обстоятельств. Если вам нужно подключить 5В только “на вход”, то можно использовать банальный резистивный делитель. В более сложных случаях можно применить оптрон или иной способ.

Для двунаправленной передачи данных (в обе стороны) меня часто выручает схема согласования уровней на полевых транзисторах:

 

Какой допустимый ток можно пропускать через GPIO в режиме “выхода”?

Согласно datasheet-у, максимально допустимый ток для ESP32 классической линейки – 40 мА (миллиампер) на вывод. Но следует помнить, что в сумме по всем выводам ток не должен превышать 1200 мА (когда на всех выходах установлен высокий уровень), иначе возможен перегрев и выход чипа из строя.

Но и это ещё не всё – как следует из описания GPIO API по умолчанию выводы настроены на ограничение тока 20 мА, а ток в 40 мА ещё нужно дополнительно настраивать с помощью gpio_set_drive_capability().

 

Нужно ли подтягивать свободные не используемые GPIO к +3,3 или к GND?

Можно, а зачем?

В принципе, это не помешает (при этом следует обязательно учитывать, что некоторые GPIO (Strapping pins) уже подтянуты к определенному уровню и ломать это поведение нельзя). Но зачем?

Внутри ESP уже есть программно подключаемые резисторы встроенной слабой подтяжки – для этих целей их вполне хватит. Поэтому проще и разумнее использовать их. Да и на Strapping pins это никак не повлияет, так как такая подтяжка будет активирована уже после запуска CPU.

 

Можно ли подключать к ESP32 (и ESP8266) пятивольтовые релейные модули для Arduino?

Вполне, но тут стоит понимать, что в этом случае необходимо “разделить” питание реле и оптрона, который обычно стоит на входе таких модулей. Для этого снимите перемычку “JD-VCC”, и подключите на контакт питания реле 5 вольт, а на контакт питания оптрона – 3,3В от микроконтроллера. Тогда все будет работать, и работать корректно.

 

Как увеличить количество входов или выходов ESP? Что делать, если выводов мало?

Один из вариантов – воспользоваться любым I2C-расширителем GPIO, например PCF8574, PCF8575, MCP23017 или аналогичными.

 


Прошивка ESP32

Хочу программировать ESP – какое оборудование, программатор или кабель мне понадобится? Нужен ли специальный программатор для ESP32? 

Специальный программатор не нужен! Как минимум вам понадобится:

  • Любая “отладочная” плата типа DevKit или NodeMCU-32 (со встроенным USB-портом).
  • Если вы используете такую платку, то еще вам потребуется только компьютер с установленной средой программирования (это могут быть Arduino IDE, VSCode + ESP-IDF, PlatfotmIO, Espressif IDE и т.д.) и USB-кабель с соответствующим разъемом (как правило это Type C или Micro USB).

Другое дело, если на используемой вами плате с ESP32 совсем нет USB-порта, а есть только разъем UART0 – тогда дополнительно понадобится преобразователь интерфейса.

В относительно небольшом (ROM) ПЗУ ESP хранится только специальная программа – bootloader (загрузчик). Bootloader это служебная мини-программа, которая позволяет загружать скомпилированный вами код в микроконтроллер без использования специальных аппаратных программаторов. То есть по сути это программный программатор ESP (каламбур-с). Именно он берет на себя функции получения двоичных данных из UART (или USB) и записи на flash-память. Но, кроме функций программатора, bootloader выполняет и другие функции – он управляет выбором OTA раздела и запуском записанного туда ранее кода. 

 

Где найти драйвер для подключения ESP32 к компьютеру? 

Для плат с использованием моста USB-UART0 (все классические ESP32) можно воспользоваться следующими ссылками, в зависимости от того, какая микросхема использована на вашей плате:

Если вы подключаете ESP32-C3 или ESP32-S3 через интегрированный порт USB, вам потребуется другой драйвер:

 

A fatal error occurred: Failed to connect to ESP32

Система “не видит” ESP32 (это может быть из-за неправильно выбранного порта или неисправного кабеля – см. предыдущий случай) или инструмент прошивки не может перевести чип в режим прошивки.

Попробуйте перевести ESP в режим загрузки прошивки вручную — зажмите кнопку BOOT в момент начала загрузки (когда в логе появляется Connecting…) и отпустите после старта. Можно также сделать это предварительно (перед нажатием кнопки Upload) — зажмите кнопку BOOT, потом нажмите RESET, и только после этого отпустите BOOT.

Иногда также помогает снизить Upload Speed до 115200 – если ваш кабель низкого качества.

 

Hash of data verified – что это означает?

Это переводится как “хэш-сумма полученных данных проверена”, а означает это просто “данные прошивки успешно получены, записаны на flash, и их достоверность проверена на наличие ошибок”. Выдается инструментом загрузки прошивки после того, как прошивка записана в ESP32. После этого должен быть “hard resetting via RTS pin” – см. ниже.

 

Hard resetting via RTS pin – это ошибка или это так и должно быть?

Это абсолютно нормальное поведение. На русский это сообщение переводится как “Жесткий сброс через контакт RTS…” – то есть это говорит лишь о том, что прошивка успешно завершилась, и плата сейчас сама перезагрузится, чтобы запустить только что загруженный вами код. Это сообщение выдает инструмент esptool.py (с помощью которого, собственно, и загружается ваша прошивка в модуль), после того, как прошивка успешно загружена и проверена.

“Позвольте,” – спросит внимательный читатель – “но ведь микроконтроллер сбрасывается низким уровнем на выводе EN, а вывода RTS у ESP32 вообще нету“. Дело в том, что на многих отладочных платах программирование происходит через интерфейс USB-UART, который как раз и имеет сигнал RTS; который, в свою очередь, связан с выводом EN микроконтроллера посредством специальной схемы на так называемых “волшебных транзисторах”. Вот и получается, что “дергая” сигнал RTS, система сборки перезагружает SoC. Подробнее об этом здесь.

 

Как прошивать ESP, если на плате нет USB-порта?

В этом случае вам необходимо воспользоваться любым внешним преобразователем интерфейса USB <-> UART. Существует огромное количество вариантов таких адаптеров, но вам нужен такой, который имеет полноценную поддержку 3.3В на линиях данных. Искать на ali: usb ttl 3v3. Возможно, придется перевести чип в режим программирования “вручную” – см. ниже.

 

Как перевести ESP в режим программирования “вручную” (например при прошивке через COM-порт UART0)?

Режимом загрузки прошивки в ESP32 “управляет” Strapping pin GPIO0 – низкий уровень на этом выводе при сбросе микроконтроллера означает, что загрузчику нужно быть готовым к принятию двоичных данных прошивки. К этому выводу почти на всех платах с ESP подключена кнопка BOOT.

Соответственно для перевода ESP32 в режим программирования необходимо:

  1. нажать кнопку BOOT,
  2. не отпуская её, кратковременно нажать кнопку RESET,
  3. отпустить кнопку BOOT.

После данных манипуляций микроконтроллер переходит в режим программирования – в программе “монитор” должно появиться сообщение “Waiting for download”. Это означает, что загрузчик ждет данные прошивки от компьютера.

На платах разработчика (ESP32-DevKit-V1, ESP32-DevKitС-V4 и подобных) обычно стоит специальная схема для управления уровнями на GPIO0 и RESET, поэтому нажимать кнопку BOOT обычно не требуется. Но для плат типа ESP32 Relay X4 приходится выполнять данные манипуляции вручную.

 

Почему иногда ESP32 не “прошиваются” через кабель USB?

Иногда микроконтроллер никак не удается “прошить” через USB-кабель – программа загрузки прошивки не “видит” микроконтроллер, то есть ESP не переходит в режим программирования. Причин этого может быть много – от неисправности самого кабеля, до чего угодно.

Самая вероятная причина этого – микроконтроллер отказывается переходить в режим прошивки по причине неверных логических состояний на Strapping pins из-за подключенных внешних элементов. Доходит даже до того, что flash-память может просто лишиться питания, так как этим тоже управляет вывод GPIO12. Если Ваша ESP32 подключена к схеме через панельку (а я всегда рекомендую так делать) – выньте её из основной схемы и повторите попытку. Если прошивка “свободной” ESP32 завершиться успешно – причина именно в Strapping pins. Будьте внимательны при выборе выводов для проекта.

Если Strapping pins не задействованы и не подтянуты никуда, то попытайтесь перевести чип в режим программирования вручную с помощью кнопок, как описано выше. Если вручную режим программирования выбрать получается, причина может быть в недостаточной емкости конденсатора на выводе EN – подробности тут.

 


Система сборки ESP-IDF

Как открыть меню конфигурации проекта | редактировать sdkconfig | зайти в menuconfig |  открыть menuconfig | запустить menuconfig?

Это зависит от того, какую систему разработки вы используете для работы.

  • Если вы используете Visual Studio Code + ESP-IDF – очень просто запустить меню конфигурации проекта прямо из интерфейса IDE, для этого в меню есть аж два способа:
    • графический (в виде дерева) – выберите пункт Project Configuration Editor в меню ESP IDE или запустите команду ESP-IDF: SDK Configuration Editor
    • текстовый (классический вариант) – выберите пункт Open Classic Menuconfig Terminal в расширенном меню ESP IDE или запустите команду ESP‑IDF: Run menuconfig
  • Если вы используете Visual Studio Code + PlatformIO – наберите в терминале команду pio run -t menuconfig. Возможно, потребуется дополнительно указать полный путь к pio.exe, или зарегистрировать его в переменных окружения.
  • Если вы используете ESP-IDF и командную строку – наберите в ней idf.py menuconfig. При этом терминал необходимо запустить командой IDE ESP-IDF: Open ESP-IDF Terminal или открыть ярлык Windows ESP-IDF PowerShell – см. далее вопрос “как запустить idf.py?”.  
  • Если вы используете Arduino IDE – забудьте. Нет такой буквы в этом слове.

 

Что такое idf.py, где найти idf.py?

idf.py — это основной инструмент командной строки для ESP-IDF, он используется для управления проектами: сборки, прошивки и отладки. На самом деле сам этот скрипт ничего не выполняет, это скрипт-обертка — он вызывает CMake для настройки проекта и Ninja (или GNU Make) для непосредственной компиляции; либо инструмент прошивки esptool.py — через него загружают готовую прошивку в чип. 
Файл idf.py входит в состав ESP-IDF. Его фактическое расположение зависит от ОС и способа установки — он лежит в папке tools внутри директории ESP-IDF, например: .../esp-idf/tools/idf.py. Для запуска обычно не используют полный путь, а обращаются к нему, используя переменную окружения IDF_PATH (путь к корню ESP-IDF).
Примеры команд:

  • idf.py set-target <чип> – выбор микроконтроллера
  • idf.py menuconfig – настройка параметров проекта
  • idf.py build – компиляция (сборка)
  • idf.py -p <порт> flash – прошивка на плату

 

Как запустить idf.py?

Это зависит от того, откуда вы хотите его запустить:

  • Самый простой и очевидный способ – использовать встроенные команды расширения ESP-IDF в VSCode (Visual Studio Code) / Theia IDE, если вы его используете:
    Нажмите Ctrl+Shift+P → начните вводить ESP-IDF: Open ESP-IDF Terminal, затем выполните эту команду — откроется терминал с уже настроенным окружением, и idf.py будет доступен сразу.
  • Из VSCode + PlatformIO: idf.py напрямую здесь НЕ используется. так как PlatformIO использует свою собственную систему сборки. Вместо этого вы работаете с командой: pio run -t <цель>, например:
    • pio run – собрать проект
    • pio run -t menuconfig – настроить проект
    • pio run -t upload – прошить
    • pio run -t monitor – открыть монитор порта
  • Из командной строки Windows (cmd / PowerShell): перед использованием idf.py нужно активировать окружение ESP-IDF. Самый надёжный способ: запустите специальный ярлык из меню «Пуск»: ESP-IDF Command Prompt (cmd) или ESP-IDF PowerShell — он сам всё настроит, и idf.py будет доступен.
    Если вы работаете в обычном терминале (cmd или PowerShell), выполните вручную: %IDF_PATH%\export.bat, после этого idf.py станет доступен в этом окне.
  • Из командной строки Linux (bash / zsh): аналогично Windows, нужно сначала активировать окружение: выполните команду source $IDF_PATH/export.sh (или, если вы находитесь в папке с ESP-IDF: ./export.sh). После этой команды idf.py будет доступен в текущем терминале.

 


Официальная документация

В сети вы можете найти множество отличных сайтов, статей и видео, посвященных ESP32, в том числе и русскоязычных. Ну например:

Есть еще форумы, но лично я их не люблю и информация, там встречающаяся, зачастую весьма спорна.

Но я бы вам рекомендовал пользоваться не только русскоязычными источниками, но и официальными источниками. Просто потому, что некоторые статьи и видео на сторонних сайтах, посвященные API, довольно быстро устаревают. В том числе и на этом сайте. У Espressif есть большая команда технических писателей, которые поддерживают документацию в актуальном состоянии – дополняют, исправляют, корректируют. У меня, например, такой возможности нет чисто физически – поэтому многие статьи уже могут содержать не актуальную информацию. Я, конечно, стараюсь исправлять что-то, но… Поэтому – мой совет такой: прочли статью – проверьте изложенные факты по  официальной документации. И просьба: если нашли несоответствие на данном сайте – оставьте, по возможности, комментарий – я постараюсь исправить. Спасибо.

Итак.

Software

  • ESP-IDF Programming Guide — основной портал документации по ESP-IDF. Здесь описана настройка среды, API, периферийные драйверы, сетевые протоколы и система сборки. Всё на английском.
  • Arduino-ESP32 Online Documentation — основной портал документации по Arduino Core для ESP32. Здесь описаны все поддерживаемые чипы, настройка среды и библиотеки.
  • Getting Started (Arduino ESP32) — руководство по началу работы, где перечислены все поддерживаемые SoC (ESP32, ESP32-S2, ESP32-S3, ESP32-C3, ESP32-C6, ESP32-H2, ESP32-P4)

Компоненты и дополнительные ресурсы

  • ESP Component Registry — это официальный репозиторий, где хранятся готовые компоненты (драйверы датчиков, протоколы, решения вроде ESP-Matter). 
  • Документация по ESP Component Registry — описание того, как искать, устанавливать и публиковать компоненты.
  • ESP-IoT-Solution — набор компонентов и драйверов для периферии от Espressif
  • VS Code ESP-IDF Extension — официальное расширение для Visual Studio Code, которое интегрирует ESP-IDF и Component Registry прямо в среду разработки.
  • Официальный GitHub Espressif — здесь находятся исходные коды ESP-IDF, Arduino Core и многих других проектов.
  • Форум ESP32 (ESP32 BBS Forum) — сообщество инженеров для обсуждения проблем и обмена опытом.

Hardware

 


Продолжение следует…

Оцените по шкале от 1 до 5 - насколько эта статья была Вам полезна?
[ 5 из 5, всего 20 оценок ]

-= Каталог статей (список по разделам) =-   -= Архив статей (плитки, все подряд) =-

Небольшой анонимный опрос: какие статьи вы предпочитаете?

33 комментария для “Часто задаваемые вопросы ESP32 ( FAQ ESP32 )”

  1. Александр

    Добрый день.
    Подскажите, как с вами можно связаться?
    Вопрос относительно помощи.
    Телеграмм
    the_versteck

  2. Добрый день. Не нашел на сайте как работать с UART. Да, да ESP32 может отправлять данные с частотой 115200, но этого мало. У меня датчик MH-Z19B, который требует отправки и приема данных на частоте 9600. Мне очень нужна ваша помощь.

    1. Про UART пока нет такой статьи. В работе статья про RS485 и Modbus, оно как раз работает поверх UART1 или 2.
      Также в планах сделать проект сравнения разных датчиков СО2, в том числе и как у вас. Но всему свое время.
      Понимаю – вам нужно здесь и сейчас, но на все разу и для всех меня не хватит

  3. Добрый день.
    При логировании данных через GSM на сервер (в БД) не всегда бывает доступна связь. Вариант – сохранения данных на SD карту. Но не совсем понятно, как нормально реализовать передачу накопленных на SD карте при восстановлении связи.

  4. Как можно полностью выпилить freertos с esp32-s3 при использовании ESP-IDF? Есть желание поработать с регистрами напрямую, не прибегая к ассемблеру.
    Также хочу потестить МК в управлении преобразователями где ОС будет только мешаться.

    1. Никак. ESP-IDF == FreeRTOS по определению.
      Напишите свой фреймворк и свой загрузчик, которые возьмут на себя все управление “железом” вместо ESP-IDF

  5. Приветствую! Есть контроллер Zont H2000+ pro V2. Установлен в котельной для управления двумя котлами через датчики NTC и 1-wire. Столкнулся с проблемой отвала 4 реле и 2 вход/выход. Завязаны они как раз на один из ESP32. Собственно у меня вопрос следующего характера: Можно ли программно отключить один из ESP32? Если да, то как это можно сделать? Либо подскажите можно ли его угробить физически и как?? На реле заведены +12V управляющие промежуточными реле, на Вх/Вых управление твердотельным реле (используется для управления сервоприводом смесителя)
    Заранее благодарен и с наступающим!

  6. Алесандр

    Имеется 2 ESP 32 установленные на одной плате, нужно наладить их общение по проводам, uart 0 и uart 1 заняты на каждом модуле, но на esp 32 вроде как имеется по 3 UART, можно ли наладить общение модулей используя третий UART на каждой плате, или лучше использовать какие-то другие способы i2c или SPI к примеру

  7. Алесандр

    Просто в интернете есть утверждения, что третий UART нежелательно использовать , не будет ли проблем, а вообще из практики через какую шину в плане скорости и стабильности лучше наладить по проводам общение двух есп 32, находится на одной плате на расстоянии пару см

    1. Нежелательно использовать uart0. Так как в него пишет логи отладка и с него ждет данных загрузчик.
      А uart1 и 2 используйте как хотите

  8. День добрый Уважаемые.
    Вопрос про загрузку любого скетча(включая примеры)
    С недавних пор загрузка изменилась и заканчивается строками:
    …………………..
    Writing at 0x0004abde… (90 %)
    Writing at 0x00053b28… (100 %)
    Wrote 292384 bytes (157534 compressed) at 0x00010000 in 2.8 seconds (effective 840.7 kbit/s)…
    Hash of data verified.
    Leaving…
    Hard resetting via RTS pin… —– я так понимаю для выхода надо сбросить через контакт RTS ? – Это как нет такого пина?

    На чёрном фоне белый текст.
    Ранее текст был красный
    (правда я с прерываниями пробовал по эксперементировать )
    кто то сталкивался с этим,?

    1. Это совершенно нормальное поведение…
      Переводится это так:

      Запись по адресу 0x0004abde… (90 %)
      Запись по адресу 0x00053b28… (100 %)
      Записано 292384 байта (157534 сжато) по адресу 0x00010000 за 2,8 секунды (эффективная скорость 840,7 кбит/с)…
      Хэш данных проверен.
      Выход…
      Жесткий сброс через контакт RTS…

      Только здесь имеется в виду не контакт ESP, а контакт USB-TTL адаптера. Почитайте тут: https://kotyara12.ru/iot/usb-ttl-adapters/

      1. Спасибо, почитал….
        т.е Это собственно штатное сообщение о завершении загрузки и сбросе этого режима в адаптaре? – я правильно понял,?

        1. Да. Только уточнение: RTS на адаптере напрямую соединен с EN контроллера. Поэтому изменение уровня на нем вызывает сброс микроконтроллера

  9. Добрый день! Подскажите на многих схемах из интернета вывод VIN на отладочной плате используется для питания силового реле, но вроде как он используется только как вход для питания платы вместо USB. Его можно использовать как выход 5в для питания внешних устройств?

        1. Я думаю, так вполне можно спалить usb порт. Если нагрузка будет мощная. Но с одним реле может и прокатить.

          1. Спасибо за ответ! Планируемая суммарная нагрузка на 2 канальном реле не больше 8Вт. Питание отладочной платы думал сделать от обычного зарядника для смартфона. Есть самодельный озонатор для обуви: пластиковая коробка(условно герметичная), внутри нее собственно сам озонатор с али, и вентилятор от ПК на 12в . Хочу что бы это все работало или по определенной заданной мной логике или управлялось со смартфона на практике станет понятней что удобней

            1. А зачем подавать питание на все это через USB-порт? Смысла никакого не вижу… Да еще 12В

    1. Может неправильно объяснил. Есть три розетки (внутри пластиковой коробки)на 220в подключенные параллельно. В первую включен озонатор , во вторую БП 12в для вентилятора, в третью зарядник для телефона который питает плату ESP32 через USB. Первая(озонатор)и вторая(БП12в) розетка размыкаются/ замыкаются через реле, которым управляет ESP32.

      1. Все равно лично я бы не стал питать реле через USB-порт. Надежнее подать 5В на соответствующий контакт платы.
        В тестовых целях питание через USB вполне допустимо и я часто этим пользуюсь. Но в устройстве, которое будет работать 24/7 это рискованно

        1. В целом так и планировал использовать, только для тестов.
          Немного не разобрался с выводом VIN как его использовать поэтому и возник такой вопрос.
          Отсюда же появился и еще один вопрос. Сгодиться ли обычный блок питания не USB с выходом на 5в и током 2A, если этот выход распаралелить и запитать одной линией плату ESP32 через VIN , а другую линию использовать для питания реле?

    2. День добрый,
      Первый пост почему-то пропал.
      Помогите разобраться с техникой вывода на графический дисплей 1,8″ 128×160 RGB
      вот часть скетча:
      tft.fillScreen(ST77XX_BLACK); //красим весь экран в черный цвет
      tft.setRotation(1); //ориентация экрана
      tft.setCursor(5, 5); //координаты начала текста
      tft.setTextSize(2); //размер текста
      tft.setTextColor(ST77XX_GREEN); //цвет текста
      tft.setTextWrap(false); //текст не переносим
      tft.print(frequency, 6); //значение пока 0.000000
      delay(1000);

      tft.setCursor(5, 5);
      tft.setTextSize(2);
      tft.print(“TEST MAY TEXT”); //
      Ожидал -что в конце получу – TEST MAY TEXT , но получил логическое сложение нулей и этой строчки
      т.е последующая строка не затирает предыдущее значение на экране.
      Пробовал забивать второе значение пробелами – вообще ничего не менялось
      Подскажите как обновить инфо в строке , без полного сброса дисплея?
      Спасибо.

      1. Он не пропал, здесь обязательная премодерация. Иначе каждый день по десятку комментариев со спамом
        Такие вопросы лучше задавать в чате, ссылка есть в правой колонке сайта: https://t.me/+JnXf9sQ4–tjMzZi
        Там наверняка есть люди, которые работали с этим и помогут

          1. А я с ардуино не дружу ))) И с дисплеем этим не работал. Поэтому сложно сказать.
            А в телеграм людей много, может кто-то что-то бы и подсказал.
            Но как знаете

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

      +  59  =  60