Прозрачный настраиваемый мост wifi-uart на esp8266, со встроенным эмулятором терминала

Добавлено 15 августа 2020 в 13:58

Фантастической особенностью любого микроконтроллера с поддержкой Wi-Fi, такого как ESP8266 NodeMCU, является возможность обновления его прошивки по беспроводной сети. Это называется программированием «по воздуху» (OTA, Over-The-Air).

image
Программирование ESP8266 в Arduino IDE «по воздуху» (OTA, Over The Air)

Что такое OTA программирование ESP8266?

OTA программирование позволяет обновлять/загружать новую программу в ESP8266 с помощью Wi-Fi вместо того, чтобы требовать от пользователя подключить ESP8266 к компьютеру через USB.

Функциональность OTA чрезвычайно полезна в случае отсутствия физического доступа к модулю ESP. Это помогает сократить время, затрачиваемое на обновление каждого модуля ESP при технической поддержке.

Одной из важных особенностей OTA является то, что один центральный объект может отправлять обновления нескольким модулям ESP, использующим одну и ту же сеть.

Единственным недостатком является то, что вам нужно для OTA добавлять дополнительный код в каждый загружаемый скетч, чтобы в следующем обновлении вы смогли снова использовать OTA.

3 простых шага по использованию OTA с ESP8266

  1. Установка Python версии 2.7.x. Первый шаг – установите на компьютер Python версии 2.7.x.
  2. Загрузка базовой OTA прошивки через последовательный интерфейс. Загрузите скетч, содержащий прошивку OTA. Этот шаг обязателен шаг, чтобы вы могли выполнять следующие обновления/загрузки через беспроводную сеть.
  3. Загрузка нового скетча по воздуху. Теперь вы можете загружать новые скетчи в ESP8266 из Arduino IDE по воздуху.

Шаг 1. Установка Python версии 2.7.x

Чтобы использовать функциональность OTA, вам необходимо установить Python версии 2.7.x, если он еще не установлен на вашем компьютере.

Перейдите на официальный сайт Python и загрузите 2.7.x (конкретный релиз) для Windows (установщик MSI).

image
Рисунок 1 – Скачать Python 2.7.x

Откройте установщик и следуйте указаниям мастера установки.

Рисунок 2 – Установка Python 2.7.x на ПК

В разделе настройки Python 2.7.x убедитесь, что включен последний параметр «Add python.exe to Path» (добавить python.exe в путь).

Рисунок 3 – Включите добавление python.exe в путь при установке Python

Шаг 2. Процедура загрузки скетча OTA через последовательный интерфейс

Заводской образ в ESP8266 не поддерживает возможность обновления через OTA. Поэтому вам нужно сначала загрузить на ESP8266 прошивку OTA через последовательный интерфейс.

Этот шаг обязателен для первой прошивки, чтобы вы могли выполнять следующие обновления/загрузки по беспроводной сети.

Дополнение ESP8266 для Arduino IDE поставляется с библиотекой OTA и примером BasicOTA. Вы можете получить к нему доступ через Файл → Примеры → ArduinoOTA → BasicOTA.

Рисунок 4 – Откройте скетч BasicOTA в Arduino IDE

Должен загрузиться следующий код. Но, прежде чем начать загружать скетч в модуль, вам нужно внести несколько изменений, чтобы он у вас заработал. Вам необходимо изменить следующие две переменные в соответствии с учетными данными вашей сети, чтобы ESP8266 мог подключиться к существующей сети.

const char* ssid = "..........";  const char* password = "..........";

После этих изменений загрузите скетч.

