Добрый день, уважаемые читатели!
В данной статье я решил собрать часто задаваемые вопросы и проблемы ESP32 и методы их решения, найденные не только и не столько мной, а вообще на просторах интернета – на форумах, сайтах и т.д. В формате вопрос – краткий ответ. На некоторые вопросы я уже отвечал в своих статьях, поэтому буду просто приводить ссылки на них.
Пока список FAQ очень не большой, но он, надеюсь, будет постоянно пополняться. Вы также можете оставить свои вопросы в комментариях, и я постараюсь на них ответить. Если смогу.
- Чипы, модули, платы… – вопросы по “железу”
- Вопросы по самостоятельному программированию ESP
- Аппаратные особенности ESP32
- GPIO – немного про Strapping pins, “толерантность” и согласование логических уровней
- Проблемы с прошивкой ESP32
- Система сборки
- Ссылки на официальную документацию
Чипы, модули, платы…
Почему все носятся с этим 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 – здесь вы сможете найти официальную документацию по любому чипу
Как выбрать нужный для проекта модуль и не запутаться в этих самых сериях?
Можно ориентироваться на следующий алгоритм:
- Вам нужно дешево и сердито, только Wi-Fi, без сложной логики (включить свет, отправить одну цифру на сервер без TLS раз в минуту) → берите ESP8266. Это все еще рабочий вариант для самых простых проектов, хотя и устаревший.
- Нужен Wi-Fi + Bluetooth или чуть больше памяти → выберите ESP32-C3, он почти такой же дешевый, как 8266, но современный и безопасный.
- Нужен 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, про которые чуть подробнее ниже.
Подробнее об выводах можно почитать в других статьях:
- ESP32 pinout: почти всё о GPIO
- ESP32-S3: чипы, модули & pinout
- ESP32 SoC :: datasheet на русском (перевод)
- ESP32-WROOM-32E/UE :: datasheet на русском (перевод)
- ESP32-S3-WROOM-1/1U :: datasheet на русском (перевод)
Что такое Strapping pins и можно ли их использовать?
Все ESP имеют специальные Strapping pins или “выводы обвязки”, с помощью которых можно управлять режимом работы микроконтроллера при его запуске.
- Например самый “известный” из них –
GPIO0, который включает “режим прошивки”. - Самый критичный (для ESP32) –
MTDI(GPIO12), который управляет напряжением Flash-памяти.
Все Strapping pins работают одинаково – при запуске процессора логические уровни на них записываются в специальные защелки и эти состояния используются для настройки МК, после чего их можно использовать как обычные GPIO. Поэтому общий совет таков: “не трогать” их во время сброса / запуска, а после запуска делайте с ними что хотите.
У разных серий ESP разные Strapping pins – обязательно сверяйтесь с паспортом чипа или модуля. Ниже таблица – пример для классической серии.
Можно ли подключать к 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 в режим программирования необходимо:
- нажать кнопку BOOT,
- не отпуская её, кратковременно нажать кнопку RESET,
- отпустить кнопку 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. При этом терминал необходимо запустить командой IDEESP-IDF: Open ESP-IDF Terminalили открыть ярлык WindowsESP-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, в том числе и русскоязычных. Ну например:
Есть еще форумы, но лично я их не люблю и информация, там встречающаяся, зачастую весьма спорна.
Но я бы вам рекомендовал пользоваться не только русскоязычными источниками, но и официальными источниками. Просто потому, что некоторые статьи и видео на сторонних сайтах, посвященны



