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

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

В данной статье я решил просто собрать часто возникающие вопросы и проблемы с 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). Более подробно о чипах и модулях классической линейки я рассказывал здесь.

 

Вопрос: Как используются ядра на двухядерных версиях 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. Будьте внимательны при выборе выводов для проекта. Либо попытайтесь перевести чип в режим программирования вручную, как описано выше.

 


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В от микроконтроллера. Тогда все будет работать, и работать корректно.

 


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


Пожалуйста, оцените статью:
[ 5 из 5, всего 4 оценок ]

7 комментариев для “ESP32 в вопросах и ответах ( FAQ )”

  1. Александр

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

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

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

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

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

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