#include   #include   #include   #include     const char* ssid = "..........";  const char* password = "..........";    void setup()   {    Serial.begin(115200);    Serial.println("Booting");    WiFi.mode(WIFI_STA);    WiFi.begin(ssid, password);    while (WiFi.waitForConnectResult() != WL_CONNECTED)     {      Serial.println("Connection Failed! Rebooting...");      delay(5000);      ESP.restart();    }      // Порт по умолчанию - 8266    // ArduinoOTA.setPort(8266);      // Имя хоста по умолчанию - esp8266-[ChipID]    // ArduinoOTA.setHostname("myesp8266");      // Аутентификация по умолчанию    // ArduinoOTA.setPassword("admin");      // Пароль может быть зашифрован MD5    // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3    // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");      ArduinoOTA.onStart([]()     {      String type;      if (ArduinoOTA.getCommand() == U_FLASH)        type = "sketch";      else // U_SPIFFS        type = "filesystem";        // Примечание:  NOTE: при обновлении SPIFFS это место для размонтирования SPIFFS с помощью SPIFFS.end()      Serial.println("Start updating " + type);    });    ArduinoOTA.onEnd([]()     {      Serial.println("nEnd");    });    ArduinoOTA.onProgress([](unsigned int progress, unsigned int total)     {      Serial.printf("Progress: %u%%r", (progress / (total / 100)));    });    ArduinoOTA.onError([](ota_error_t error)     {      Serial.printf("Error[%u]: ", error);      if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");      else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");      else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");      else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");      else if (error == OTA_END_ERROR) Serial.println("End Failed");    });    ArduinoOTA.begin();    Serial.println("Ready");    Serial.print("IP address: ");    Serial.println(WiFi.localIP());  }    void loop()   {    ArduinoOTA.handle();  }

Теперь откройте монитор последовательного порта со скоростью 115200 бит/с. И нажмите кнопку RST на ESP8266. Если все в порядке, он выведет динамический IP адрес, полученный от вашего маршрутизатора. Запишите его.

Рисунок 5 – Запишите IP адрес, выделенный для ESP8266 NodeMCU

Шаг 3. Загрузите новый скетч «по воздуху»

А теперь давайте загрузим новый скетч по воздуху, т.е. через Wi-Fi.

Помните! Вам нужно добавлять код для OTA в каждый загружаемый вами скетч. В противном случае вы потеряете возможность прошивки через OTA и не сможете выполнять следующие загрузки через беспроводную сеть. Поэтому рекомендуется изменять приведенный выше код, включая в него ваш новый код.

В качестве примера мы включим простой скетч Blink в код BasicOTA. Не забудьте изменить переменные SSID и пароля на учетные данные вашей сети.

Изменения в программе BasicOTA выделены номерами строк.

#include   #include   #include   #include     const char* ssid = "..........";  const char* password = "..........";    // переменные для мигания светодоиодом  const int led = D0;                // вывод ESP8266, к которому подключен встроенный светодиод  unsigned long previousMillis = 0;  // хранит время последнего обновления светодиода  const long interval = 1000;        // интервал мигания (миллисекунды)  int ledState = LOW;                // ledState используется для установки состояния светодиода    void setup()   {    pinMode(led, OUTPUT);          Serial.begin(115200);    Serial.println("Booting");    WiFi.mode(WIFI_STA);    WiFi.begin(ssid, password);    while (WiFi.waitForConnectResult() != WL_CONNECTED)     {      Serial.println("Connection Failed! Rebooting...");      delay(5000);      ESP.restart();    }      // Порт по умолчанию - 8266    // ArduinoOTA.setPort(8266);      // Имя хоста по умолчанию - esp8266-[ChipID]    // ArduinoOTA.setHostname("myesp8266");      // Аутентификация по умолчанию    // ArduinoOTA.setPassword("admin");      // Пароль может быть зашифрован MD5    // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3    // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");      ArduinoOTA.onStart([]()     {      String type;      if (ArduinoOTA.getCommand() == U_FLASH)        type = "sketch";      else // U_SPIFFS        type = "filesystem";        // Примечание:  NOTE: при обновлении SPIFFS это место для размонтирования SPIFFS с помощью SPIFFS.end()      Serial.println("Start updating " + type);    });    ArduinoOTA.onEnd([]()     {      Serial.println("nEnd");    });    ArduinoOTA.onProgress([](unsigned int progress, unsigned int total)     {      Serial.printf("Progress: %u%%r", (progress / (total / 100)));    });    ArduinoOTA.onError([](ota_error_t error)     {      Serial.printf("Error[%u]: ", error);      if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");      else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");      else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");      else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");      else if (error == OTA_END_ERROR) Serial.println("End Failed");    });    ArduinoOTA.begin();    Serial.println("Ready");    Serial.print("IP address: ");    Serial.println(WiFi.localIP());  }    void loop()   {    ArduinoOTA.handle();      // цикл для мигания без использования задержек    unsigned long currentMillis = millis();    if (currentMillis - previousMillis >= interval)     {      // сохранить последнее внемя, когда мигнули светодиодом      previousMillis = currentMillis;      // если светодиод погашен, включить его, и наоборот      ledState = not(ledState);      // установить состояние светодиода в соответствии с переменной      digitalWrite(led,  ledState);    }  }

