esp32 что это такое
Описание микроконтроллера ESP32
Микроконтроллер ESP32, вышедший на рынок WiFi осенью 2015 года, представляет собой выдающееся устройство, и не только благодаря своей низкой цене. Espressif ESP32 — высокоинтегрированный, совмещённый (Wi-Fi + Bluetooth) чип, выполненный для решений, требующих минимальных показателей энергопотребления.
ESP32 разработан для носимой электроники и приложений интернета вещей, выполнен в супер-миниатюрном корпусе 6 х 6 мм, требующий для интеграции около 10-ти внешних компонентов. Он обладает хорошим функционалом и многообещающими возможностями. Совмещение в одном чипе WiFi и Bluetooth, двух процессорных ядер и богатого набора периферии может сделать ESP32 лидером в своем сегменте. ESP32 обещает снова совершить революцию в мире IoT, как в свое время совершил его младший брат ESP8266.
ESP32 получил значительный прирост в производительности по сравнению со своим предшественником ESP8266. Вычислительная мощность возросла в четыре раза. У ESP32 есть два ядра, каждый из которых работает на частоте 160 МГц. Второе ядро сделает жизнь разработчика проще. Так, например, одно ядро может взять на себя задачи реального времени по работе с графикой или управлению двигателями, а второе может обрабатывать коммуникационные протоколы и в целом отвечать за связь. Благодаря этому вам меньше придется думать о распределении времени между задачами.
Характеристики ESP32
ESP32 поддерживает весь стек протоколов стандартов Wi-Fi 802.11n и BT4.2, обеспечивая данный функционал через интерфейсы SPI/SDIO или I²C/UART.
Чип Espressif ESP 32 может работать в качестве центрального процессора (поддержка Open CPU) и как подчинённое устройство (slave device), управляемое микроконтроллером.
Отличительные особенности:
CPU: Xtensa Dual-Core 32-bit LX6, 160 MHz или 240 MHz (до 600 DMIPS)
Memory: 520 KByte SRAM, 448 KByte ROM
Flash на модуле: 1, 2, 4… 64 Мб
Wireless:
Peripheral interfaces:
Security:
Распновка чипа ESP32:
(Скачать в PDF)
в ESP32 есть JTAG интерфейс на ножках IO12, IO13, IO14, IO15.
ESP32 также доступен в виде модуля:
Распиновка модуля WROOM32:
Модуль WROOM-32 может поставляться со специальной отладочной платой:
Эта плата позволяет быстро программировать модуль благодаря встроенному адаптеру USB-TTL. На ней также расположены кнопки программирования и сброса, а также регулятор напряжения для питания микроконтроллера ESP32 напряжением 3.3 В. Также плата дает удобный доступ к выводам модуля, шаг между которыми довольно узок, чтобы без проблем работать с ними. Шаг же между выводами платы составляет 2.54 мм, что является стандартом для DIP-корпусов, с которыми удобно работать обычному радиолюбителю без специальных инструментов.
Распиновка отладочной платы ESP32:
Средства разработки ESP32
Программные средства разработки (программный комплект разработчика, SDK) состоят из:
Espressif свободно распространяет свой комплект разработчика. В этот комплект входит компилятор GCC, библиотеки Espressif и загрузочная утилита XTCOM. Библиотеки поставляются в виде скомпилированных библиотек, без исходных текстов. Espressif поддерживает две версии SDK: одна на основе RTOS, другая на основе обратных вызовов (callback).[2]
Помимо официальной SDK существует ряд проектов альтернативных SDK. Эти SDK используют библиотеки Espressif или предлагают собственный эквивалент библиотек Espressif, полученный методами реверсинжиниринга.
На оффсайте сейчас можно найти ссылки на два SDK:
» ESP31_RTOS_SDK — SDK для ESP31B, построена на FreeRTOS.
» Espressif IDF (IoT Development Framework) — Official development framework for ESP32.
Хоть это и не очевидно с описания на сайте, но для релизной версии нам подходит только ESP-IDF. Есть инструкции по установке для linux, windows, macos.
В итоге можно сказать, что микроконтроллер ESP32 получился отличным для своего сегмента рынка. В таком дешевом устройстве столько функционала не умещал, наверное, еще никто. Но на данный момент ESP32 пока еще слишком молод и не оброс тем уровнем поддержки, который характерен сегодня для ESP8266. Документации, примеров и поддерживаемых сред не так уж и много.
В чем разница между ESP32 и ESP8266?
В чем разница между ESP32 и ESP8266? Что следует использовать в своих проектах: ESP32 или ESP8266? В этой статье мы сравним ESP32 с ESP8266 и рассмотрим плюсы и минусы каждой платы.
ESP32 и ESP8266 — это недорогие Wi-Fi модули, идеально подходящие для любительских проектов в области интернета вещей (IoT) и домашней автоматизации.
Оба чипа имеют 32-битный процессор. ESP32 — это двухъядерный процессор с частотой 160…240 МГц, в то время как ESP8266 — это одноядерный процессор, работающий на частоте 80 МГц.
Эти модули поставляются с выводами GPIO (интерфейс ввода/вывода), которые поддерживают широкий спектр протоколов, таких как SPI, I2C, UART, ADC, DAC, PWM.
Самое приятное то, что эти платы поставляются с интегрированной беспроводной сетью, что отличает их от других микроконтроллеров, таких как Arduino. Это означает, что вы можете легко управлять и контролировать устройства удаленно через Wi-Fi или Bluetooth (в случае ESP32) по очень низкой цене.
Кроме того, если вам не нужно использовать его беспроводные возможности, вы можете использовать ESP32/ESP8266 для управления входами и выходами, как это было бы с Arduino. Однако вы должны принять во внимание, что в то время как Arduino работает с логикой 5 В, ESP32 и ESP8266 работают только с 3,3 В.
Технические характеристики: ESP32 против ESP8266
ESP32 является преемником ESP8266. Он имеет дополнительное ядро процессора, более быстрый Wi-Fi, больше GPIO и поддерживает Bluetooth 4.2 и Bluetooth с низким энергопотреблением. Кроме того, ESP32 поставляется с сенсорными контактами, которые можно использовать для пробуждения ESP32 из глубокого сна, встроенным датчиком эффекта Холла и встроенным датчиком температуры (последние версии ESP32 больше не поставляются со встроенным датчиком температуры).
Обе платы очень дешевы, но ESP32 стоит немного дороже. В то время как ESP32 может стоить от 6 до 12 долларов, ESP8266 может стоить от 4 до 6 долларов (но это зависит от того, где вы их приобретаете).
В следующей таблице показаны основные различия между чипами ESP8266 и ESP32:
Использовать просто чипы ESP32 или ESP8266 сложно и непрактично, особенно при тестировании и создании прототипов. В большинстве случаев вы захотите использовать платы разработки ESP32 и ESP8266. Эти платы поставляются со всеми необходимыми схемами для питания чипа, подключения его к компьютеру, схемой для легкой загрузки кода, контактами для подключения периферийных устройств, встроенными светодиодами питания и управления и другими полезными функциями.
Платы для разработки ESP32 и ESP8266, которые мы используем чаще, — это плата разработки ESP32 DEVKIT DOIT и комплект ESP8266 ESP-12E NodeMCU Kit. Однако есть много других моделей плат для разработки, из которых вы можете выбирать.
Большее количество GPIO на ESP32
ESP32 имеет большее количество GPIO чем ESP8266. Вы можете сами решать, какими выводами будут UART, I2C, SPI – для этого вам просто нужно прописать их в коде. Это возможно благодаря функции мультиплексирования микросхемы ESP32, которая позволяет назначать несколько функций одному и тому же выводу. Если вы не установите их в коде, они будут на выводах, определенных по умолчанию, как показано на следующем рисунке (это пример для платы ESP32 DEVKIT V1 DOIT — расположение выводов может меняться в зависимости от производителя).
Для сравнения приведем распиновку для комплекта ESP8266 ESP-12E NodeMCU Kit.
ШИМ, АЦП и многое другое
Вы можете установить сигналы PWM в любом GPIO с настраиваемыми частотами и рабочим циклом, установленными в коде.
Что касается аналоговых выводов, то они статичны. ESP32 поддерживает измерения на 18 каналах (выводы с аналоговой поддержкой) по сравнению с одним 10-битным выводом АЦП на ESP8266. ESP32 также поддерживает два 8-битных канала ЦАП.
Кроме того, ESP32 содержит 10 емкостных датчиков GPIO, которые обнаруживают прикосновение и могут использоваться, например, для запуска событий или вывода ESP32 из глубокого сна.
Arduino IDE — ESP32 против ESP8266
Есть много способов запрограммировать платы ESP32 и ESP8266. В настоящее время обе платы можно программировать с помощью среды программирования Arduino IDE.
Это хорошая вещь, особенно для тех, кто привык программировать Arduino. Хотя вы можете запрограммировать обе платы с помощью Arduino IDE, они могут быть несовместимы с одними и теми же библиотеками и функциями.
Некоторые библиотеки только совместимы с одной из плат. Это означает, что в большинстве случаев ваш код для ESP8266 не будет совместим с ESP32. Однако для адаптации вам будет достаточно внести несколько изменений.
MicroPython Firwmare — ESP32 против ESP8266
Еще один популярный способ программирования плат ESP32 и ESP8266 — использование программы MicroPython.
MicroPython — это повторная реализация Python 3, предназначенная для микроконтроллеров и встроенных систем. MicroPython очень похож на обычный Python. Итак, если вы уже знаете, как программировать на Python, вы также сможете программировать и на MicroPython.
В MicroPython большинство скриптов Python совместимы с обеими платами (в отличие от использования Arduino IDE). Это означает, что в большинстве случаев вы можете использовать один и тот же сценарий для ESP32 и ESP8266.
Что выбрать: ESP32 или ESP8266?
Итак, на этом этапе вы можете спросить: что мне купить: ESP8266 или ESP32?
Это действительно зависит от того, чем вы хотите заниматься. Есть место для обеих плат, и у обеих есть свои плюсы и минусы.
ESP8266 дешевле, чем ESP32. Хотя у ESP8266 не так много функций, он отлично будет работать в большинстве простых проектов IoT. Однако у него есть некоторые ограничения. Когда дело доходит до использования GPIO у него просто может не хватить контактов для более сложных проектов. Если это так, вы должны использовать ESP32.
ESP32 намного мощнее ESP8266, поставляется с большим количеством GPIO, с большим количеством функций, более быстрым Wi-Fi, а также поддерживает Bluetooth.
Многие думают, что с ESP32 труднее иметь дело, чем с ESP8266, потому что он более сложный. На наш взгляд, ESP32 так же просто запрограммировать, как и ESP8266, особенно если вы собираетесь программировать его с использованием «языка Arduino» или MicroPython. У ESP32 тоже есть минусы. ESP32 дороже, чем ESP8266.
Итак, если вы создаете простой проект IoT, ESP8266 может помочь вам из-за более низкой цене. Кроме того, поскольку ESP8266 «старше», чем ESP32, некоторые библиотеки и функции лучше разработаны для ESP8266, и вы найдете больше ресурсов (форумы, люди с такими же проблемами и способы их решения и т. д.). Однако со временем ESP32 получит более широкое распространение, и эти различия в плане разработки и библиотек не будут заметны.
Для проектов IoT все же лучше перейти на модуль ESP32. Он более универсален и имеет гораздо больше функций, таких как Bluetooth, различные источники пробуждения, множество периферийных устройств и многое другое. К тому же разница в цене, на наш взгляд, не имеет большого значения. Мы думаем, что как только вы перейдете на ESP32, вы больше не захотите возвращаться к ESP8266.
Знакомимся с ESP32, часть 1: установка в Arduino IDE
Всем привет! С этого поста я начинаю серию «Знакомимся с ESP32». В этой части я опишу сам микроконтроллер, а так же процесс установки в Arduino IDE. Поехали!
-Двухъядерный 32-х битный процессор, работающий на частоте 80, 160 или 240 МГц (ну плюс ещё одно энергосберегающее ядро с урезанным набором команд и на частоте 32 КГц)
-448 КБ flash-памяти (на самом деле доступно больше, рассмотрим далее)
-Дополнительно внешняя flash-память на 4-16 МБ (о чём я говорил ранее)
-Wi-Fi 802.11n с максимальной скоростью 150 Мбит в секунду
-BT 4.2 BR/EDR и Low Energy
-Встроенный датчик температуры
-Инфракрасный контроллер, причём, как на приём, так и на передачу
-PWM на всех портах вроде
-Встроенный датчик Холла
-Куча периферии для криптографии (шифровальщики, хешеры, ГСЧ)
А так же энергопотребление:
-При передаче Wi-Fi 160-260 мА
-Без Wi-Fi и BT 20 мА
-Режим «мягкого» сна 0.8 мА
-Режим «глубокого» сна 10 мкА
-Гибернизация со включенным ядром низкого энергопотребления 5 мкА
АХТУНГ! Вы часто будете встречать слово RTC при использовании ESP32. Однако, это не Real Time Clock, а ядро низкого энергопотребления.
Я заказал отладочную плату на Али, которая обошлась мне в 335 рублей, это без доставки.
1. Скачиваем Arduino IDE
2. Устанавливаем Git с сайта
3. Запускаем Git GUI
3.1. Выбираем Clone Existing Repository
3.2. В Source Location пишем
3.3. В Target Directory пишем
4. Открываем директорию
и запускаем файл get.exe
5. Подключаем нашу плату
5.1. Если драйвера сами не установились, то устанавливаем драйвера для CP210x (у меня был CP2102) отсюда
6. Запускаем Arduino IDE
7. Выбираем плату в Tools > Board (Инструменты > Плата) (У меня DOIT ESP32 DEVKIT V1)
8. Выбираем COM-порт, в который установилась плата
8.1. Как определить порт?
8.1.1. Открываем диспетчер устройств
8.1.2. Раскрываем группу «Порты (COM и LPT)»
8.1.3. Смотрим название устройств. Среди них должно быть что-то подобное
9. Выбираем любой пример (например, вот)
10. Загружаем, нажав Ctrl+U
10.1. В некоторых инструкциях говорят, что во время загрузки нужно нажать кнопку BOOT на плате. Однако, у меня всё завелось и без неё.
Поздравляю, теперь вы загрузили свою первую программу на ESP32! Ждите следующих частей, в которых я расскажу некоторые тонкости и трудности, с которыми я столкнулся.
Arduino & Pi
1.1K пост 18.1K подписчиков
Правила сообщества
В нашем сообществе запрещается:
• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)
• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском
• Рассуждать на темы политики
> «-Двухъядерный 32-х битный процессор, работающий на частоте 80, 160 или 240 МГц (ну плюс ещё одно энергосберегающее ядро с урезанным набором команд и на частоте 32 КГц)»
Это разные версии платы или программно регулируется?
подписался. Плату купил, хочу поковыряться с ней.
Пытался и boot зажимать при прошивке и при старте. Уже совсем голову сломал.. может плата бракованная?
Привет! В сети есть инструкции, как прошить Pro mini через Nano. Удобно, когда нет программатора. Пользовался несколько раз.
Сейчас в наличии esp32 и надо прошить pro mini. Опыта с 32 почти нет. Подскажите, можно ли и как прошить про мини через исп32?
Набрасывался на этот вопрос пару раз, но так и не понял, есть ли в ЕПС32 RTC, тот что Real Time Clock с батарейным бэкапом.
а как двухядерный процессор работает там? в ардуино вроде нет многопоточности
Лежит такая, поставил туда espruino, там и npm-модули и программировать не на огрызке от C, а на JavaScript полноценном, удобно.
А зачем она нужна? для майнинга что-ли?
HTTP-сервер ESP8266. Основы HTML разметки, Javascript, CSS
Сегодня поговорим о том, как сделать HTTP-сервер ESP8266. Рассмотрим основы HTML разметки и Javascript, CSS.
Исходные материалы данного урока тут.
На основе полученных данных можно сделать более интересные вещи.
— Веб-сервер ESP32 (ESP8266) в среде Arduino IDE
Исходные материалы данного урока тут.
— Подключаем DHT11, DHT22 к ESP32, ESP8266. Выводим показание на веб-странице.
Исходные материалы данного урока тут.
— ESP32 и ESP8266 выводим статус на веб страницу и на OLED дисплей
Исходные материалы данного урока тут.
Надеюсь моя информация будет полезной.
Спасибо! Всем добра!
Esp8266 нужен совет
Прошу совета у ардуинщиков и еспешников.
Второй год занимаюсь с соседскими детьми Ардуинками частным образом. Дети от 6 до 9 класса. Ребята уже соображают лучше меня.
В основном собирают метеоприборы, но есть и другое. Работаем с уно, нано, мега. В прошлом году закупил esp32 и esp8266. Несколько esp32 использовали для светодиодных матриц 2812b. Другие для сбора данных с датчиков bme280, 1750, uv и других. Через телефон или на дисплей. Короче все работало по sda и scl.
Этим летом разобрали большинство собранных устройств, начали собирать другие. И вот тут столкнулись с проблемой.
Релюшки управляемые нулем и единицей отказываются переключаться от esp8266 и d1 mini. От есп32, меги, уно, нано работают.
Даже самый примитивный код типа:
void setup() <
pinMode(13, OUTPUT);
>
void loop() <
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
>
не работает. На еsp8266 нумерация gpio не совпадает с d или пином. Проверяли разные номера. Подключали к разным пинам. Например, ставили пин 4, цепляли рабочий светодиод ко всем выводам, кроме питания и земли поочередно. Ставили принтлайн, в мониторе порта показывается переключение.
Несколько детей и я ищем решение по тематическим форумам. Везде указывают на несоответствие gpio нумерации и нумерации пинов. Например gpio2 это пин 4.
Контроллеры и датчики через i2c работают отлично. А вот на пинах пусто.
Проблема еще в том, что сейчас нано, уно подорожали сильно. Закупил для ребят с Али больше 10 esp8266 версии 340 (у меня 2101).
Ребята получат контроллеры, которыми не смогут выдавать сигналы на пины.
Куда копать, как заставить esp8266 менять состояние пинов? Вернеее не так. Как определить какой именно номер d будет переключаться по команде на пин 2?
Плату в АрдуиноИДЕ версии 1.8.5 я выбираю правильно. Порт и скорост так же.
Программирование устройств на основе модуля ESP32
Микроконтроллер — это интегральная схема, способная выполнять программы. Сегодня на рынке представлено множество таких моделей от самых разных производителей. Цены на эти устройства продолжают падать. Однокристальные чипы находят широкое применение в самых разнообразных сферах: от измерительных приборов до изделий развлечений и всевозможной домашней техники. В отличие от персональных компьютеров микроконтроллер сочетает в одном кристалле функции процессора и периферийных устройств, содержит оперативную память и постоянное запоминающее устройство в для хранения кода и данных, однако обладает значительно мешьшими вычислительными ресурсами. ESP32 — это микроконтроллер, разработанный компанией Espressif Systems. ESP32 представляют собой систему на кристалле с интегрированным Wi-Fi и Bluetooth контроллерами. В серии ESP32 используется ядро Tensilica Xtensa LX6. Платы с ESP32 обладают хорошей вычислительной способностью, развитой периферией при этом весьма популярны ввиду низкой цены в диапазоне 7$ – 14$: Aliexpress, Amazon.
Данная статья не претендует на роль исчерпывающего руководства, скорее представляет собой сборник источников материала и рекомендаций. В статье я хочу затронуть вопросы, с которыми мне пришлось столкнуться при выборе программных средств для разработки проекта, а также некоторые кейсы практического применения модулей ESP32. В следующей статье я хочу показать наглядный пример использования ESP32 в качестве котроллера управления для небольшой двухколесной мобильной платформы. Поэтому здесь рассмотрим такие детали как:
Обзор модуля ESP32-WROOM-32E
Согласно datasheet модуль содержит:
В основе модуля лежит микросхема ESP32-D0WD-V3 *. Встроенный чип разработан с учетом возможности масштабирования и адаптации. Центральный процессор содержит два ядра, которыми можно управлять индивидуально, а тактовая частота ЦП регулируется от 80 МГц до 240 МГц. Чип также имеет сопроцессор с низким энергопотреблением, который можно использовать вместо ЦП для экономии энергии при выполнении задач, не требующих больших вычислительных мощностей, таких как мониторинг состояния пинов. ESP32 объединяет богатый набор периферийных устройств, начиная от емкостных сенсорных датчиков, датчиков Холла, интерфейса SD-карты, Ethernet, высокоскоростного SPI, UART, I²S и I²C.
Техническая документация представлена на официальном ресурсе.
Информацию про распиновку модуля ESP-WROOM-32 можно легко найти на просторах сети, как здесь
Выбор среды разработки
Arduino IDE
Программируя ESP32 в среде Arduino необходимо учитывать распиновку, как указано на странице arduino-esp32.
Распиновка модуля ESP32
Основное преимущество данного подхода разработки заключается в быстром вхождении и легкости создания проектов, используя те же принципы, как и для Arduino. А также использование многих библиотек, как и для Arduino. Еще одной хорошей особенностью является возможность совмещать библиотеки и принципы разработки Arduino с оригинальным ESP-IDF фреймворком.
PlatformIO
Как сказано на официальном ресурсе : «Cross-platform PlatformIO IDE and Unified Debugger · Static Code Analyzer and Remote Unit Testing. Multi-platform and Multi-architecture Build System · Firmware File Explorer and Memory Inspection» Другими словами PlatformIO – это экосистема для разработки встроенных устройст, поддерживающая множество платформ, включая Arduino и ESP32. В качестве IDE используется Visual Studio Code или Atom. Установка и настройка достаточно простая – после установки редактора кода выбираем PlatformIO из списка плагинов и устанавливаем. Опять же в сети много материалов на данную тему, начиная от официального источника здесь и здесь, и продолжая статьями с подробными иллюстрациями здесь и здесь.
PlatformIO по сравнению с Arduino IDE обладает всеми качествами современной среды разработки: организация проектов, поддержка плагинов, автодополнение кода и много другое.
Особенностью разработки на PlatformIO является унифицированная структура проекта для всех платформ
Каждый проект PlatformIO содержит файл конфигурации с именем platformio.ini в корневом каталоге проекта. platformio.ini имеет разделы (каждый из которых обозначен [заголовком]) и пары ключ / значение внутри разделов. Строки, начинающиеся с символа точка с зяпятой «;» игнорируются и могут использоваться для комментариев. Параметры с несколькими значениями можно указать двумя способами:
В составе PlatformIO входит удобный инструментарий билда, загрузки и отладки проектов
Espressif IoT Development framework
Для ESP32 компания Espressif разработала фреймворк под названием IoT Development Framework, известный как «ESP-IDF». Его можно найти на Github. Проект содержит очень хорошую документацию и снабжен примерами, которые можно брать за базу. Установка и настройка среды окружения хорошо описана в разделе Get Started. Имеется несколько вариантов установки и работы с фреймворком.
Клонирование проекта из репозитория и ручная установка утилит.
Клонирование проекта из Github
Для Windows установка утилит разработки возможна с помощью инсталлятора или с помощью скриптов для командной строки:
Следующим шагом является настройка переменных окружений среды. Если установка инструментов разработки была выполнена на Windows с помощью инсталлятора, то ярлык на командную консоль добавляется в меню и на рабочий стол, после чего можно открывать командную оболочку и работать с проектами. Альтернативный спрособ запуска командной оболочки для Windows:
или Windows PowerShell:
Следует обратить внимание на пробел между точкой и путем к скрипту
Вызывая команду get_idf в консоль экспортируются необходимы переменные окружения. В моем случае также необходимо было прописать алиас на запуск виртуального окружения python
и добавить его в следующий алиас
Для создание нового проекта с нуля можно склонировать исходники с github.com или скопировать из каталога с примерами esp-idf/examples/get-started/hello_world/.
Информация о структуре проекта, утилитах компиляции, загрузки, настройки и др. находится здесь.
Проект представляет собой каталог со следующей структурой:
Конфигурация проекта содержится в файле sdkconfig в корневом каталоге. Для изменения настроек необходимо вызвать команду idf.py menuconfig (или возможно idf.py.exe menuconfig в Windows).
Утилита командной строки idf.py предоставляет интерфейс для простого управления сборками проекта. Ее расположение в Windows — %userprofile%\.espressif\tools\idf-exe\1.0.1\idf.py.exe. Она управляет следующими инструментами:
Проект ESP-IDF можно рассматривать как совокупность компонентов, в котором каталог main является главным комонентом, запускающим код. Поэтому в данной директории также содержится файл CMakeLists.txt. Чаще всего его структура подобна:
Где указывается, что исходный файл main.c необходимо зарегистрировать для компонента, а файлы заголовков содержаться в текущем каталоге. При необходимости можно переименовать каталог main установив EXTRA_COMPONENT_DIRS в прокте CMakeLists.txt. Подробно можно ознакомиться здесь.
Помимо этого в каталоге находится исходный main.с (имя может быть любое) файл с точкой входа – функцией void app_main(void).
Кастомые компоненты создатся в каталоге components. Подробнее процесс описан в разделе Component Requirements.
В большинстве случаев подходят настройки по умолчанию. Но для вызова консольного интерфейса меню необходимо перейти в каталог проекта и в командной строке набрать:
Меню с конфигурационными настройками
После вызова этой команды файл sdkconfig будет создан, если его ранее не было или заново сконфигурирован. В более ранних туториалах можно встретить команды make menuconfig, что являются уставревшими.
Добавление кастомных настроек в файл sdkconfig возможно вручную, например:
Но предпочтительным является способ с помощью дополнительного конфигурационного файла Kconfig.projbuild, который необходимо располагать в каталоге с компонентом. Содержимое файла может быть следующим:
После вызова команды idf.py menuconfig в файле sdkconfig автоматически добавиться дополнительный раздел. Вызов команды idf.py menuconfig возможен и в проекте PlatformIO, однако нужно учитывать факт отличия структура проекта PlatformIO от классического ESP-IDF, из-за чего файл sdkconfig с может заново сгенериться и потярять кастомные настройки. Тут возможны вышеупомянутые варианты – правка файла руками, временное переименование каталога src в main или настройка файла CMakeLists.txt
Компиляция и загрузка проекта.
Для билда проекта необходимо набрать команду
Эта команда скомпилирует приложение и все компоненты ESP-IDF, а затем сгенерирует загрузчик, таблицу разделов и двоичные файлы приложения.
Следует учитывать, что первоначальный процесс компиляции даже простого проекта занимает время, так, в отличие от Arduino фреймворка компилируются многие дополнительные модули ESP-IDF. Дальнейшее изменение исходников приводит только к компиляции этих же файлов. Исключение составляет изменение конфигурации.
Для загрузки скомпилированных двоичных файлов (bootloader.bin, partition-table.bin и hello-world.bin) на плату ESP32 необходимо запустить команду:
где PORT мы заменяем на тот, что нам нужно (COM1, /dev/ttyUSB1), а также опционально можем изменить скорость загрузки, указав необходимое значения для BAUD
Для отслеживания загруженной программы можно использовать любую утилиту мониторинга com-порта, такие как HTerm, CoolTerm, или использовать утилиту мониторинга IDF Monitor, для ее запуска необходимо ввести команду:
ESP-IDF Eclipse Plugin
Документация по установке и настройке плагина находится здесь
Предустановки для использования:
Кроме этого наблюдаются и другие глюки, когда проект просто не билдится по непонятным причинам. Помогает только закрытие проекта и перезагрузка Eclipse.
ESP-IDF Visual Studio Code Extension
И последний, на мой взгляд самый интересный вариант – это официальный плагин для Visual Studio Code.
Как и PlatformIO – легко устанавливается из раздела расширений. Установка и настройка ESP-IDF фреймворка в этом расширении представлена в качестве меню onboarding, о чем также говорится в описании. Загрузка и установка всех компонентов происходит автоматически в процессе прохождения этапов меню. Можно привести все скрины процесса, но они интуитивно понятны, и практически не требуют пояснения. В пользу PlatformIO можно отметить более удобный инструментарий билда, загрузки и мониторинга проекта. В отличие от этого ESP-IDF плагин управляется с помощью меню команд, что можно вызвать с помощью клавиши F1, или сочетании клавишь, описанных в мануале.
Первоначальная настройка плагина
Меню команд
FreeRTOS
FreeRTOS была портирована на широкий спектр аппаратных платформ, включая процессоры Xtensa, используемые в ESP32. Подробнее можно ознакомиться в документации.
GPIOs
GPIO или универсальный ввод/вывод – это возможность дискретного управления пина сигналом «1» или «0».
Как видно из самого названия такие пины имеют два рабочих режима – ввод или вывод. В первом случая мы читаем значение, во втором – записываем. Еще одним важным фактором при работе с GPIO является уровень напряжения. ESP32 — это устройство с напряжением 3,3 В. Поэтому следует быть осторожным при работе с другими устройствами, которые имеют напряжение 5В и выше. Также важно понимать, что максимальный ток, которым можно нагружать вывод GPIO, составляет 12 мА. Для использования функций GPIO, предоставляемых ESP-IDF нам необходимо подключить заголовок driver/gpio.h. Затем можно вызвать gpio_pad_select_gpio(), чтобы указать функцию данного вывода. На ESP32 доступно 34 различных GPIO. Они обозначены как:
Следует обратить внимание, что пины GPIO_NUM_34 — GPIO_NUM_39 — используют только режим ввода. Их нельзя использовать для вывода сигнала. Кроме того, контакты 6, 7, 8, 9, 10 и 11 используются для взаимодействия с внешней флеш-картой по SPI, не рекомендуется их использовать для других целей, но если очень хочется, то можно. Тип данных gpio_num_t — это перечисление со значениями, соответствующими номерам пинов. Рекомендуется использовать эти значения, а не числа. Направление пина устанавливается с помощью функции gpio_set_direction (). Например, для установки пина как выход:
Для установки пина в качестве входа:
Если мы настроили GPIO как выход, то можем установить его значение равным 1 или 0, вызывая gpio_set_level ().
Следующий пример переключает GPIO раз в секунду:
В качестве альтернативы настройке всех атрибутов отдельных пинов мы можем установить свойства одного или нескольких контактов с помощью вызова функции gpio_config (). Она принимает в качестве входных данных структуру gpio_config_t и устанавливает направление, pull up, pull down и настройки прерывания для всех выводов, представленных в битовой маске.
Например:
Pull up и pull down настройки
Обычно читается, что входной пин GPIO имеет сигнал высокого или низкого уровня. Это означает, что он подключен к источнику питания или к земле. Однако, если пин не подключен ник чему, то он находится в «плавающем» (floating) состоянии. Часто необходимо установить начальный уровень неподключенного пина как высокий или низкий. В таком случае производится аппаратная (подключение c помощью резисторов) или программная поддяжка вывода соответственно к +V – pull up или к 0 – pull down. В ESP32 SDK мы можем определить GPIO как pull up или pull down с помощью функции gpio_set_pull_mode (). Эта функция принимает в качестве входных данных номер контакта, который мы хотим установить, и режим подтяжки, связанный с этим контактом.
Например:
GPIO обработка прерывания
Чтобы обнаружить изменение входного сигнала на пине мы можем периодически опрашивать его состояние, однако это не лучшее решение по ряду причин. Во-первых, мы должны циклически делать проверку, тратя процессорное время. Во-вторых, в момент опроса состояние пина может быть уже не актуальное за счет задержки и можно пропустить входные сигналы. Решением этих проблем является прерывание. Прерывание похоже на дверной звонок. Без звонка нам придется периодически проверять, есть ли кто-нибудь у двери. В исходном коде мы можем определить функцию обратного вызова прерывания, которая будет вызываться, когда вывод изменяет значение своего сигнала. Мы также можем определить, что является причиной вызова обработчика, установив следующие параметры:
Обработчик прерывания может быть отмечен для загрузки в ОЗУ во время компиляции. По умолчанию сгенерированный код находится во флэш-памяти. Если предварительно пометить его как IRAM_ATTR, он будет готов к немедленному выполнению из оперативной памяти.
Кто работал с микроконтроллерами, знает, что опработка входных сигналов от кнопок сопровождается дребезгом контактов. Что может интерпретироваться, как серия переходов, и следовательно, серия событий обработчика прерывания. Для этого мы должны внести в код обработку дребезга контактов. Для этого нам надо считать исходное событие, дождаться пока вибрации не утихнут, а затем выполнить повторную выборку входного состояния.
Следующий пример демонстрирует обработку прерывания входных сигналов. Настоятельно рекомендую ознакомится с управлением очередями во FreeRTOS для дальнейшего понимания кода, если вы еще с этим не знакомы. В примере показаны две задачи:
Антидребезг производится с помощью функции timeval_durationBeforeNow, которая проверяет, длится ли нажатие более 100 мсек. Есть и другие программные шаблоны против дребезга, но смысл примерно тот же. В составе ESP-IDF также имеется пример работы GPIO.
PCNT (Pulse Counter)
Модуль PCNT (счетчик импульсов) предназначен для подсчета количества нарастающих и / или спадающих фронтов входного сигнала. Каждый блок модуля имеет 16-битный регистр со знаком и два канала, которые можно настроить для увеличения или уменьшения значения счетчика. Каждый канал имеет входной сигнал, который фиксирует изменение сигнала, а также вход управления, который можно использовать для включения или отключения счета. Входы имеют дополнительные фильтры, которые можно использовать для устранения нежелательных выбросов сигнала.
Счетчик PCNT имеет восемь независимых счетных единиц (units), пронумерованных от 0 до 7. В API они указаны с помощью pcnt_unit_t. Каждый модуль имеет два независимых канала, пронумерованных 0 и 1 и указанны с помощью pcnt_channel_t.
Конфигурация предоставляется отдельно для каждого канала устройства с помощью pcnt_config_t и охватывает:
После выполнения настройки с помощью pcnt_unit_config () счетчик сразу же начинает работать. Накопленное значение счетчика можно проверить, вызвав pcnt_get_counter_value ().
Следующие функции позволяют управлять работой счетчика: pcnt_counter_pause (), pcnt_counter_resume () и pcnt_counter_clear ()
Также возможно динамически изменять ранее установленные режимы счетчика с помощью pcnt_unit_config (), вызывая pcnt_set_mode ().
При желании контакт импульсного входа и контакт входа управления можно изменить «на лету» с помощью pcnt_set_pin ().
Модуль PCNT имеет фильтры на каждом из импульсных и управляющих входов, добавляя возможность игнорировать короткие выбросы в сигналах. Длина игнорируемых импульсов предоставляется в тактовых циклах APB_CLK с помощью вызова pcnt_set_filter_value (). Текущие настройки фильтра можно проверить с помощью pcnt_get_filter_value (). Цикл APB_CLK работает на частоте 80 МГц.
Фильтр запускается / приостанавливается вызовом pcnt_filter_enable () / pcnt_filter_disable ().
Следующие события, определенные в pcnt_evt_type_t, могут вызвать прерывание. Событие происходит, когда счетчик импульсов достигает определенных значений:
Чтобы проверить, какие пороговые значения установлены на данный момент, нужно использовать функцию pcnt_get_event_value().
Пример из ESP-IDF представлен здесь.
Я использовал счетчик PCNT для вычисления скорости вращения колеса. Для этого необходимо считать количество импульсов на оборот, после чего обнулять счетчик.
Широтно-импульсная модуляция (ШИМ) с использованием модуля MCPWM
Информация о модуле представлена здесь
В сети имеется много статей на тему ШИМ, особенно если искать применительно к Arduino.
Википедия дает короткое и емкое определение — Широтно-импульсная модуляция (ШИМ, англ. pulse-width modulation (PWM)) — процесс управления мощностью методом пульсирующего включения и выключения прибора. Принцип регулирования с помощью ШИМ – изменение ширины импульсов при постоянной амплитуде и частоте сигнала.
Частота ШИМ Ардуино 488,28 Гц., разрешение — 8 разрядов (0…255), и имеется возможность использования шести аппаратных выводов 3, 5, 6, 9, 10, 11. Однако, используя настройки регистров микроконтроллера AVR можно добиться и других значений частоты ШИМ.
Микроконтроллер ESP32 имеет в своем арсенале отдельный модуль MCPWM, а точнее два модуля, каждый из которых имеет три пары ШИМ выводов
Далее в документации выходы отдельного блока помечены как PWMxA / PWMxB.
Более подробная блок-схема блока MCPWM представлена ниже. Каждая пара A / B может синхронизироваться любым из трех таймеров: Timer 0, 1 и 2. Один и тот же таймер может использоваться для синхронизации более чем одной пары выходов ШИМ. Каждый блок также может собирать входные данные, такие как сигналы синхронизации, обнаруживать сигналы тревог, такие как перегрузка по току или перенапряжение двигателя, а также получать обратную связь с помощью сигналов захвата, например, на положение ротора.
Объем конфигурации зависит от типа двигателя, в частности, от того, сколько выходов и входов требуется, и какой будет последовательность сигналов для управления двигателем.
В нашем случае опишем простую конфигурацию для управления щеточным двигателем постоянного тока, который использует только некоторые из доступных ресурсов MCPWM. Пример схемы показан ниже. Он включает в себя H-мост для переключения поляризации напряжения, подаваемого на двигатель (M), и обеспечения достаточного тока для его управления.
Конфигурация включает следующие шаги:
В своем проекте я практически использовал код из примера, немного подкорректировав его и добавил управление вторым двигателем. Для независимого управления ШИМ-каналами необходимо каждый из них настроить отдельным таймером, например MCPWM_TIMER_0 и CPWM_TIMER_1:
Подключение к WI-Fi и работа с MQTT
Библиотеки Wi-Fi обеспечивают поддержку для настройки и мониторинга сетевых функций ESP32 Wi-Fi. Следующие доступные конфигурации:
MQTT протокол
Ознакомится с темой можно здесь или здесь. Руководство ESP-IDF с примерами находится здесь.
Для настройки MQTT в коде сначала необходимо подключиться к сети Wi-Fi. После чего установить подключение к брокеру. Обработка сообщения производится в коллбеке, в качестве параметра которого выступает esp_mqtt_event_handle_t event. Если тип события равен MQTT_EVENT_DATA, значит можно парсить топик и данные. Можно настроить различное поведение в результате успешного подключения, отключение и подписки на топики.