Добрый день, уважаемые читатели!
В данной статье я решил просто собрать часто возникающие вопросы и проблемы с ESP32 и методы их решения, найденные не только и не столько мной, а вообще на просторах интернета – на форумах, сайтах и т.д. В формате вопрос – краткий ответ. На некоторые вопросы я уже отвечал в своих статьях, поэтому буду просто приводить ссылки на них.
Пока список FAQ очень маленький, я записал сюда только то, что удалось вспомнить на текущий момент. Но он, надеюсь, будет постоянно пополняться – рекомендую добавить адрес данной страницы в закладки, чтобы вернуться к нему позже. Вы также можете оставить свои вопросы в комментариях, и я постараюсь на них ответить. Если смогу.
Железо
Вопрос: Почему все носятся с этим ESP32, когда скажем STM32 гораздо круче?
Ответ: Ответ прост: это, пожалуй, единственный массовый микроконтроллер с WiFi и BT “на борту”. И дешевый. Да он далеко не идеален, но альтернатив по сути нет.
Вопрос: Можно ли ESP32 работать при напряжении питания 5 вольт?
Ответ: Однозначно нет. Согласно datasheet-у, допустимое напряжение питания должно находиться в пределах 3,2~3.6В. Примерно то же самое относится и к GPIO (подробнее ниже, в разделе GPIO). Те 5 вольт, который подаются на плату типа DevKit, преобразуются в необходимые для питания микроконтроллера 3,3В дополнительным стабилизатором, установленным на плате. Если вы планируете использовать “голый” модуль или чип, вы должны будете озаботиться этим самостоятельно.
Вопрос: Чем отличается модуль ESP32-WROOM от ESP32-WROVER?
Ответ: Для классической линейки ESP32 модули WROVER дополнительно оснащены микросхемой внешней оперативной памяти, которая работает через достаточно узкое “окно” в адресном пространстве (для новых линеек возможен доступ к внешней памяти уже через DMA). Но взамен мы теряем два GPIO ( #16 и #17 ), которые как раз и заняты обслуживанием этой самой внешней памяти. Более подробно о чипах и модулях классической линейки я рассказывал в другой статье.
Вопрос: Что за загадочные обозначения вроде “N8R8” иногда указываются в характеристиках модулей с ESP32?
Ответ: Таким образом указан объем flash-памяти (после буквы N) и дополнительной внешней RAM (ОЗУ) (после буквы R). Все это в мегабайтах. Таким образом N8R8 означает, что объем встроенной flash-памяти составляет 8 МБ, и объем дополнительной RAM тоже 8 МБ. На сайте espressif.com ничего нет о таком способе маркировки модулей, но тем не менее на новых модулях, произведенных espressif, новая маркировка встречается, например MFN4 ( = N4R0 ) или MGN16R8 ( =N16R8 ).
Вопрос: Как используются ядра на двухядерных версиях ESP32?
Ответ: По умолчанию на первом (нулевом) ядре процессора работает WDT (сторожевой таймер), планировщик FreeRTOS и некоторые другие служебные задачи. А второе ядро по умолчанию отдано под прикладную задачу или задачи. Но ничто не мешает вам изменить это поведение программным способом. В последних версиях платформы Arduino 32 появилась опция, позволяющая изменить это поведение с помощью стандартных настроек IDE.
Платформы и софт для программирования
Самый популярный вопрос у тех, кто впервые столкнулся с ESP32:
Вопрос: Как убрать или каким-либо образом избавиться от FreeRTOS из ESP32!!!??? зачем он мне? Что, на ESP32 без FreeRTOS никак нельзя?
Ответ: Увы, но нельзя. Даже если вы пишете код в Arduino – вы вполне можете “делать вид”, что жизни на марсе FreeRTOS не существует, но FreeRTOS будет работать на ESP32 по “тихому”, не зависимо от вас и вашего кода. Избавится можно, но вам придется написать свой собственный загрузчик, а также свой собственный SDK для работы с “железом”, так как весь стандартный API заточен под FreeRTOS.
Вопрос: Почему при компиляции простейших примеров типа Blink и Hello, world получается огромный бинарник и используется так много памяти?
Ответ: Причина та же самая, что и предыдущем случае – даже в самом простейшем случае используется FreeRTOS, а значит запускается планировщик и служебные задачи. Отсюда и накладные расходы.
Вопрос: Какую платформу лучше использовать для программирования ESP32?
Ответ: Основных платформы всего две – Arduino ESP32 и ESP-IDF, и обе используют язык C/C++ и основаны на операционной системе FreeRTOS. Есть ещё возможность программировать на MicroPython и LUA, но это больше из разряда “для опытов” (впрочем может я и ошибаюсь). А вот IDE можно использовать несколько разных: Arduino IDE, PlatfromIO и Espressif IDE. Что выбрать? Сложный вопрос… Но я попытался описать все эти тонкости в статье “Как и на чем программировать ESP32 и ESP8266“
Проблемы с программированием ESP32
Вопрос: Для чего нужен bootloader (загрузчик)?
Ответ: Bootloader это служебная мини-программа, которая позволяет загружать скомпилированный вами код в микроконтроллер без использования специальных аппаратных программаторов. То есть по сути это программный программатор ESP (каламбур-с). Именно он берет на себя функции получения двоичных данных из UART и записи на flash-память. Но, кроме функций программатора, bootloader выполняет и другие функции – он управляет выбором OTA раздела и запуском записанного туда ранее кода. ESP-IDF позволяет вам использовать либо стандартный загрузчик, либо написать свой.
Вопрос: Как прошить или перепрошить ESP32, если на плате нет USB-порта?
Ответ: В этом случае вам необходимо воспользоваться внешним адаптером USB <-> UART. Существует огромное количество вариантов таких адаптеров, но вам нужен такой, который имеет полноценную поддержку 3.3В на линиях данных. Искать на ali: usb ttl 3v3
Вопрос: Как перевести ESP в режим программирования через COM-порт (UART0)?
Ответ: Режимом загрузки прошивки в ESP32 “управляет” strapping pin GPIO0 – низкий уровень на этом выводе при сбросе микроконтроллера означает, что загрузчику нужно быть готовым к принятию двоичных данных прошивки. К этому выводу почти на всех платах с ESP подключена кнопка BOOT. Соответственно для перевода ESP32 в режим программирования необходимо зажать кнопку BOOT, и не отпуская её, кратковременно нажать кнопку RESET. После данных манипуляций микроконтроллер переходит в режим программирования. На платах разработчика (ESP32-DevKit-V1, ESP32-DevKitС-V4 и подобных) обычно стоит специальная схема для управления уровнями на GPIO0 и RESET, поэтому нажимать кнопку BOOT обычно не требуется. Но для плат типа ESP32 Relay X4 приходится выполнять данные манипуляции вручную.
Вопрос: Почему иногда ESP32 не “прошиваются” через кабель USB?
Ответ: Иногда микроконтроллер никак не удается “прошить” через USB-кабель – программа загрузки прошивки не “видит” микроконтроллер. При этом в этих ваших интернетах можно прочитать утверждение мол “китайцы шалят, брака полно – выбросьте в окно”. На мой взгляд – весьма и весьма спорное утверждение. Причин может быть много – но самая вероятная – микроконтроллер отказывается переходить в режим прошивки по причине неверных логических состояний на Strapping Pins из-за подключенного внешнего оборудования. Доходит даже до того, что flash-память может просто лишиться питания, так как этим тоже управляет вывод GPIO5. Если Ваша ESP32 подключена к схеме через панельку (а я всегда рекомендую так делать) – выньте её из основной схемы и повторите попытку. Если прошивка “свободной” ESP32 завершиться успешно – причина именно в Strapping Pins. Будьте внимательны при выборе выводов для проекта. Либо попытайтесь перевести чип в режим программирования вручную, как описано выше.
FLASH
Вопрос: Прошивка (скетч) не помещается на flash-память! Неужели flash-память такая маленькая, а ведь обещали 4Мб?
Ответ: Дело в том, что подключенная к микроконтроллеру 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 периферийные устройства с TTL-уровнями 5 вольт?
Ответ: Я бы категорически не советовал так делать. Согласно datasheet-у, максимально допустимый уровень напряжения на входе – VDD+0.3В, то есть 3,3+0,3 = 3,6В.
Если напряжение на входе будет выше указанного значения – откроется внутренний защитный диод, и “сбросит” излишки напряжения на шину питания. Но ничего хорошего это точно не дает. По крайней мере, я совершенно точно знаю, что шина I2C в условиях подтяжки линий к +5В работать отказалась.
Вопрос: А что же делать, если ну очень-очень-очень нужно подключить к ESP32 5в устройство?
Ответ: В зависимости от обстоятельств. Если вам нужно подключить 5В только “на вход”, то можно использовать банальный резистивный делитель. В более сложных случаях можно применить оптрон или иной способ. Меня также часто выручает схема согласования уровней на полевых транзисторах – экономично и дешево:
Вопрос: Какой допустимый ток можно снимать с GPIO ESP32 в режиме “выхода”?
Ответ: Согласно datasheet-у, максимально допустимый ток для ESP32 классической линейки – 40 мА (миллиампер) на вывод. Но следует помнить, что в сумме по всем выводам ток не должен превышать 1200 мА (когда на всех выходах установлен высокий уровень), иначе возможен перегрев и выход чипа из строя. Но и это ещё не всё – как следует из GPIO API по умолчанию выводы настроены на ограничение тока 20 мА, а ток в 40 мА ещё нужно дополнительно настраивать с помощью gpio_set_drive_capability().
Вопрос: Нужно ли подтягивать свободные не используемые GPIO к +3,3 или к GND?
Ответ: В принципе, это никогда не помешает (при этом следует обязательно учитывать, что некоторые GPIO (Strapping Pins) уже подтянуты к определенному уровню и ломать это поведение нельзя). Но зачем? Внутри ESP уже есть программно подключаемые резисторы встроенной слабой подтяжки – для этих целей их вполне хватит. Поэтому проще и разумнее использовать их. Да и на Strapping Pins никак не повлияет, так как будет активирована уже после запуска МК.
Вопрос: Можно ли подключать к ESP32 (и ESP8266) пятивольтовые релейные модули для Arduino?
Ответ: Вполне, но тут стоит понимать, что в этом случае необходимо “разделить” питание реле и оптрона, который обычно стоит на входе таких модулей. Для этого снимите перемычку “JD-VCC”, и подключите на контакт питания реле 5 вольт, а на контакт питания оптрона – 3,3В от микроконтроллера. Тогда все будет работать, и работать корректно.
Продолжение следует…
Пожалуйста, оцените статью:
Добрый день.
Подскажите, как с вами можно связаться?
Вопрос относительно помощи.
Телеграмм
the_versteck
Контакты на главной странице сайта внизу
Добрый день. Не нашел на сайте как работать с UART. Да, да ESP32 может отправлять данные с частотой 115200, но этого мало. У меня датчик MH-Z19B, который требует отправки и приема данных на частоте 9600. Мне очень нужна ваша помощь.
Про UART пока нет такой статьи. В работе статья про RS485 и Modbus, оно как раз работает поверх UART1 или 2.
Также в планах сделать проект сравнения разных датчиков СО2, в том числе и как у вас. Но всему свое время.
Понимаю – вам нужно здесь и сейчас, но на все разу и для всех меня не хватит
Есть ли проверенная инфа по подключению непосредственно к USB? А то информация в http://samopal.pro/wp13_samopal/wp-content/uploads/3823/Chema0-1-800×679.jpg не кажется достоверной
Для этого в первую очередь следует изучить технический паспорт. Я этими моделями не пользуюсь
Добрый день.
При логировании данных через GSM на сервер (в БД) не всегда бывает доступна связь. Вариант – сохранения данных на SD карту. Но не совсем понятно, как нормально реализовать передачу накопленных на SD карте при восстановлении связи.
Как можно полностью выпилить freertos с esp32-s3 при использовании ESP-IDF? Есть желание поработать с регистрами напрямую, не прибегая к ассемблеру.
Также хочу потестить МК в управлении преобразователями где ОС будет только мешаться.
Никак. ESP-IDF == FreeRTOS по определению.
Напишите свой фреймворк и свой загрузчик, которые возьмут на себя все управление “железом” вместо ESP-IDF