В приведенной выше программе мы не использовали delay() для мигания светодиода, потому что ESP8266 во время delay() приостанавливает программу. Если следующий запрос OTA будет сгенерирован, когда ESP8266 приостановлен в ожидании прохождения задержки delay(), ваша программа пропустит этот запрос.

Как только вы скопируете приведенный выше скетч в Arduino IDE, выберите Инструменты → Порт, и вы должны увидеть что-то вроде этого: esp8266-xxxxxx at ip_адрес_вашего_esp. Если подобного не будет, возможно, вам придется перезапустить IDE.

Рисунок 6 – Выберите порт OTA в Arduino IDE

Выберите порт и нажмите кнопку «Загрузить». Через несколько секунд новый скетч будет загружен. И вы должны увидеть на плате мигающий светодиод.

Рисунок 7 – Рабта тестового скетча Blink на ESP8266 NodeMCU

Теги

Arduino IDEESP8266EspressifIoT (интернет вещей)NodeMCUOTA (Over the Air)Wi-FiWi-Fi модульМикроконтроллер

Предисловие

В бытность мою инженером связи, мне часто приходилось настраивать различное оборудование. Зоопарк из коммутаторов различных производителей, телефонные станции и прочее. Первоначальную настройку на коммутаторах удобнее делать подключившись через rs232, шнурком с преобразователем COM-USB к ноутбуку. Однако этот кабель не всегда удобен. Бывали ситуации когда ты в подвале (шкафы с оборудованием, в сетях ДРС которые я обслуживал, находились именно там), пытаешься стоя одной рукой держать ноутбук, а другой печатать, а короткий кабель соединённый с коммутатором не способствует удобству. Или зимой в минус 25 приходилось стоять возле базовой станции с ноутбуком в такой же позе. Вместо того чтобы сидеть в тёплой машине, припаркованной в 20 метрах. Предвидя упрёки в комментариях, о том что оборудование настраивать надо уделёно, скажу что эти случаи были аварийными (оборудование не в доступе) и оптимально было действовать именно так (сроки устранения повреждений не резиновые). В общем тогда я прямо таки мечтал о беспроводном удлинителе 232-ого интерфейса. И на то время у китайцев существовали такие приблуды. Но, во первых дорого, во вторых громоздко и не автономно (был отдельный БП на 9-12В). И вот прошли годы, я работаю в другой области и с оборудованием связи имею мало общего. Но иногда с настройкой коммутаторов всё-же приходится сталкиваться. Тут заходя в очередной раз на mysku.ru вижу акцию на отладочную плату TTGO T-OI с микроконтроллером esp8266 за 1 доллар. Заказав такую халяву, я начал думать что бы с ней такого полезного сделать. Собирать очередную метеостанцию не особо хотелось. И тут мне вспомнилась идея беспроводного преобразователя, хотя сейчас полно аналогичных решений и алишке, и даже есть такие вещи как Air Console с впечатляющим функционалом и не менее впечатляющей ценой. Но было интересно реализовать самому, попрактиковаться, так сказать, ведь такое хобби приносит море удовольствия.

Аппаратная часть

