И снова, уже в третий раз (здесь у нас первый, вон там второй) вашему вниманию предлагается моя коробочка с Ардуинками. На этот раз будем извлекать из неё и рассматривать под светом допросной лампы платы на микроконтроллерах ESP8266 и ESP32. Также изучим краткую историю появления этих контроллеров, некоторые их особенности и
▍ Краткая история ESP
Полностью разобраться в хитросплетениях истории появления ESP8266 и ESP32 за давностью лет и языковым барьером не так-то просто, да и не очень-то нужно. Достаточно обозначить общие вехи в этой истории.
Логотип компании Espressif, потому что статье нужны какие-то иллюстрации
Микроконтроллеры ESP, которые правильнее было бы охарактеризовать как системы на чипе, разработала в 2013-2016 годах китайская компания Espressif Systems, существующая с 2008 года и специализирующаяся на беспроводных технологиях и IoT. В основе контроллеров применялись процессорные ядра архитектуры Xtensa американской компании Tensilica, позже к ним добавился американский же RISC-V. Производство физических микросхем ведётся на мощностях тайваньской TSMC. Так сказать, глобализация на службе человека. В данном случае человека-самоделкина.
Первый контроллер, собственно ESP8266, был разработан в 2013 году и отправился в производство в конце года. В августе 2014 года на рынке появился созданный на его основе модуль ESP-01 производства китайской же компании Ai-Thinker Technology. Он реализовывал поддержку Wi-Fi и TCP/IP, и мог применяться совместно с классическим Arduino или другими управляющими контроллерами в режиме Hayes-подобного модема (работа через AT-команды). Сочетание возможностей и крайне низкой стоимости привлекли внимание западных энтузиастов, и модуль начал набирать популярность в кругах местных самодельщиков.
Модуль ESP-01 со всех сторон. Фото из Интернета
Уже в октябре 2014 года Espressif открыла доступ к SDK для разработки пользовательского кода, способного выполняться непосредственно внутри контроллера, без привлечения дополнительных сущностей Arduino на ATmega. С помощью SDK сторонние разработчики подготовили несколько десятков решений, позволяющих задействовать эти платки в тех или иных целях.
Практически в то же время, осенью 2015 года, Espressif представила развитие линейки: похожий, но ещё более мощный и продвинутый контроллер ESP32, пошедший в производство в 2016 году. На его базе сторонние производители также начали выпускать множество недорогих модулей, появились различные решения для простой реализации IoT с поддержкой скриптов на Lua и MicroPython.
За и против: ESP IDF и Arduino IDE
И наконец, последним, решающим шагом к успеху стало добавления поддержки новых контроллеров, а также всего разнообразия плат от сторонних производителей на их основе, в Arduino IDE. Для ESP8266 это сделали энтузиасты, а для ESP32 уже сама компания Espressif.
▍ Новые горизонты
Пришествие контроллеров ESP в экосистему Arduino произвело в ней качественный сдвиг, которого не смогли добиться все предыдущие постепенно добавляемые контроллеры. Можно вполне уверенно сказать, что новые возможности открыли второе дыхание у постепенно теряющей актуальность платформы Arduino.
Проекты на классических Arduino в основном связаны с обработкой комбинаций сигналов и какой-то реакцией на них: мигание светодиодами и управление сервоприводами по показаниям датчиков, с автоматизацией и робототехникой. Например, поливалка для растений, кодовый замок, часы. Пожалуй, наивысшими достижениями Arduino тех лет стали управление хоббийными ЧПУ станками-гравёрами (посредством прошивки Grbl и Arduino CNC Shield) и 3D-принтерами (прошивка Marlin), а также первый открытый полётный контроллер для квадрокоптеров и не только, ArduPilot.
Пользовательские интерфейсы были ограничены и чаще представлены в формате маленьких монохромных экранчиков и пищалок. Графика, цвет и звук были редким явлением. Проектов с сетевыми интерфейсами было мало, так как для них требовались дополнительные модули, такие, как Bluetooth-модуль HC-05. Чтобы сделать какой-нибудь MP3 проигрыватель на Arduino, требовался специализированный чип декодера и карта памяти.
Всё это великолепие родом из начала 2000-х стремительно устаревало по мере углубления человечества в эпоху Интернета и мощных смартфонов, и популярность как самой платформы Arduino, так и электронного DIY в целом, постепенно снижались. Конечно, все идущие в ногу с прогрессом вещи можно было реализовать на появившийся в 2012 году Raspberry Pi. Но стоимость этих плат хотя и была относительно низка ($35), всё же это было многовато для встраивания в хоббийные проекты, а мощность даже избыточна для многих применений.
Появление гораздо более дешёвых ESP8266 и затем ESP32 открыло новые горизонты. Низкая стоимость в комбинации со встроенными беспроводными интерфейсами сделала доступными новые классы самоделок. Собственно, контроллеры для IoT открыли Arduino двери в мир этого самого IoT, «интернета вещей»: теперь не только модный холодильник, но и любые самоделки могли ходить в интернет.
Фокус проектов на новых контроллерах сместился от дрыгоножества к интеллектуальному управлению потоками данных между программными или аппаратными модулями и Интернетом. На ESP можно сделать хоть часы точного времени с синхронизацией по NTP, хоть погодную станцию, берущую прогнозы с сайтов, хоть интернет-радио, хоть Bluetooth-клавиатуру. Стало возможным соединяться и управлять самоделками через беспроводные интерфейсы: заходить на них со смартфона, настраивать через удобное меню нужные параметры, загружать и скачивать файлы.
Увеличившаяся буквально на порядок вычислительная мощность и увеличенные объёмы памяти принесли в самоделки и мультимедиа: звук и графику на более современных цветных TFT-экранах, и даже на экране телевизора, причём без применения каких-либо дополнительных аппаратных модулей.
Помимо низкой цены и широкой доступности новых контроллеров, важным ингредиентом стремительного роста их популярности стала реализация их поддержки в экосистеме Arduino. Что немаловажно, она работает совершенно человеческим образом, по образу и подобию классических плат: просто подключаешь кабель и нажимаешь кнопку загрузки. Никаких ритуалов с нажатиями кнопок сброса и перетыкания кабелей. Также доступны опции беспроводного обновления.
▍ Особые приметы
Так как основным функциональным назначением ESP8266 и ESP32 является IoT, их ключевой особенностью является наличие Wi-FI модуля, и ресурсов, достаточных для реализации сетевых функций. Соответственно, довольно могучее вычислительное ядро в них присутствует не просто так, а прежде всего для программной реализации TCP/IP стека.
Внутреннее устройство чипа и его периферии являются чёрным ящиком. Производитель не предоставляет документацию по низкому уровню, а для взаимодействия со всеми ресурсами, такими как ОЗУ, ПЗУ и периферийные устройства, предлагается использовать функции SDK. Ящик настолько чёрный, что для ESP8266 так и не был официально заявлен точный объём ОЗУ системы, указывалось лишь примерное количество памяти, свободное от использования системой. Впрочем, для ESP32 эту информацию сделали более доступной.
Карта памяти ESP32
В силу специфики IoT-контроллера, выполнение пользовательского кода является дополнительной опцией. Во время работы контроллера в фоне выполняются системные процессы, обрабатывающие связь, watchdog и другие элементы системы. Ими можно частично управлять, например, запрещая работу Wi-Fi, но без полного понимания устройства системы возможны казусы, такие как сильная нестабильность прерываний по таймеру. Espressif говорит о примерно 80% процентах вычислительной мощности, остающихся для пользовательского кода.
Организация IRAM на ESP32
Пользовательский код выполняется в специальном ОЗУ (IRAM), куда по мере надобности подгружается системой из внешнего SPI Flash. Этот процесс выполняется аппаратно и для программиста прозрачен. Он не накладывает дополнительных ограничений на объём кода, но, конечно, пересылка по SPI занимает некоторое время, и если код достаточно большой, он будет довольно часто перезагружаться, теряя в скорости выполнения. Понимание наличия этой особенности теоретически позволяет писать более оптимальные программы.
Всё перечисленное, а также нахождение портов GPIO на более медленной шине периферии, работающей на частоте 80 МГц независимо от тактовой частоты ядра, снижает способности контроллеров в области заморского bit-banging, или исконно русского «дрыгоножества». Таким образом, Arduino на ATmega и STM32 всё ещё сохраняют некоторые преимущества в приложениях реального времени. Впрочем, для ESP есть RTOS, но это уже другая история и более глубокий уровень погружения в тему.
▍ Трёхвольтовая история
Важная особенность ESP8266 и ESP32, которой стоит уделить внимание — трёхвольтовость. Всё-таки платформа Arduino ориентирована на начинающих и энтузиастов, часто не являющихся специалистами в области электроники и применяющих платформу как своего рода Лего, а для них наличие подобных моментов может стать сюрпризом.
Я не буду приводить здесь руководство по преобразованию уровней — это достаточно большая тема, которой хватит на целую статью. Цель этого раздела только в обозначении самого существования разницы, которую нужно учитывать. Необходимые практические подробности можно найти в Интернете. Например, вот хороший гайд.
Микроэлектроника идёт по пути снижения питающих напряжений, что позволяет делать её всё более энергоэффективной. Со сменой технологий устанавливались новые стандарты на питающее напряжение и логические уровни.
Долгое время в цифровой электронике были стандартом напряжение питания 5 вольт и так называемые TTL уровни (свойственные технологии TTL родом из 1960-х годов): напряжение до 0.8 вольт считается логическим нулём, выше 2 вольт — единицей. С такими уровнями работают стандартные пятивольтовые устройства, в частности, народно любимая К155ЛА3 и прочие логические микросхемы 155 и 555 серий (зарубежные 74 и 74LS). Пятивольтовая система применяется и в экосистеме оригинальных плат Arduino, потому что на момент её появления среди энтузиастов ещё оставалось популярным огромное электронное TTL-совместимое наследие.
Логические уровни для разных технологий
Однако, в микросхемах КМОП-технологии, к которой относится вся современная электроника, включая микроконтроллеры ATmega и ESP, используется иной подход. Допускается значительно более широкий диапазон питающих напряжений, зависящий от конкретной модификации конкретного чипа. Логическим нулём считаются любые напряжения, составляющие до 30% напряжения питания, а логической единицей — от 70%. Иногда эти цифры отличаются. При питании от пяти вольт следующие этой схеме контроллеры ATmega надёжно совместимы с TTL-устройствами.
Допустимый диапазон питания для контроллеров ESP в разных версиях составляет от примерно двух (1.7 или 2.2) до 3.6 вольт, а граница, разделяющая логические уровни, находится примерно на половине питающего напряжения. Хотя платы могут питаться от USB или внешнего пятивольтового источника, сам чип ESP8266 получает питание от установленного на плате стабилизатора на 3.3 вольта. Таким образом его логические уровни считаются трёхвольтовыми, и он может работать с другими трёхвольтовыми устройствами напрямую.
Аналогично классическим Arduino, для коммуникации с ПК через USB-интерфейс, применяющий пятивольтовые логические уровни, используется микросхема USB-UART моста (тоже нужно устанавливать соответствующий драйвер). Она же выполняет и преобразование уровней, поэтому процесс загрузки скетчей совершенно прозрачен для пользователя, и ему не приходится сразу же сталкиваться с проблемами электрической совместимости.
Однако, уровни для GPIO пинов всегда остаются трёхвольтовыми. И это необходимо учитывать при подключении устройств из экосистемы Arduino, в частности, всевозможных модулей, датчиков и шилдов, использующих пятивольтовые уровни. При несовпадении уровней как минимум просто не будет работать передача данных, а в худшем случае — входной уровень превысит напряжение питания устройства и выведет его из строя.
В зависимости от типа соединения (что и к чему подключается), для согласования уровней можно обойтись хаком в виде прямого подключения или пары резисторов. В других же случаях будет оправдано применение специализированных микросхем.
▍ Arduino на ESP8266
Лежащая в основе ESP8266 32-битная архитектура Tensilica Xtensa представляет собой конструктор систем на чипе: заказчик выбирает нужные ему опции и получает чип, оптимизированный под конкретные задачи. Таким образом создан и ESP8266, его конфигурация Xtensa называется L106.
Металлический экран модуля ESP8266MOD
Платки на ESP8266 обычно представляют собой конструкцию в стиле «смерть Кащея». Они имеют разные формы и размеры с пинами под установку гребёнок формата SIP, удобных для применения с беспаечными макетными платами. На платках устанавливается USB-UART мост и модуль-платка с блестящей металлической «коробочкой»-экраном с обозначением ESP8266MOD или ESP-12. Под экраном находятся чипы: собственно сам ESP8266EX и внешняя SPI Flash-память разного объёма, чаще всего 4 мегабайта. Впрочем, в последнее время появились более простые конструкции, где все чипы установлены сразу на основную плату, а металлический экран отсутствует.
Внутренний мир модуля ESP8266MOD
Так как устройство чипа на низком уровне является закрытым, программирование на ассемблере хотя и вполне возможно, но не рекомендуется. Информация об архитектуре важна только для понимания, что все вариации плат на ESP8266 одинаковы по возможностям, у них у всех одинаковая архитектура внутри, чего нельзя сказать про их старших собратьев на ESP32.
Ядро ESP8266 может работать на частоте 80 или 160 МГц, выбираемой в опциях при компиляции кода в Arduino. Периферийные же устройства, включая таймеры и порты GPIO, работают всегда на 80 мегагерцах. На такой же частоте работает и шина SPI для внешней Flash-памяти, что ограничивает скорость выполнения кода.
Официальная блок-схема ESP8266
Из-за того, что исполняемый код подгружается через SPI, производительность оценить гораздо сложнее, чем в традиционных микроконтроллерах. Мне не удалось найти достоверной оценки, но судя по результатам тестов, найденных в Интернете, похоже, что типичный для RISC-микроконтроллеров порядок один MIPS на мегагерц является вполне реалистичной оценкой при условии, что весь код помещается в ОЗУ.
Точное количество ОЗУ внутри чипа тоже неизвестно. Предположительно это 160 килобайт, разбитых на разные функциональные блоки, среди которых 32 КБ — память инструкций, 32 КБ — кэш инструкций (не знаю, в чём разница), 80 КБ — ОЗУ данных и ещё 16 КБ для особых нужд системы. Всё это не имеет особого значения, главное, что нужно знать — при компиляции кода в среде Arduino для пользовательских применений остаётся около 45 килобайт ОЗУ, и ещё немного можно освободить, отключив Wi-Fi.
Код скетча располагается в довольно большой Flash-памяти, обычно 4 мегабайта, но сейчас есть варианты и на 16 мегабайт. В ней же программно организована простенькая файловая система. Из неё возможно не только читать, но и сохранять в неё файлы, что очень удобно. Например, это могут быть настройки, запоминаемые при отключении питания.
Из беспроводных интерфейсов ESP8266 поддерживает только Wi-Fi.
Пакет поддержки ESP8266 в Менеджере плат
Что касается плат на базе ESP8266, в природе их существует около полусотни разновидностей. Поддержка их всех разом устанавливается в Arduino IDE по стандартной схеме: добавляется ссылка для Менеджера плат в Настройки, далее через Менеджер плат устанавливается пакет esp8266.
http://arduino.esp8266.com/stable/package_esp8266com_index.json
Самой популярной платой определённо является D1 Mini от компании Wemos (она же Lolin) — оригинал или её китайские клоны. С ней произошла история, аналогичная Arduino Nano: она стала своего рода лицом ESP8266, и теперь имя чипа часто применяется к этому конкретному виду плат на его основе.
Плата Wemos D1
Это довольно маленькая и удобная платка, для которой Wemos, подражая Arduino, также разработала множество модулей-шилдов соответствующего формата. Впрочем, эта идея, по моим наблюдениям, особого интереса не вызвала, и шилды в проектах встречаются нечасто, а вот основная плата прижилась очень успешно. Продолжаю наблюдения.
Плата Wemos D1 в формате Arduino Uno
Также есть относительно редкая не-Mini версия D1: плата, полностью совпадающая по формату с Arduino Uno, но на ESP8266. Для обеспечения максимальной совместимости с платами-шилдами для Uno пины на ней также сгруппированы очень похожим образом по их функциональному назначению. Однако, нужно помнить про то, что «похоже» не значит «то же самое», и про трёхвольтовость ESP.
Другой популярной вариацией являются платы формата NodeMCU. Вообще-то, это самостоятельная программная платформа, предназначенная для интернетизации вещей посредством скриптов на Lua. Для неё было разработано несколько плат, которые также поддержаны в Arduino IDE и могут использоваться как любые другие платы на ESP8266.
Как я понимаю, платы версий 0.8 и 0.9 разрабатывали участники проекта NodeMCU, а прочие продукты с этими обозначениями уже все, кому не лень, так как проект открытый.
Отличительной особенностью этого семейства плат является одинаковая распиновка и наличие двух кнопок около USB-разъёма.
Плата NodeMCU Amica
Есть популярная вариация NodeMCU платы с названием Amica, что является то ли брендом, то ли самоназванием — разобраться мне не удалось. По формату она похожа на D1 Mini, но в полтора раза длиннее, что позволило разместить на ней больше GPIO пинов, а также она самая тонкая, всего 4.2 миллиметра, вместо 7 мм для D1 MIni.
Плата NodeMCU, второй вариант
Также есть более крупная вариация платы Amica, очень похожая по форме, совместимая по распиновке, но заметно более крупная по всем измерениям. Вместо USB Micro здесь используется USB Type C. В остальном это точно то же самое, разве что микросхема USB-UART моста другая.
Плата NodeMcn v3 с экранчиком
Последний экземпляр в моей коллекции — плата с обозначением new NodeMcn v3 (опечатка не моя). Явно попахивает китайским народным творчеством. Это всё тот же NodeMcu, но теперь ещё крупнее, а на его борту установлен монохромный OLED-дисплей с разрешением 128 на 64 точки. Идея мне показалась полезной: я нередко подключал такие дисплеи к ESP8266 в отладочных и практических целях. Но с приобретением этой платы поводов её применить как-то больше и не возникало.
Три версии NodeMCU, групповой снимок
▍ Arduino на ESP32
По сравнению с ESP8266, линейка контроллеров ESP32 более многообразна. Она включает разные вариации архитектуры Xtensa, LX6 и LX7, с разными ядрами и их количеством, а также прочими опциями, и разобраться в их сортах с ходу не так-то просто.
Экран модуля ESP32-S3
В 2016 году был выпущен оригинальный чип ESP32 с архитектурой LX6, не имевший никаких особых обозначений, но при этом доступный в одноядерном и двухъядерном вариантах. В 2020 году произошла диверсификация, и на смену оригиналу пришло сразу три новых варианта: ESP32-S2 и ESP32-S3 с архитектурой LX7, а также ESP32-C3 с архитектурой RISC-V. S3 является заменой оригинальной двухъядерной версии, S2 более дешёвой упрощённой одноядерной альтернативой, а C3 назначен в преемники ESP8266, и о нём мы поговорим отдельно.
Чип ESP32-S2
У всех этих контроллеров значительно больше ресурсов, чем у ESP8266. В целом они похожи, но ядра быстрее, до 240 МГц. Значительно больше ОЗУ, объём которого различается между версиями и составляет от 320 до 520 килобайт. Впрочем, организация ОЗУ довольно сложная, это не линейный кусок памяти, а набор банков, имеющих некоторые особенности. Стандартный объём Flash-памяти обычно составляет те же 4 мегабайта.
Официальная блок-схема оригинальных ESP32
Периферия тоже значительно богаче. Есть поддержка DMA, ADC, DAC, каналы PWM, каналы тач-сенсора и ИК-датчиков, даже интерфейс для подключения камеры, и много чего ещё. Версии S2 и S3 поддерживают USB-OTG. Помимо Wi-Fi, есть поддержка Bluetooth (кроме S2). Для классической серии это Bluetooth 4.2, для S3 уже Bluetooth 5.0.
В общем, это уже довольно серьёзная система, обладающая достаточной мощностью даже для эмуляции 8-битных компьютеров и, с помощью найденного энтузиастами хака для i2s интерфейса (не путать с i2c), способная полностью программно генерировать цветной композитный видеосигнал в NTSC и PAL. Также на ESP32 запускали специально оптимизированную версию игры Doom, такую же, как на RP2040. Учитывая стоимость, практически рай для самоделкина.
Разумеется, на базе такого большого разнообразия чипов было выпущено ещё больше плат. Буквально сотни их. Среди них есть даже недавно вышедшая на рынок официальная плата от Arduino — ESP32 Nano, но такой в моей коллекции нет.
Пакеты поддержки плат на ESP32
Установка поддержки большинства плат снова происходит по той же схеме: добавляем ссылку на пакет в Менеджер плат, устанавливаем пакет esp32. Для Arduino Nano 32 предусмотрен отдельный, официальный пакет поддержки, Arduino ESP32 Boards, доступный для установки без добавления ссылок.
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json
Если среди плат на ESP8266 лидер очевиден, назвать «главную» плату для классического ESP32, являющуюся олицетворением этого чипа в среде Ардуинщиков, сложно. Пожалуй, главным претендентом на это место будет плата с обозначением ESP32 DEVKIT1.
Плата ESP32 DEVKIT1
По форм-фактору она очень похожа на NodeMCU, а по размеру — на версию Amica, лишь немногим больше. У той версии, которая есть у меня, пинов столько же, а именно 30, но их расположение сильно отличается, совпадает питание и некоторые другие выводы. Также существует версия на 38 пинов, и вроде бы даже у меня она где-то была, но найти её я не смог. Держу в курсе.
Плата LOLIN32
Другой вариант, известный хотя бы своим названием — LOLIN32 от Wemos. Это странный гибрид ежа и ужа: часть платы с модулем ESP32 на ней похожа на NodeMCU, а часть с USB-интерфейсом своя собственная. Отличительной особенностью платы является увеличенное количество пинов и наличие отдельного разъёма питания.
Плата ESP32 MiniKit
Самый популярный вариант ESP32 среди меня — плата ESP32 MiniKit от MH-ET LIVE. Это вариация на тему Wemos D1, также встречающаяся под названием Wemos D1 Mini ESP32. Не уверен, что сам Wemos выпускал такую. Плата по форме похожа на D1 на ESP8266, но заметно крупнее. Пины по краям расположены в два ряда, и соответственно их вдвое больше. Компактная и удобная версия, подходящая, чтобы запихать её в какой-нибудь джойстик.
Плата Wemos D1 R32 в формате Arduino Uno
Достаточно редко встречающийся, но тоже полезный в народном хозяйстве вариант — Wemos D1 R32. Это отладочная плата в формате Arduino Uno. Та же история, что и с подобной платой на ESP8266: расположение пинов худо-бедно совпадает, но это не точно.
Плата Wemos Mini S2
Все предыдущие платы использовали классичесий ESP32. Следующая платка, опять от Wemos, основана на модном молодёжном ESP32-S2, и называется, соответственно, Mini S2. Её размер и форма полностью совпадают с D1 на 8266, но пины снова расположены в два ряда.
Плата ESP32-S3
Другая платка на ESP32-S3, имеет довольно выдающуюся наружность: огромное количество пинов, RGB-светодиод WS2812, и два USB Type C разъёма. Контроллер S3 поддерживает USB-OTG, поэтому один из разъёмов используется для обычного программирования через USB-UART, а второй для реализуемого USB функционала.
Плата ESP32-CAM (всё сам)
Необычность наружности присуща и следующей платке, ESP32-CAM. Небольшой размер, непохожий на другие платы, странная форма экранировки модуля, предусматривающая вырез для микроскопического гнезда подключения внешней Wi-Fi антенны, встроенный слот для карты памяти формата MicroSD, а также разъём для подключения миниатюрной цветной видеокамеры OV2640 с разрешением в два мегапикселя. Готовая база для веб-камеры или робота-
Камера OV2640
Расплатой за столь интересные возможности является отсутствие USB-разъёма для загрузки скетчей. Здесь придётся применять внешний USB-UART, как с Arduino Mini Pro. Кажется, это единственная плата на ESP32 с подобной особенностью.
И наконец, самый интересный экземпляр моей коллекции — плата Heltec Wi-Fi LoRa 32. Она основана на базе классического двухъядерного ESP32, но отличается наличием встроенного OLED-дисплея, а также главной изюминки — чипа SX1262. Этот чип реализует собственно LoRa (Long Range), маломощный беспроводной дальнодействующий интерфейс, предназначенный для медленной и печальной передачи данных с удалённых на километр-другой датчиков и прочих подобных штук в безлицензионном диапазоне радиочастот. Собственно, эта плата может выполнять роль моста между сетями LoRa и традиционными беспроводными интерфейсами.
Плата Heltec Wi-Fi LoRa 32
Для работы с платой производитель предлагает устанавливать его собственный пакет поддержки. Но у меня эта ссылка не работает, а поддержка подобных плат от Heltec предусмотрена также и в общем пакете поддержки ESP32.
▍ Arduino на ESP32 C3
Отдельным пунктом программы хочу рассказать про восходящую звезду в мире ESP — чип ESP32-C3, выпущенный Espressif в 2020 году в качестве современной, более сбалансированной по цене и возможностям альтернативы для ESP8266.
Модуль ESP32-C3-MINI-1
Название вводит в заблуждение и по информативности сравнимо с «морской свинкой»: не морская и не свинка. Это не продолжение оригинальной архитектуры Xtensa, а совершенно новый контроллер на базе ядра RISC-V с новой периферией.
По возможностям это нечто среднее между младшей ESP32-S2 и ESP8266. Одно ядро RISC-V, тактовая частота ядра до 160 МГц, 400 КБ ОЗУ, 4 мегабайта Flash-памяти. Есть Wi-Fi и Bluetooth LE 5.0. По фактической производительности контроллер ближе к ESP8266, на 10-15% быстрее.
Официальная блок-схема ESP32-C3
На основе нового чипа также оперативно понаделали немало плат, и у меня есть парочка из них. Несмотря на иную архитектуру, их поддержка добавляется в Arduino IDE вместе с основным пакетом ESP32, никаких дополнительных действий не требуется.
Первая плата — довольно любопытный вариант, похожий на ранее упомянутую плату на ESP32-S3, с RGB-светодиодом и двумя разъёмами USB Type C, только вдвое короче по длине. Однако, ESP32-C3 не поддерживает USB-OTG, поэтому причина присутствия здесь двух разъёмов не вполне очевидна. На самом деле это просто технический момент, особенности переходного периода.
Плата ESP32-C3 Dual USB
Один из разъёмов подключён через USB-UART, а другой напрямую к чипу, и оба предназначены только для программирования, только разными способами — через UART и через встроенный USB. Скетчи также можно загружать двумя разными способами, для каждого разъёма свой способ. Я использовал первый, а при подключении через второй визуально ничего не происходило, и история с ним прояснилась только после знакомства со следующей платой.
Собственно, вторая, пожалуй, самая многообещающая платка — ESP32-C3 SuperMini. Сделана по лекалам RP2040 SuperMini, а может быть и наоборот, но главное — очень маленькая, меньше любых других плат на контроллерах ESP, по размеру сравнима с платами на ATtiny от Digispark. Но гораздо более мощная.
Самые маленькие платки: ESP32-C3 SuperMini, RP2040 SuperMini, ATtiny от DigiSpark
Это весьма перспективное решение, которое я определённо хочу применять в будущих проектах. Однако, для начала нужно разобраться со способом загрузки скетчей. Здесь реализован только вариант без USB-UART, с прямым подключением к чипу, и воспользоваться им оказалось не так-то просто.
В первый раз я решил, что плата неисправна: при подключении по USB каждую пару секунд начинает циклически подключаться и отключаться USB-устройство. Но это нормальное поведение. Чтобы перевести плату в режим загрузки, нужно поиграться с кнопками на ней. Есть два способа: отключить плату, зажать кнопку BOOT, подключить плату и отпустить кнопку; либо зажать кнопку BOOT, нажать и отпустить RESET, отпустить BOOT. Визуально ничего не изменится, но переподключение устройства прекратится и плата начнёт ожидать загрузку скетча.
Плата ESP32-C3 SuperMini
Для загрузки скетча из Arduino IDE необходимо, чтобы плата была видна как COM-порт. У некоторых пользователей с этим проблем нет, и порт виден сразу. У меня же COM-порт не появлялся, только USB JTAG/serial debug unit.
Решение этой проблемы оказалось надёжно закопано в глубинах интернета, но оно есть. Потребовалась программа с подозрительным названием Zadig. С её помощью устанавливается драйвер USB Serial (CDC) для USB JTAG/serial debug unit (Interface 0) и WinUSB для USB JTAG/serial debug unit (Interface 2). После этого в системе появляется COM-порт и становится доступна загрузка через Arduino IDE.
Для запуска вновь загруженного скетча в моём случае сбрасывать плату приходится вручную, переподключением кабеля или кнопкой RESET. Также есть отзывы, что даже при наличии видимого в системе COM-порта скетч не загружается по причине неизвестной ошибки в esptool. К счастью, я с этим не столкнулся.
Чип ESP32-C3 и антенна
Помимо сложностей с первоначальной установкой, известно, что на доступных сейчас платах есть проблемы со штатной Wi-Fi антенной (красная деталька, похожая на конденсатор): она плохо ловит сигнал. Предлагается перепаять её под углом 90 градусов к плате, либо понизить мощность программно. Я пока Wi-Fi не использовал и этими плясками с бубном не занимался.
▍ Заключение
Ардуинки в моей коробке закончились. Но мы с ними не прощаемся, и, смею надеяться, ещё не раз увидимся в будущих DIY проектах. А ещё у меня есть другие коробки, и в них тоже можно найти, о чём рассказать. Вот, например, дисплеи…
© 2024 ООО «МТ ФИНАНС»
Telegram-канал со скидками, розыгрышами призов и новостями IT ?
Комментарии (43)
okhsunrog
10.12.2024 10:40Самое главное и не сказали. В ESP32-C3, ESP32-C6, ESP32-H2 и ESP32-S3 есть встроенные USB-JTAG отладчики. Я других чипов с такой возможностью не видел. Чрезвычайно удобно вычитывать память, обмениваться данными по RTT, пошагово отлаживать код. Или ардуинщики не пользуются отладчиками?
GrantM
10.12.2024 10:40А кто-нибудь пробовал собрать прошивку OpenOCD for ESP32-S3?
https://github.com/espressif/openocd-on-esp32
У меня лежит ESP32S3 mini и SuperMini nRF52840 Pro Micro с окирпиченным загрузчиком.
Покупать отдельный JTAG-адаптер для прошивки загрузчика жаба душит, а тут вроде можно воспользоваться ESP32S3 в качестве OpenOCD программатора по аналогии с JTAG.
Но как не пытался скомпилировать прошивку под ESP32S3, всё время натыкался на ошибки при сборке проекта.okhsunrog
10.12.2024 10:40У nRF52840 есть интерфейс SWD, достаточно копеечного st-link китайского или DAPLink (по 150 рублей на али продаются). Можно использовать такой проект: https://gitee.com/LI1669063251/ESP32-DAPLink
GrantM
10.12.2024 10:40Изучу, спасибо за ссылку
NutsUnderline
10.12.2024 10:40это смотря как 52840 окирпичен, есть такой вариант когда у него vcc 1,8В а на res - близко к 0В. нужен swd/jtag который умеет 1,8В
Прошивка ESP USB Bridge для esp32s3 прекрасно собирается в родной Espressif-IDE, idf v.5.3.1, там и openocd-on-esp32 собранный и отконфигурированный
NutsUnderline
10.12.2024 10:40в текущей версии ESP32-DAPLink немного попутано с версиями tinyusb н и ей по умолчании флешку надо на 16 мег. но я собрал это под esp32S3 с 4MB встроенными
NutsUnderline
10.12.2024 10:40мне не понравилось что ESP32-DAPLink при старте обязательно надо подключиться к точке доступа wifi. и, удивительно, но для нее подходит вот эта утилита https://github.com/wuxx/ESPLink/ которая работает через hid, в то время как в ESP USB Bridge это отломали.
ruomserg
10.12.2024 10:40В эмбеддед - как в квантовой физике: наблюдение воздействует на результат. Не то чтобы я был против отладчика - например, смотреть дампы в кольцевых буферах. Но в реальности - намного полезнее отладчика - иметь логический анализатор с расшифровкой протоколов. А останавливать прошивку и именно отлаживать ее - имеет смысл в очень редких случаях: прерывания пропускаются, ноги с нужной частотой не дрыгаются, а если к этому еще и силовые ключи подключены и dead-time задается программно - можно и "бдыщ" устроить...
Да и вообще прошивки под эмбеддед пишутся обычно так, что отладчиком там смотреть нечего: в не реал-тайм части прошивки ничего особо не происходит - даже динамического выделения памяти нет; а на реал-тайм часть смотреть нельзя, иначе оно под отладчиком будет работать, а без него - нет. :-)
okhsunrog
10.12.2024 10:40Даже если не пользоваться отладкой, очень удобно логи забирать через RTT. Или и вовсе, двунаправленный обмен вести
LAutour
10.12.2024 10:40А останавливать прошивку и именно отлаживать ее - имеет смысл в очень редких случаях
Когда код ведет себя неадекватно (на esp32 сталкивался) и printf в терминал не помогает - отладчик очень нужен.
Indemsys
10.12.2024 10:40Нет никакого RTT в ESP32, поскольку нет SWO.
JTAG по сравнению с SWO и по сравнению с настоящей трасировкой весьма неэффективный канал отладки.
Поэтому думаю разработчик на ESP будет процентов на 100% тратить больше времени на отладку, чем разработчик на любом ARM Cortex Mokhsunrog
10.12.2024 10:40Как это нет RTT? Я сам им пользуюсь. RTT и SWO вообще разные вещи. Для RTT нужен отладчик (SWD или JTAG), способный читать область в памяти. Микроконтроллер пишет данные в кольцевой буфер, хост их читает отладчиком.
А вот и пруфы:
https://github.com/okhsunrog/esp_hal_snippets/blob/rtt_target/src/main.rs
Этот код выводит данные через RTT с ESP32-C3, через встроенный usb-jtag. Для отправки с esp32-c3 используется крейт rtt-target, для получения логов на хосте использую probe-rs. Вообще, RTT очень популярен в embedded rust экосистеме, именно из-за defmt, probe-rs, rtt-target. И на ARM чипах работает, и на RISC-V, и на XtensaIndemsys
10.12.2024 10:40Понимаю. Походу Segger сам дал этой технологии широкое толкование.
Но вот тут я описал какая связь между SWO и RTT.
А у вас через RTT через JTAG, по честном это и есть тот медленный semihosting.
JTAG - это медленно и неэфективно. Быстро - это когда в чипе есть ARM CoreSight DAP.
okhsunrog
10.12.2024 10:40Насчёт неэффективного канала отладки:
Сравнение скорости RTT и SWO
И больше ссылок с информацией:
https://kb.segger.com/RTT
https://www.segger.com/products/debug-probes/j-link/technology/about-real-time-transfer/
ptr128
10.12.2024 10:40Восходящей звездой я бы назвал всё же ESP32-P4, анонсированный ещё в прошлом году, но до сих пор недоступного для заказа. Полноценной поддержкой SIMD мало какие МК могут похвалиться. Но цена за это тоже значительна - отказ от радиомодуля (WiFi и BT).
okhsunrog
10.12.2024 10:40Только что-то мне говорит, что цена на ESP32-P4 будет очень кусачая и неприятная. Тут уж лучше взять какой-нибудь Rockchip RV1103, будет сильно жирнее чип и дешевле. Их по 4 доллара на LCSC продают, а если брать оптом большую партию – то меньше 3 долларов за чип.
ptr128
10.12.2024 10:40RV1103 для мобильных устройств или батарейного питания хуже пригоден, чем ESP32-P4, который специально оснащен третьим ядром с низким потреблением.
Ну и отдельный вопрос о потенциальном преимуществе RISC-V перед ARM при суперскалярности. Полный отказ от CNZV состояний (флагов) сильно снижает зависимость команд друг от друга. Кто знает, может Espressif сумел в новых ядрах это потенциальное преимущество сделать наконец то реальным?
А о ценах пока остается лишь гадать. До сих пор Espressif выводил на рынок SoC с явно более низкими ценниками, чем у конкурентов. Сохранится ли эта тенденция? Я думаю, скоро узнаем.
LAutour
10.12.2024 10:40RV1103 ориентирован прежде всего на программирование под linux - немного другая весовая категория микроконтроллеров и специализация программистов.
shiru8bit Автор
10.12.2024 10:40Да, это очень интересный вариант, жду его. Но насчёт цены, конечно, большие опасения.
LAutour
10.12.2024 10:40Отладочные платы за ~12к руб. уже есть на Ali. Но по описанию чипы там пока "сырые" и не все работет.
iShrimp
10.12.2024 10:40Есть ещё готовые DIY платформы на базе ESP32 от LILYGO: с дисплеями, LoRa-чипами, в корпусах типа коммуникатора с qwerty-клавиатурой, в виде умных часов.
ruomserg
10.12.2024 10:40Расскажите, как у этих контроллеров дела с энергопотреблением ? Понятно, что Ардуино+энергопотребление это немного смешная тема - но те же голые AVR контроллеры - весьма энергоэффективны, и имеют много разных способов вывести глубоко спящий контроллер обратно в рабочее состояние. Экосистема ESP - это только питание по проводу от 5 вольт, или в батарейном питании оно тоже живет ?
shiru8bit Автор
10.12.2024 10:40Довольно неплохо. Я делал плеер с питанием от одного 18650 напрямую, без повышения до 5 вольт. Потребление на 160 МГц вместе с усилителем для наушников и OLED дисплеем было 85-100 мА (Wi-Fi неактивен). Для голого ESP-12 среднее потребление около 70 мА. ESP32 на 240 МГц с активными беспроводными интерфейсами берёт что-то около 250 мА. Спящие режимы есть, в глубоком спящем режиме у ESP8266 что-то около 10 мкА.
ruomserg
10.12.2024 10:40А как у него с методами просыпаться из глубокого сна ? Есть какой-то таймер типа watchdog который сам тикает (хотя и не очень точно) даже при снятии основных тактовых сигналов ? Аппаратные прерывания по изменению состояния ног - я думаю должны быть. Аппаратные счетчики которые продолжают считать входящие импульсы при отключенном тактировании ? Прерывание от компаратора ? Какие-нибудь особые фишки типа опознавания активности на i2c в режиме слейва когда адрес совпадает с заданным в регистре ?
LAutour
10.12.2024 10:40Есть таймер RTC модуля (хотя настоящих часов RTC в ESP-ках нет - они там полукостыльные) работающий в режиме глубокого сна. Еще есть низкопотребляющее ядро в сериях ESP32, программируемое отдельно от основных ядер, ему доступна часть выводов и перефирии. В режимах сна также некоторые выводы доступны для просыпания по уровню сигнала. По счетчикам в спящем режиме - вроде нет, возможно можно как-то использовать малопотребляющее ядро. Прерывание от АЦП в основном режиме - есть, но возможно придется "вручную" настраивать регистры (готовые функции SDK позволяют не все).
osmanpasha
10.12.2024 10:40Я бы наоборот сказал, что все довольно плохо. Если вы используете вайфай, то это в любом случае секунды на подключение, установление соединения, отправку данных, и все это время потребление за 200 мА. Если использовать блютус, то там тоже потребление на этом же уровне, и для этой цели есть гораздо более экономичные чипы, специально заточенные под BLE и низкое потребление. Если же не использовать беспроводную связь, то непонятно, зачем тогда ESP. К тому же, даже с выключенным радиомодулем ESP все равно потребляет десятки мА, тогда как другие МК будут потреблять единицы.
У Espressif в линейке только один МК, заточенный под малое потребление, ESP32-H2, но он как-то тоже не сильно впечатляет, да и он заметно дороже, чем ESP32-Cx, например..
Тем не менее, по части экосистемы, полно готовых плат с ESP32 и возможностью питания от литиевой батареи, выше про LILYGO писали, например.
ilving
10.12.2024 10:40Оно умеет в несколько разных режимов сна, а на платах обычно выведена не только ножка с +5, но ещё и +3.3, которая идёт прямо в чип.
Другое дело что с активной вафлей аппетиты у есп вроде как до 100мА (по другим данным- 300 и выше), так что кажется что батарейки может и не хватить. Ещё момент - при напряжении ниже какого-то порога запись во флеш может этот самый флеш убить
sav13
10.12.2024 10:40А никто не собирал на ESP32C6 (автор, упущение в ESP ))) что-то работающее с Zigbee?
А то все примеры, которые собираются, у меня вызывают ошибку при исполнении (((XCoder
10.12.2024 10:40Тоже с этим долго возился. Попробуй поставить последнюю ESP IDF 5.3.1. На ней родные примеры с deep sleep zigbee заработали.
AlexanderS
10.12.2024 10:40А ещё у меня есть другие коробки, и в них тоже можно найти, о чём рассказать.
Интересно было бы посмотреть коробку с FPGA.
Dynasaur
10.12.2024 10:40Пожалуй, наивысшим достижением Arduino тех лет стало управление хоббийными ЧПУ станками-гравёрами (посредством прошивки Grbl и Arduino CNC Shield) и 3D-принтерами (прошивка Marlin).
Я бы сказал, что наивысшим достижением Адруино тех лет стал первый открытый полётный контроллер Ardupilot
sappience
10.12.2024 10:40Важная особенность ESP8266 и ESP32, которой стоит уделить внимание — трёхвольтовость.
Для ESP8266 (и, в несколько меньшей мере для ESP32) на практике есть совместимость с пятивольтовой (TTL-уровни) логикой. Вот кусочек даташита из которого видно, что выходные уровни 0 - не более 0.1 напряжения питания и 1 - не менее 0.8 напряжения питания. То есть при питании от 3 до 3.6 вольт выходные напряжения совместимы с TTL-уровнями (0 - <= 0.4в, 1 - >= 2.4в).
Входной уровень нуля (<= 0.25 напряжения питания) совместим с TTL-уровнями при любом допустимом напряжении питания. Вопрос только во входном напряжении логической единицы. Согласно даташиту ESP8266EX не допускает напряжения на входах > 3.6 вольт. Однако CEO компании Espressif в свое время написал:
По поводу ESP32 он писал похожее. А неленивый человек провел серию экспериментов и проверил совместимость. Пишут, что существовала даже версия даташита на ESP8266 в которой была явно указана совместимость с 5-вольтовой логикой, но в последующих версиях ее убрали. Наверное потому, что совместимость обеспечивается, но с оговорками. Не во всем допустимом диапазоне напряжений питания (даже для ESP8266, а для ESP32 который может питаться от 1.8 вольт, и подавно). И, кажется, не при любых состояниях входов. Я находил упоминания, что вход запрограммированный как аналоговый вход может быть не 5в-толерантным (домашнее задание: кому интересно, поищите сами). Возможно, они так же не хотели себя связывать обязательствами поддержания совместимости с 5в уровнями в будущих версиях этих чипов. Но для домашнего, не особо ответственного применения, можно принять это к сведению, забить на даташит и исключить лишнее муторное согласование уровней с пятивольтовой периферией. CEO разрешил.
nikolz
10.12.2024 10:40Решение этой проблемы оказалось надёжно закопано в глубинах интернета, но оно есть. Потребовалась программа с подозрительным названием Zadig. С её помощью устанавливается драйвер USB Serial (CDC) для USB JTAG/serial debug unit (Interface 0) и WinUSB для USB JTAG/serial debug unit (Interface 2). После этого в системе появляется COM-порт и становится доступна загрузка через Arduino IDE.
Также есть отзывы, что даже при наличии видимого в системе COM-порта скетч не загружается по причине неизвестной ошибки в esptool.
Можно решить проблему без Zadig.
Надо лишь как и ESP12 подключить адаптер UART-USB к пинам UART. После этого программировать ESP32 любым загрузчиком также, как и ESP12(ESP8266)
DanielKross
10.12.2024 10:40По теме ничего умного написать не могу, но за название статей, спасибо. Улыбнуло =)
З.ы люблю футураму 8)
tormozedison
10.12.2024 10:40«остаётся около 45 килобайт ОЗУ, и ещё немного можно освободить, отключив Wi-Fi»
Это ещё сколько-то десятков миллиампер освобождает. Встречал проект люксметра или чего-то подобного с выводом на SSD1306, где рекомендовано это сделать. Всего одной строкой в коде.
LAutour
Есть официальная документация на основную перифирию и возможность прямого обращения к ее регистрам. Чем люди успешно пользуются, когда реализованных возможностей функций SDK не достаточно.
Зато больше всего доступных ног ввода-вывода и поддержка встроенного flash или psram.
Некоторые ноги можно перевести на 1.8В
Как прямая альтернатива ESP8266 вроде идет ESP32-C2. Там даже модули такого-же формфактора есть. Хотя сраванивая ESP32-C2 с ESP32-C3 по возможностям в них трудно найти большие отличия.
В ESP32-S2 и ESP32-S3 (настчет простого ESP32 не знаю) - есть возможность прямого доступа ядра к портам GPIO через спец-команды на макисмальной частоте перифириии 80Мгц.Так что дрыгоножить там можно довольно быстро.
Не совсем независимо от частоты ядра, скорее равна 80Мгц, либо частоте ядра, если его частота ниже 80Мгц. Во всяком случае в S3, который сейчас использую этот так.