Программирование ESP32 в Arduino IDE: проекты и схема распиновки

Вопросы и ответы

Нужна ли FreeRTOS для ESP32?

Первое, что бросается в глаза при просмотре примеров эскизов для ESP32: они часто используют функции xTaskCreate или xTaskCreatePinnedToCore. То есть в многопоточном режиме выполняются различные операции. Возникает вопрос: нельзя ли сделать это «по-старому, по простому», не используя все эти задачи? Неужели нужно осваивать новую область: программирование под FreeRTOS?

Также лично у меня сразу возник другой вопрос: если теперь на борту ESP32 два процессора, как они будут использоваться скетчем? Я как-то спросил esp8266.ru о форме, но потом ответил сам :).

Я получил ответы на свои вопросы после того, как наткнулся на скетч-оболочку Arduino packages esp32 hardware esp32 1.0.4 cores esp32 main.cpp. Эта оболочка используется для всех эскизов, которые вы создаете в классической среде разработки Arduino.

Какую информацию вы можете получить отсюда? Вы можете видеть, что FreeRTOS всегда подключается к вашему скетчу по умолчанию (через #include «freertos / FreeRTOS.h»), а любой классический скетч Arduino IDE (то есть написанный без использования действий) — это просто действие FreeRTOS, которое выполняется на втором ядре процессора п. 1, при этом выделено всего 8192 байта стека! Сам FreeRTOS работает на ядре процессора № 0.

Это и хорошо, и плохо. Хорошо, что на ESP32 для Arduino обслуживание самого контроллера, Wi-Fi и другие сервисные потребности теперь не будут мешать вашему скетчу. Теперь, даже если скетч зависнет или перейдет в режим гибернации на столетие, это никак не повлияет на работу служебных программ.

И плохо то, что ваш скетч будет иметь доступ только к ограниченному объему стека, остальная доступная память просто не будет использоваться. 8192 — это далеко не весь стек, доступный для задач FreeRTOS, на одном из моих контроллеров работает еще дюжина других параллельных задач (каждая со своим собственным выделенным стеком), а память еще не закончена.

Вывод: если вы хотите использовать все функции, доступные в ESP32, вам нужно будет изучить и использовать функции FreeRTOS, хотите вы этого или нет. В этом нет ничего плохого, FreeRTOS довольно легко освоить. Многопоточность позволяет легко и изящно отделить «мух от котлет», когда необходимо обеспечить стабильную работу автоматики вне зависимости от внешних факторов. Например, ваш WiFi-роутер «сгорел», MQTT-сервер «сломался» или случилось что-то еще.

Но при этом «основная» задача контроллера, где считываются показания датчиков и включаются и выключаются реле управления насосами и нагревателями, продолжит работать стабильно и без задержек. В однопоточной системе поддерживать такую ​​стабильность намного сложнее. Но, увы, когда вы начнете использовать многопоточность и задачи в ESP, вам придется забыть некоторые из уже знакомых библиотек Arduino, поскольку они просто не могут работать в многозадачной среде.

Например, для ESP32 библиотека ESP8266Ping и библиотека времени Arduino не будут работать. Проблема может быть устранена, но некоторые участки кода необходимо вылечить и перепрограммировать для новых условий.

А нужен ли вообще Arduino для ESP32?

Еще более радикальным решением является полный отказ от фреймворка ArduinoEspressif32 как такового, т.е программирование контроллера на «более низком уровне» фреймворка ESP-IDF. Зачем это нужно и какие возможности предлагает?

Начнем с преимуществ ESP-IDF

Прежде всего, ArduinoEspressif32 — это просто «надстройка» к ESP-IDF, которая требует дополнительных ресурсов и памяти. Фреймворк ArduinoEspressif32 был создан самим Espressif32 для интеграции ESP-IDF в IDE Arduino, но его также можно использовать в PlatformIO (что происходит в 99% случаев). На мой взгляд, это не самый оптимальный подход, поскольку код, написанный для ESP-IDF, по определению будет более оптимальным, чем код, выполняющий точно такие же функции из Arduino. Ну это если вы сами специально не устанавливаете конечно

Во-вторых, в ESP-IDF API разработчики уже предоставили столько встроенных функций, что необходимость в сторонних библиотеках просто отпадает. Встроенный API для подключения к WIFI, поддержка протоколов SNTP, PING, MQTT, HTTP и HTTPS (методы GET / POST / DELETE и т.д.) и многих других функций. Все это довольно просто запустить и управлять. В общем, есть практически весь набор базовых функций для программирования микрокомпьютера.

И нет необходимости изобретать велосипеды. Просто посмотрите документацию. Следует сразу отметить, что часто «встроенные» библиотеки ESP-IDF потребляют значительную часть памяти, например при подключении библиотек WiFi («esp_wifi.h», «esp_netif.h» и им подобных), размер скетча резко увеличивается с ~ 14% до того, что сразу ~ 50% доступного объема раздела, при подключении MQTT — еще + 10% и т д

В-третьих, ArduinoEspressif32 по определению является однопоточной системой. Он не был разработан для многопоточных микроконтроллеров. А при одновременном доступе к одному и тому же ресурсу возникнут конфликты, например, при одновременном доступе к WiFi.

Конечно, этим можно и нужно управлять. Но! В ESP-IDF можно избежать некоторых конфликтов, например, при доступе к WiFi из разных потоков. Правда, делать это нужно не всегда: при одновременном доступе к шине I2C или другим подобным ресурсам все равно придется использовать механизмы блокировки.

В-четвертых, ArduinoEspressif32 «теряет» некоторые аппаратные возможности ESP32. Например, в ESP32 вы можете использовать две отдельные шины I2C (и повесить вдвое больше датчиков), но Arduino не знает, как это сделать.

Недостатки неиспользования ArduinoEspressif32

В этом несовершенном мире за все нужно платить. С чем вам придется столкнуться, если вы решите использовать ESP32 в полной мере”?

Во-первых, и это очевидно, вам придется отказаться от «любимой и ненавистной» Arduino IDE и перейти к чему-то другому. Например, перейдите в VSCode + PlatformIO. Сразу скажу: хоть VSCode несравнимо дешевле Arduino IDE, но плагин для работы с микроконтроллерами PlatformIO лично, на мой взгляд, еще далек от совершенства. Прежде чем вы сможете собрать более-менее полноценный проект на PlatformIO, вы достаточно пострадаете.

Во-вторых, и это не менее очевидно, вам все равно придется изучать новые функции встроенного API. Но это тоже интересно. ESP-IDF — это в первую очередь асинхронный, то есть основанный на событиях API. Некоторые задачи решаются настолько «изящно», что вы получаете истинное удовольствие. А для решения других проблем придется ломать голову.

В-третьих, на ESP32 каждое отдельное действие не может использовать все доступное пространство стека, ему назначается только небольшой фиксированный фрагмент. Это надо учитывать, это немного усложняет отладку, так как каждый раз приходится экспериментально подбирать размер стека для задачи. Дайте больше: на другие задачи может не хватить, дайте меньше: контроллер перезагрузится из-за переполнения стека задач.

Следующий недостаток, на мой взгляд, может полностью перечеркнуть все преимущества отказа от Ардуино, которую называют «в зародыше». Дело в том, что библиотек драйверов устройств для ESP-IDF практически нет. Датчики температуры и влажности, LCD и многое другое. Драйвер для всего, что легко найти в списке стандартных библиотек IDE Arduino. То есть все библиотеки, скажем, для DHT22 или BME280, которые можно найти в репозиториях Arduino IDE и PlatformIO на момент написания этой статьи, можно найти только в Arduino.

Версий для ESP-IDF — DHT22 очень мало, вроде еще что-то и все. Просто они еще не написаны, потому что все строго придерживаются анаболиков Arduino. Это не беда, есть библиотека для работы с I2C, и, «покурив» ​​мануалы, можно написать свою библиотеку. Но вы должны написать это сами. В принципе, чем я сейчас и занимаюсь. Это не очень сложно, для большинства датчиков (DHTxx, AHT10, SHT, DHT и так далее, свои варианты я уже написал, все они в открытом доступе.

Использование Arduino Time Library

Очень досадным сюрпризом, с которым я столкнулся на ESP32, была невозможность использовать библиотеку времени Arduino (Time) из общедоступного каталога библиотек Arduino. Я использовал эту библиотеку для синхронизации времени, даты и времени с серверами NTP. Сама библиотека отлично компилируется для ESP32 и, похоже, работает. Но он отлично работает, если вы используете только одно действие на ESP32. В противном случае легко может возникнуть ситуация, когда несколько задач пытаются получить время одновременно, и если синхронизация с NTP запускается одновременно, контроллер почти гарантированно зависнет.

Я вижу выход из этой ситуации в использовании «встроенных» функций даты и времени в API, например:

Затем ядро ​​FreeRTOS само выполняет синхронизацию. Оказалось, что с помощью встроенных в API функций наладить синхронизацию еще проще, а есть системная библиотека time.h, где все удобнее и проще и нет необходимости изобретать велосипеды.

Установка драйверов для ESP32

Первое и самое главное при программировании этой карты — это установка драйверов USB — UART CP210x. Установите соответствующие драйверы в зависимости от вашей операционной системы.

Настройка Arduino IDE для работы с ESP32

Изначально продукты Espressif оснащены микропрограммным обеспечением, которое позволяет использовать AT-команды. Это не всегда удобно, поэтому лучше всего программировать плату в обычной среде разработки — Arduino IDE.

Чтобы начать создавать проекты с ESP32, вы должны сначала получить его поддержку в Arduino IDE. Поддержка в настоящее время находится на базовом, но жизнеспособном уровне. Могут возникнуть проблемы с драйверами устройств, но из-за популярности модуля скоро будет поддерживаться вся периферия.

Прежде всего, вам необходимо загрузить Arduino IDE и официальные инструкции с https://github.com/espressif/arduino-esp32. Вам необходимо скачать файлы дистрибутива и поместить их в папку C: Users User Documents Arduino hardware espressif esp32.

Поскольку плата ESP32 новая и поддержка в среде разработки Arduino появилась недавно, ее установка может быть затруднена. Это связано с тем, что драйверы находятся в стадии разработки, а порядок расположения системных каталогов изменился. Все скетчи должны находиться в папке C: Users User Documents Arduino. Файлы дистрибутива должны быть помещены в эту папку в соответствии с рекомендациями производителя. Если это не учитывать, поддержка Arduino ESP32 будет отсутствовать.

После установки вы можете открыть Arduino IDE. Затем нужно зайти в настройки и выбрать в диспетчере вкладок тот, который вам нужен. Теперь вы можете прошить форму.

Технические характеристики выводов ESP32

ESP32 поддерживает мультиплексирование контактов, что означает, что мы можем решить, к какому из 28 контактов ввода / вывода подключать периферийные устройства. Это означает, что нам решать, какой вывод будет действовать как MISO, RX, SCLK, MOSI, TX, SCL, SDA и так далее

Однако контакты аналого-цифрового преобразователя (АЦП) и цифро-аналогового преобразователя (ЦАП) статичны.

  • Каналы АЦП: 18
  • Каналы ЦАП: 2
  • SPI: 3
  • UART: 3
  • I2C: 2
  • ШИМ: 16
  • I2S: 2

Питание платы разработки ESP32

Для питания платы разработки ESP32 мы можем использовать порт USB или батарею LiPo. Если мы используем оба этих устройства на нашей плате, контроллер заряда, уже установленный на плате, будет заряжать нашу LiPo батарею.

На плате также есть стабилизатор напряжения 3,3 В, обеспечивающий ток 600 мА. Карта может потреблять до 250 мА во время передачи RF. Контакты ввода / вывода общего назначения не могут обрабатывать 5 В. Поэтому, если нам нужно подключить 5 В к нашей плате, нам нужно использовать преобразователь уровня.

Получение одинакового сигнала на разных GPIO

можно получить один и тот же сигнал с одного и того же канала на разных GPIO. Для этого вам необходимо подключить эти GPIO к одному каналу в setup().

Давайте изменим предыдущий пример, чтобы затемнить 3 светодиода, используя один и тот же сигнал ШИМ из одного канала.

Схема

Добавьте еще два светодиода в схему, как показано на схеме ниже:

image_7.jpg

Распиновка ESP32

Микроконтроллер имеет 48 контактов плюс 1 большой термоконтакт, которые выполняют разные функции. Штифты для стружки:

  • 18 каналов 12-битного АЦП;
  • 10 дверей GRIO;
  • 3 SPI;
  • 3 UART;
  • 2 I2C;
  • 16-контактный ШИМ;
  • 2 8-битных выхода ЦАП;
  • 2

Распиновка различается от производителя к производителю. Например, есть плата DOIT DEVKIT V1 ESP32 с 36 контактами. Распиновка показана на рисунке ниже.

Распиновка ESP32

Распиновка ESP32

Один из самых популярных модулей — ESP-WROOM-32. Распиновка также показана на изображении.

Распиновка ESP WROOM 32

Распиновка ESP WROOM 32

Контакты датчика подключены к портам GRIO 0, 4, 2, 15, 13, 12, 14, 27, 33 и 32. Их можно использовать для вывода ESP32 из глубокого сна. Они фиксируют любые изменения электрического заряда.

Порты с 34 по 39 используются только для ввода информации. У них нет подтягивающих резисторов, поэтому их нельзя использовать в качестве выходов.

На некоторых картах показаны контакты 6-11. Они подключены к встроенной вспышке SPI. Они не используются в проектах.

Существуют разные версии платы ESP32 с размерами 5×5 мм или 6×6 мм. Также существуют модули SMT на базе ESP32 для интеграции в другие платы.

Управление яркостью светодиода

Давайте рассмотрим простой пример, чтобы узнать, как использовать контроллер светодиода ESP32 PWM с помощью Arduino IDE.

Схема

Подключите светодиод к ESP32, как показано на следующей схеме. Светодиод должен быть подключен к GPIO 16.

image_4.jpg

(На этой схеме используется GPIO версии 30 модуля ESP32 DEVKIT V1 — если вы используете другую модель, проверьте схему GPIO карты, которую вы используете.)

Примечание: можно использовать любой желаемый контакт, если он может действовать как выход. Все выводы, которые могут выступать в качестве выходов, могут использоваться как выводы ШИМ.

Код

Откройте Arduino IDE и скопируйте следующий код.

Начнем с определения контакта, к которому подключен светодиод. В этом случае светодиод подключен к GPIO 16.

Затем мы устанавливаем свойства сигнала ШИМ. Определите частоту 5000 Гц, выберите канал 0 для генерации сигнала и установите разрешение 8 бит. Вы можете выбрать другие свойства помимо этих для генерации различных сигналов ШИМ.

В setup () вам необходимо настроить светодиод PWM со свойствами, определенными выше, с помощью функции ledcSetup () следующим образом:

Затем вам нужно выбрать GPIO, на который будет выводиться сигнал. Для этого мы используем функцию ledcAttachPin (), которая принимает в качестве аргументов GPIO — канал, который генерирует сигнал. В этом примере мы получим сигнал в ledPin GPIO, который соответствует GPIO 16. Каналом, который генерирует сигнал, является ledChannel, который соответствует каналу 0.

В цикле вы измените рабочий цикл с 0 на 255, чтобы увеличить яркость светодиода.

Затем от 255 до 0 для уменьшения яркости.

Чтобы установить яркость светодиода, просто используйте функцию ledcWrite (), которая принимает в качестве аргументов канал генерации сигнала и рабочий цикл.

Поскольку мы используем 8-битное разрешение, рабочий цикл будет определяться значением от 0 до 255. Обратите внимание, что в функции ledcWrite () мы используем канал, который генерирует сигнал, а не GPIO.

Тестирование примера

Загрузите код в ESP32. Убедитесь, что вы выбрали правильную карту и COM-порт. Взгляните на свою диаграмму. У вас должен быть диммер, увеличивающий и уменьшающий яркость.

image_6.jpg

Отличия esp32 от esp8266

Платформы ESP8266 и ESP32 производятся одной компанией Espressif. Микроконтроллер ESP32 отличается от своего предшественника улучшенной производительностью, большей функциональностью и большим объемом памяти. Стоимость нового устройства примерно в 2 раза дороже.

Важным преимуществом ESP32 является более быстрый Wi-Fi и Bluetooth. ESP32 имеет более мощный процессор для обработки сложных проектов. Эта платформа подходит для приложений, которым требуется Интернет или новые интерфейсы. Для более дешевых проектов используется ESP8266.

Объем памяти нового устройства ESP32 был увеличен: 512 КБ по сравнению с 160 КБ для ESP8266. ESP32 также имеет большое количество контактов GRIO. Емкостные сенсорные датчики и датчик температуры подключены к разным контактам ESP32. Контакты GRIO можно использовать по-разному на обоих устройствах. ESP32 имеет 18 12-битных каналов АЦП. Его предшественник имеет только 1 10-битный вывод АЦП.

Мощность процессора существенно влияет на скорость работы. Модуль ESP32 показывает рекордную производительность по сравнению со своим предшественником ESP8266. Загрузка страницы с длинным наброском и большим количеством графики занимает секунды.

К недостаткам ESP32 можно отнести отсутствие библиотек для поддержки датчиков и небольшое количество драйверов. Это связано с тем, что карта появилась в продаже совсем недавно. Но учитывая все достоинства микроконтроллера и его перспективы, эта проблема будет решена в ближайшее время.

Ключевые характеристики ESP32

  • Встроенный Wi-Fi 802.11
  • Модуль Wi-Fi работает в диапазоне частот 2,4 ГГц — 2,5 ГГц
  • Три режима работы: 1. Точка доступа. 2. Заказчик. 3. Точка доступа + станция
  • 32-битный двухъядерный микропроцессор
  • Рабочее напряжение 3,3 В
  • Тактовая частота от 80 МГц до 240 МГц
  • SRAM составляет 512 КБ
  • Объем ПЗУ — 448 КБ
  • Он поддерживает внешнюю флеш-память до 32 МБ
  • Максимальный ток на каждом контакте составляет 12 мА, но рекомендуется 6 мА.
  • Плата имеет 36 контактов ввода / вывода общего назначения
  • Контакты ввода-вывода общего назначения имеют функции ШИМ, I2C и SPI
  • Доступны версии Bluetooth 4.2 и Bluetooth с низким энергопотреблением (BLE).
  • Рабочее напряжение от 2 до 3,6 В
  • Потребление тока во время глубокого сна 2,5 мкА
  • 10-электродная емкостная сенсорная поддержка
  • Аппаратное шифрование для AES, ECC, RSA — 4096, SHA2
  • Встроенная антенна на печатной плате или разъем IPEX для внешней антенны
  • Диапазон рабочих температур от -40 ° C до + 125 ° C.

ESP32 LED ШИМ Контроллер

ESP32 имеет контроллер светодиодов PWM с 16 независимыми каналами, которые можно настроить для генерации сигналов PWM с различными свойствами.

Шаги, необходимые для изменения яркости светодиода с помощью ШИМ с использованием Arduino IDE:

  • Для начала нужно выбрать канал ШИМ. Есть 16 каналов от 0 до 15.
  • Затем нужно установить частоту сигнала ШИМ. Для светодиода подходит частота 5000 Гц.
  • Также необходимо установить разрешение скважности сигнала: есть разрешения от 1 до 16 бит. Мы будем использовать 8-битное разрешение, что означает, что вы можете управлять яркостью светодиодов, используя значение от 0 до 255.
  • Далее необходимо указать, на какой GPIO будет отправляться сигнал. Для этого вам нужно использовать следующую функцию:

ledcAttachPin (GPIO, канал)

Эта функция принимает два аргумента. Первый — это номер GPIO, который будет выводить сигнал, а второй — это канал, который будет генерировать сигнал.

  • Для управления яркостью светодиодов через ШИМ используйте следующую функцию:

ledcWrite (канал, рабочий цикл)

Эта функция принимает в качестве аргументов канал генерации ШИМ-сигнала и рабочий цикл.

Читайте также: Принцип работы вибрационного датчика для Ардуино

Оцените статью
Блог про Arduino