Краткие характеристики модуля TTGO T-OI со страницы продавца: Живые фото: Распиновка модуля: Данный модуль привлекателен тем что в нём встроена зарядка для лития и держатель для аккумуляторов формата 18340. Что без лишних телодвижений делает устройство автономным. Для включения отладочной платы служит переключатель в правом нижнем углу. Еще одним достоинством является совместимость по пинам с Wemos D1 Mini, что даёт возможность подключать к TTGO все шилды от Mini. Этим я и решил воспользоваться, накидав в Easy EDA шилд, преобразовывающий uart в rs232: Так-как напряжение логических уровней на esp8266 3.3В, то в качестве преобразователя в/из интерфейса rs232, в место традиционного MAX232 использовал микросхему MAX3232 в корпусе SOIC-16, которая как раз работает с этим напряжением. Далее, мне понадобилось 5 конденсаторов на 100 нанофарад и резистор на 1 килоОм со светодиодом. Всё в SMD исполнении, типоразмера 0805. Еще понадобится разъем DRB- 9MA. Компоненты списком: С ЛУТом возиться не хотелось, поэтому заказал её изготавливание в Китае. Шилд занимает GPIO13, GPIO15 пины, для работы с uart’ом. Отладочная информация, сыпется в GPIO2. Особенностью esp8266 является то что она позволяет переназначать аппаратный uart с ножек GPIO1 и GPIO3 на GPIO15 (TX) и GPIO13 (RX), вызовом метода Serial.swap(). Преимуществом такого трюка является то, что подключение не мешает перепрошивке модуля, а так-же в порт не сыпется отладочный мусор. Однако я оставил возможность назначить стандартные GPIO для uart. Для этого необходимо перерезать старые дорожки и напаять перемычки на TX и RX на нижней стороне платы. Фото шилда, собранного «будерброда»:

Программная часть

Я начал с изучения того что уже написано в данной области. Оказывается в пакете поставки с esp для Ардуино уже лежит пример кода для соединения устройства и хоста, (например телефона или ноутбука) через wifi по telnet. Пример так и называется WiFiTelnetToSerial. Взяв его за основу, я написал веб-интерфейс для настройки соединения и точки доступа. С сохранением настроек в во флеш-память. А так-же воспользовавшись библиотекой jQuery Terminal, реализовал эмулятор терминала, прямо в браузере. Общение web-терминала с преобразователем происходит через web-sockets. Сам код можно скачать на гитхабе, ссылки будут к конце статьи. Писался он с помощью PlatformIO . При компиляции нужно учитывать тот момент что для взаимодействия с файловой системой esp8266, я воспользовался библиотекой LittleFS в место привычной многим SPIFFS. Дело в том что SPIFFS признана устаревшей и рекомендуется переходить на LittleFS. В связи с этим у меня возникли некоторые проблемы с библиотекой FTP, пришлось пройтись по её исходникам и переписать все вызовы с SPIFFS на LittleFS. У обоих библиотек практически совместимый API, так что такой простой заменой всё и решилось. При подаче питания esp создаёт точку доступа WirelessTerminal с паролем 123456789. Так-же запускаются web-сервер на 80 порту. И ftp-сервер на 21 (нужен для доступа к флеш памяти контроллера, в основном для отладки). При заходе на ip-адрес 192.168.4.1 (по умолчанию) через браузер, появляется страница настроек: Тут возможно настроить параметры соединения, и точки доступа. Для того чтобы подключится к устройству по 232 интерфейсу подойдёт любой эмулятор терминала (я по старинке пользуюсь HyperTerminal), либо воспользоваться web консолью, нажав на кнопку RUN TERMINAL в главном окне. Примеры сессий Для телефонов на андроид подойдёт бесплатный Serial WiFi Terminal из Google Market. Так-же оставлю несколько скриншотов того как выглядит интерфейс на телефоне:

Выводы

По моему мнению получилась хорошая тренировка для мозгов, а как-же полезная в хозяйстве сисадмина/инженера устройство, для желающих повторить оставляю ссылки на исходники: Проект шилда в easyeda: easyeda.com/clericJ/wemos-d1mini-rs232shield Программная часть: github.com/clericJ/wifi-terminal

Файл формата SPIFF открывается специальными программами. Чтобы открыть данный формат, скачайте одну из предложенных программ.

Чем открыть файл в формате SPIFF

Тип файла:
Still Picture Interchange File Format
Разработчик:
Joint Photographic Experts Group
Категория:
Растровые изображения

Побитовое изображение, которое хранится в формате SPIFF, изначально разработанном для обмена файлами между средами приложений. Содержит сжатые данные изображения, разбитые на заголовок, директорию, данные изображения и секции непосредственно данных. Применяется для хранения данных изображения на жестком диске, либо для переноса данных изображения по сети.

Изображения SPIFF поддерживают битональный режим или многоцветный (цветной или серая шкала). Они также могут поддерживать несколько разных алгоритмов сжатия, включая JBIG и JPEG.

Примечание: формат SPIFF был разработан, чтобы заменить формат .JFIF. Он все еще обратно совместим с JFIF.

Другие похожие форматы и расширения файлов

.SPIDERSOLITAIRESAVE-MS .SPI .SPG .SPFX
.SPJ .SPK .SPL .SPO

Модули ESP весьма популярны в современной радиоэлектронике благодаря наличию в них функциональности Wi-Fi. К подобным модулям можно отнести ESP8266, ESP-12E и т.д. Но среди этих модулей есть один, который отличается большей вычислительной мощностью и большей универсальностью чем другие подобные модули – это модуль ESP32. В нем реализована поддержка Bluetooth, BLE и Wi-Fi, благодаря чему он весьма часто используется в проектах, связанных с технологией интернета вещей (IoT – Internet of Things). Но не все знают, что ESP32 является двухъядерным (Dual-core) микроконтроллером. Иногда его называют не микроконтроллером, а модулем.

ESP32 имеет в своем составе два 32-битных микропроцессора Tensilica Xtensa LX6, благодаря которым он является достаточно мощным двухъядерным (core0 и core1) микроконтроллером. ESP32 доступен в двух вариантах – одноядерный и двухъядерный, но более распространен двухъядерный вариант поскольку он стоит лишь немногим дороже чем одноядерный.

Структурная схема микроконтроллера ESP32 представлена на следующем рисунке.

ESP32 можно программировать с помощью Arduino IDE, Espressif IDF, Lua RTOS и т.д. При программировании с помощью Arduino IDE код программы будет исполняться только на первом ядре (Core1) поскольку нулевое ядро (Core0) будет уже запрограммировано для решения задач радиочастотной связи. Но в данной статье мы рассмотрим как использовать оба ядра ESP32 для выполнения двух операций одновременно. Первой из этих задач будет мигание встроенным светодиодом, а второй – считывание данных температуры с датчика DHT11. Но вначале давайте рассмотрим преимущества многоядерных микропроцессоров над одноядерными.

Преимущества многоядерных микропроцессоров

  1. Многоядерные микропроцессоры особенно полезны когда требуется выполнять два или более процесса одновременно.
  2. Поскольку работа распределена между несколькими ядрами, то это позволяет выполнить некоторые задачи быстрее.
  3. Для многоядерных микропроцессоров можно уменьшить энергопотребление, поскольку когда какое-нибудь ядро находится в холостом режиме (idle mode), оно может быть использовано для отключения периферийных устройств, которые не используются в текущий момент времени.
  4. Двухъядерным микропроцессорам нет необходимости так часто переключаться между различными потоками задач как одноядерным микропроцессорам, поскольку они могут обрабатывать два потока задач одновременно вместо одного.

ESP32 и FreeRTOS

Модуль ESP32 имеет встроенное в него программное обеспечение FreeRTOS, которое представляет собой операционную систему реального времени, особенно полезное при выполнении многозадачных процессов. RTOS помогает в управлении ресурсами и максимизирует производительность системы. FreeRTOS имеет множество API (прикладного программирования) функций для различных целей и с помощью этих функций мы можем запускать различные задачи на различных ядрах.

Полную документацию по API функциям FreeRTOS можно найти по этой ссылке. В нашем проекте мы сделаем попытку использования ряда этих функций для построения многозадачного приложения, которое будет исполняться на обоих ядрах ESP32.

Определение идентификатора ядра (core ID) ESP32

В этом проекте мы будем использовать среду Arduino IDE для загрузки кода программы в модуль ESP32. Для определения идентификатора ядра (core ID), на котором исполняется код, существует специальная API функция.

Эту функцию можно вызывать внутри функций void setup() и void loop() для определения идентификатора ядра, на котором эти функции выполняются.

Вы можете протестировать эту API функцию при помощи следующего скетча:

После загрузки этого скетча в модуль откройте окно монитора последовательной связи (Serial monitor) и вы в результате выполнения представленного скетча увидите, что обе эти функции выполняются на первом ядре (core1) как показано на следующем рисунке.

Из представленного примера можно сделать вывод, что по умолчанию скетч Arduino выполняется на первом ядре (core1) модуля ESP32.

Программирование обоих ядер ESP32

Arduino IDE поддерживает FreeRTOS для ESP32 и поэтому API функции FreeRTOS позволяют нам создавать задачи, которые будут независимо исполняться на обоих ядрах. Задача в данном случае – это кусок кода программы, который выполняет определенные задачи, например, мигание светодиода, передача значения температуры и т.д.

Следующая функция, которую мы рассмотрим, будет создавать задачи, исполняемые на обоих ядрах. В этой функции нам необходимо будет задать ряд ее аргументов – приоритет задачи, идентификатор ядра и т.д.

Для создания этой функции нам необходимо выполнить следующую последовательность шагов:

1. Первым делом необходимо создать задачи в функции void setup. В данной статье мы создадим две задачи: одну для мигания светодиодом каждые полсекунды, а другую – для считывания значения температуры каждые 2 секунды.

Функция xTaskCreatePinnedToCore() будет содержать у нас 7 аргументов:

  1. Имя функции для выполнения задачи (task1).
  2. Любое имя, которое необходимо будет дать задаче (“task1” и т.д.).
  3. Размер стека в словах, выделенный для задачи (1 слово = 2 байта).
  4. Входные параметры задачи (может быть NULL, то есть входных параметров может не быть).
  5. Приоритет задачи (0 – это самый низкий приоритет).
  6. Идентификатор задачи (может быть NULL).
  7. Идентификатор ядра, на котором будет выполняться задача (0 или 1).

Теперь создадим нашу первую задачу (Task1) мигания светодиодом и укажем все необходимые аргументы для функции xTaskCreatePinnedToCore().

Аналогичным образом создадим задачу 2 (Task2), для которого 7-м аргументом в качестве идентификатора ядра укажем 1 (core id 1).

Вы можете изменить приоритет и размер стека в зависимости от сложности задачи.

2. Теперь мы можем выполнить функции Task1code и Task2code. Эти функции содержат код для выполнения требуемой задачи. В нашем случае первой задачей будет мигание светодиодом, а второй – считывание значения температуры. Поэтому создадим две отдельные функции для выполнения каждой из этих задач за пределами функции void setup.

Код функции Task1code для мигания светодиодом каждые 0.5 секунды при этом будет выглядеть следующим образом:

Аналогичным образом можно записать и код функции Task2code для считывания значения температуры.

3. Функцию void loop мы в нашем случае оставим пустой. Поскольку мы уже знаем, что функции loop и setup исполняются на первом ядре (core1), то мы можем выполнять задачу для первого ядра (core1) также в функции void loop.

На этом написание программы закончено, просто загрузите код программы в модуль с помощью Arduino IDE, выбрав в ней в меню Tools плату ESP32. Также убедитесь в том, что вы подсоединили датчик DHT11 к контакту D13 платы ESP32.

Результаты работы нашей программы можно посмотреть в окне монитора последовательной связи.

Более сложные системы реального времени можно проектировать аналогичным образом, запуская разные задачи одновременно на двух ядрах модуля ESP32.

Исходный код программы (скетча)

Видео, демонстрирующее работу проекта

1 758 просмотров

image  Микроконтроллер 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), управляемое микроконтроллером.

Отличительные особенности:

Wireless:

  • Wi-Fi: 802.11b/g/n/e/i, до 150 Mbps c HT40
  • Bluetooth: v4.2 BR/EDR и BLE

Peripheral interfaces:

  • 12-bit SAR ADC до 18 каналов
  • 2 × 8-bit DAC
  • 10 × touch сенсоров
  • Temperature сенсор
  • 4 × SPI
  • 2 × I²S
  • 2 × I²C
  • 3 × UART
  • 1 host (SD/eMMC/SDIO)
  • 1 slave (SDIO/SPI)
  • Ethernet MAC с поддержкой DMA и IEEE 1588
  • CAN 2.0
  • IR (TX/RX)
  • Motor PWM
  • LED PWM до 16 каналов
  • Hall sensor
  • Ultra low power analog pre-amplifier

Security:

  • IEEE 802.11 безопасность WFA, WPA/WPA2 и WAPI
  • Secure boot
  • Flash encryption
  • 1024-bit OTP, включая до 768-bit под задачу
  • Cryptographic движок: AES, SHA-2, RSA, ECC, RNG

Распновка чипа ESP32:

image (Скачать в PDF)

в ESP32 есть JTAG интерфейс на ножках IO12, IO13, IO14, IO15.

Даташит ESP32

image

Распиновка модуля WROOM32:

image

Модуль WROOM-32 может поставляться со специальной отладочной платой:

image

Эта плата позволяет быстро программировать модуль благодаря встроенному адаптеру USB-TTL. На ней также расположены кнопки программирования и сброса, а также регулятор напряжения для питания микроконтроллера ESP32 напряжением 3.3 В. Также плата дает удобный доступ к выводам модуля, шаг между которыми довольно узок, чтобы без проблем работать с ними. Шаг же между выводами платы составляет 2.54 мм, что является стандартом для DIP-корпусов, с которыми удобно работать обычному радиолюбителю без специальных инструментов.

Распиновка отладочной платы ESP32:

image

Средства разработки ESP32

Программные средства разработки (программный комплект разработчика, SDK) состоят из:

  •     Компилятора. Компилятор для Xtensa LX106 входит в пакет компиляторов GNU Compiler Collection. Поскольку компилятор имеет открытые исходные тексты, то в разных SDK могут содержаться разные сборки этого компилятора, немного отличающиеся поддерживаемыми опциями.
  •     Библиотек для работы с периферией контроллера, стеков протоколов WiFi, TCP/IP.
  •     Средств загрузки исполняемого файла в память программ микроконтроллера.
  •     Опциональной IDE.

Espressif свободно распространяет свой комплект разработчика. В этот комплект входит компилятор GCC, библиотеки Espressif и загрузочная утилита XTCOM. Библиотеки поставляются в виде скомпилированных библиотек, без исходных текстов. Espressif поддерживает две версии SDK: одна на основе RTOS, другая на основе обратных вызовов (callback).[2]

Помимо официальной SDK существует ряд проектов альтернативных SDK. Эти SDK используют библиотеки Espressif или предлагают собственный эквивалент библиотек Espressif, полученный методами реверсинжиниринга.

  •     «esp-open-sdk». Улучшенная версия SDK от Expressif. Содержит GCC компилятор и некоторые библиотеки Expressif. Только Линукс. По-русски немного здесь.
  •     «Unofficial Development Kit» Михаила Григорьева. В комплект входит Windows-инсталлятор, компилятор GCC собственной сборки с интеграцией с графической IDE Eclipse, актуальные комплекты библиотек и документации Espressif, некоторые утилиты. Имеется русскоязычный форум.
  •     «Arduino IDE for ESP8266» — дополнение к IDE Arduino, позволяющее программировать ESP8266 так же легко как любые другие модули Ардуино. При этом доступен сетевой функционал ESP8266. Компилятор GCC, загрузчик прошивки ESPTool. Подробное русскоязычное описание процесса установки и доступного API здесь, пример работы здесь.
  •     «GNU toolchain for esp8266». Имеет возможность интеграции в Visual Studio.
  •     «ESP8266 GCC Toolchain» Макса Филиппова.
  •     «Sming»[6] — проект добавления Arduino совместимых библиотек поверх стандартных библиотек 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. Документации, примеров и поддерживаемых сред не так уж и много. 

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
А как считаете Вы?
Напишите в комментариях, что вы думаете – согласны
ли со статьей или есть что добавить?
Добавить комментарий