Esp32 как прошить по wifi
В этом руководстве рассмотрим, как выполнить беспроводную загрузку кода для платы ESP32 с помощью библиотеки AsyncElegantOTA . Эта библиотека создает веб-сервер, который позволяет загружать новую прошивку (новый скетч) на плату без необходимости устанавливать последовательное соединение между ESP32 и компьютером.
Кроме того, с помощью этой библиотеки вы также можете загружать новые файлы в файловую систему ESP32 (SPIFFS). Библиотека очень проста в использовании, и совместима с библиотекой ESPAsyncWebServer, которую часто используют для проектов с веб-серверами.
Освоив это руководство, вы сможете использовать возможности беспроводной загрузки в своих проектах с использованием веб-серверов.
Обзор
В этом руководстве рассматриваются :
- Добавка ElegantOTA на веб-сервер
- Загрузка прошивки через OTA на плату ESP32
- Загрузка файлов в SPIFFS через OTA на плату ESP32
Мы рекомендуем вам внимательно изучить все этапы руководства, чтобы понять, как работает ElegantOTA и как вы можете использовать ее в своих проектах. Чтобы продемонстрировать, как это сделать, мы загрузим файлы для создания различных проектов с использованием веб-серверов.
Есть разные способы выполнять такие обновления. В этом руководстве мы расскажем, как это сделать с помощью библиотеки AsyncElegantOTA . На наш взгляд, это один из лучших и простых способов выполнять беспроводные обновления.
Библиотека AsyncElegantOTA создает веб-сервер, к которому вы можете получить доступ в своей локальной сети для загрузки новой прошивки или файлов в файловую систему (SPIFFS). Загружаемые файлы должны быть в формате .bin.
Единственным недостатком использования OTA является то, что вам нужно добавлять код для беспроводной связи в каждый загружаемый вами скетч. В случае библиотеки AsyncElegantOTA этот код состоит всего из трех строк.
Библиотека для беспроводной загрузки скетчей
Почему выбранная нами библиотека идеально подходит?
- Она совместима с библиотекой ESPAsyncWebServer ;
- Нужно просто добавить три строки кода, чтобы добавить возможности беспроводной загрузки на ваш «обычный» веб-сервер;
- Она позволяет обновлять не только прошивку платы, но и добавлять файлы в SPIFFS;
- У нее весьма красивый и удобный интерфейс для веб-сервера;
Краткое описание OTA-обновлений
Чтобы добавить возможности OTA в свои проекты с помощью библиотеки AsyncElegantOTA , выполните следующие действия:
Как работает OTA Web Updater?
- Первый скетч нужно загрузить через последовательный интерфейс. Этот скетч должен содержать код для создания OTA Web Updater, чтобы можно было загрузить код с помощью браузера.
- Скетч OTA создает веб-сервер, с помощью которого можно загружать скетчи через веб-браузер.
- Затем вам необходимо реализовать процедуры OTA в каждом загружаемом скетче, чтобы возможно было выполнять последующие обновления / загрузки по беспроводной сети.
- Если вы загрузите код без процедуры OTA, вы больше не сможете получить доступ к веб-серверу и загрузить другой скетч по WiFi.
Как установить библиотеки?
Вам также необходимо установить библиотеки AsyncTCP и ESPAsyncWebServer . Нажмите на ссылки ниже , чтобы загрузить библиотеки.
Эти библиотеки недоступны для установки через менеджер библиотек Arduino, то есть нужно в среде разработки Arduino перейти Скетч > Подключить библиотеку > Добавить .zip библиотеку и выбрать библиотеки, которые вы только что загрузили.
Пример применения библиотеки
Давайте начнем с простого примера. Здесь создается простой веб-сервер с ESP32. Корневой URL-адрес отображает некоторый текст, а URL-адрес / update отображает интерфейс для обновления прошивки и файловой системы.
Подопытная плата Wemos (ESP8266), программироваться будет в IDE Arduino .
Задача такова, нужно соединить STM с ESP, передать на ESP (через интернет) прошивку, далее ESP должна подтянуть BOOT_0 к «плюсу», нажать ресет, и загрузить прошивку в STM через USART_1. Однако прежде надо научится общаться с системным загрузчиком — там не всё так просто как мне думалось по началу, но и сложного ничего нет. Вот мануал на русском языке (обязательно прочтите), описывающий протокол обмена данными между бутлоадером и внешним устройством.
В мануале говориться что максимальная скорость USART'а не должна превышать 115200 (при увеличении растет погрешность). В примере я указал 57600 так как такая скорость используется по умолчанию утилитой stm32flash. Тем не менее плата успешно прошивалась даже на скорости 921600.
Чтобы «договориться» с загрузчиком, нужно послать ему один байт (0x7F), загрузчик принимает этот байт и по нему распознаёт скорость USART'а. Если байт успешно принят (скорость определена), то загрузчик в ответ посылает байт подтверждения 0x79 — ACK-байт . После этого можно посылать загрузчику различные команды. Большая часть команд состоит из двух байт. На все команды, если они успешно выполнены, загрузчик отвечает байтом подтверждения.
Прежде чем браться за ESP, я написал программу для Arduino Mega (и для stm тоже), чтоб потренироваться «разговаривать» с загрузчиком…
Загружаемая прошивка хранится на SD карте.
Serial1 — соединён с USART'ом stm32. Настраивается на работу с битом чётности (SERIAL_8E1).
Serial — смотрим отладочную инфу, и «рулим» ардуиной.
WRITE_ADDR — начальный адрес для загрузки новой прошивки.
SIZE_WRITE — прошивка загружается в stm блоками, максимальный размер блока 256 байт.
Передача каждого блока происходит так: передаётся команда (0x31, 0xCE), в ответ приходит байт подтверждения, передаётся адрес по которому будет записан блок (адрес каждого последующего блока сдвигается на длину размера блока), в ответ приходит байт подтверждения, передаётся блок, в ответ приходит байт подтверждения, и т.д. Соответственно, чем больше размер блока, тем меньше будет промежуточных операций.
Файл размером 64Кб, на скорости 57600, прошивается за
Я где-то встречал неподтверждённую инфу, что у некоторых МК максимальный размер блока 128 байт.
FIRMWARE — название файла (прошивки). Программа работает только с bin-файлами .
D5 — реле для управления BOOT_0.
2 — на пин BOOT_0. У платы BluePill это центральный штырёк, на который надет джампер.
3 — на «минус».
1 — на «плюс».
В отключённом состоянии будет тянуть BOOT_0 на «минус», а при включении на «плюс».
D6 — управляет ресетом. Коротит ресет на «минус» через NPN транзистор.
RX и TX нужно подтянуть к «плюсу» резисторами
Подключайте все железки, прошивайте ардуину, открывайте и отправляйте ей команды…
B — активирует загрузчик (подтягивает BOOT_0 к «плюсу»), нажимает ресет, отправляет байт для определения скорости (0x7F) и ожидает ACK-байт. Если ACK-байт пришёл, значит МК готов к приёму команд.
R — деактивирует загрузчик и нажимает ресет.
E — посылает команду очистки всей памяти.
W — загружает прошивку в stm32. Сначала вызывается функция очистки памяти — erase_memory() , и если ACK-байт вернулся, то происходит открытие файла, которое тоже проверяется. Далее в бесконечном цикле отправляется команда на запись, потом начальный адрес для записи первого блока (вместе с контрольной суммой адреса), а потом из файла читается блок, создаётся контрольная сумма блока, и это отправляется в stm. Если файл не закончился, то цикл повторяется. При каждом следующем цикле адрес для записи смещается на длину блока. Так повторяется до тех пор пока файл не закончится. Все действия постоянно проверяются на возврат ACK-байта. Если всё прошло успешно, то загрузчик отключается и нажимается ресет, то есть МК переводится в рабочее состояние.
Обязательно укажите — «Нет конца строки».
Если SD-карты нет, то просто поклацайте релюшкой и ресетом с помощью последних трёх команд, или добавьте в код команды для запуска существующей в МК прогрограммы и вывода ID…
Войдите в режим бутлоадера и пошлите символ g или i.
Если же и ардуины нет, то вот то же самое для stm32. В архиве два примера, один с SD-картой, другой без — просто отправка команд. Общение с целевой платой сделано через USART_1, логи и управление через USB. Карта подключается к SPI2. Весь механизм прописан в файле to_stm.c
ESP подключается так же как и ардуина…
С протами вывода здесь всё наоборот, Serial работает с stm, а Serial1 (в ESP у Serial1 есть только TX) печатает логи (они закомментированы).
Всё что касается работы с сетью, взято из стандартного примера FSBrowser , и немного переработано. Код из ардуины полностью перенесён в ESP с той лишь разницей, что управление и загрузка прошивки осуществляется через веб-интерфейс, а вместо SD-карты используется SPIFFS . Про работу с SPIFFS в частности, и про ESP в целом, я подробно писал здесь.
Скачиваем архив и загружаем папку data в ESP как это описано по ссылке выше. В программе вписываем название прошивки, имя своей точки доступа и пароль. Прошиваем ESP и заходим в браузер по аресу esptostm32.local/ …
Загружаем файл прошивки — Обзор ⇨ Upload, ждём когда он появится в левой колонке, жмём Enter boot и при положительном ответе жмём Write. МК прошьётся и перейдёт в обычный режим работы. При последующем обновлении нужно удалить прежний файл правой кнопкой мышки и загрузить новый.
Если в прошивке добавить, перед бесконечным циклом, вывод какой-либо инфы в USART, например так…
… тогда после прошивки это будет выводится в веб-интерфейс, сообщая об успешном обновлении. При дальнейших обновлениях будете изменять версию.
Как вы помните, USART системного загрузчика работает с битом чётности, однако в прошивке учитывать это не нужно, настраивайте как обычно…
… а в функции write_memory() специально для этого сделана переинициализация Serial'а .
С помощью кнопок Reset , On boot и Off boot можно обресетить МК или включить/отключить бутлоадер, но по большому счёту они и не нужны, так, на всякий случай. Кнопка Event вообще ничего не делает (только возвращает «ОК»), мало ли кто-то захочет какую-то функцию прикрутить.
На этом всё.
Всем спасибо
Платы ESP32 весьма популярны в виду низкой цены, неплохой вычислительной мощности (процессор 200МГц), развитого SDK с поддержкой как MicroPython так и Arduino IDE, наличием GPIO c поддержкой периферии (SPI, I2C и пр) и беспроводной связи (WiFi, Bluetooth). Сегодня мы посмотрим, что можно сделать на такой плате ценой всего лишь около 12$.
Мы рассмотрим разные варианты использования WiFi, от простого коннекта к сети до WiFi-сниффера. Для тестов понадобится любая плата с ESP32 (лучше с OLED-экраном, как на картинке) и Arduino IDE.
Для тех кому интересно как это работает, продолжение под катом.
Я не буду писать, как подключить библиотеки ESP32 к Arduino IDE, желающие могут посмотреть здесь. Отмечу лишь, что у данной платы есть особенность — для загрузки кода из Arduino IDE нужно во время заливки нажать и подержать кнопку Boot. В остальном, использование платы ничем не отличается от обычных Arduino.
Теперь приступим к коду. Все примеры кода полностью готовы к использованию, их можно просто скопировать и вставить в Arduino IDE.
1. Подключение к WiFi и получение точного времени
Раз уж на плате есть WiFi, самое простое что мы можем сделать, это подключиться к существующей WiFi-сети. Это общеизвестно, и работало еще на ESP8266. Однако просто так подключиться и ничего не делать неинтересно, покажем как загрузить точное время по NTP. С помощью нижеприведенного кода нашу плату с ESP несложно превратить в настольные (или для гиков 100lvl наручные:) часы.
Код довольно прост, интересно что поддержка NTP уже встроена в стандартные библиотеки, и ничего доустанавливать не нужно. Для работы OLED-экрана нужно установить библиотеку SSD1306.
Переменные ssid и password нужно будет заменить на параметры реальной точки доступа, в остальном, все работает «из коробки».
2. WiFi точка доступа
Разумеется, мы можем не только подключиться к точке доступа, но и создать свою. В данном примере мы запустим мини веб-сервер, открыть который можно например, со смартфона. Отдельно можно отметить обработку события SYSTEM_EVENT_AP_STACONNECTED, что позволяет узнать, сколько клиентов подключалось к нашей точке доступа.
Фото того, как это работает, показано на КДПВ.
При запуске программы на экране будет отображено имя точки доступа и IP-адрес. Подключившись со смартфона к точке доступа, можно в браузере набрать IP и увидеть содержимое web-страницы.
Сервер будет работать и без OLED-экрана, в этом случае отладочную информацию можно смотреть с помощью Serial Monitor в Arduino IDE.
3. WiFi точка доступа с DNS
В исходнике используется класс WebServer, который позволяет сделать код обработки запросов гораздо короче.
4. WiFI Sniffer
Это может пригодиться например, для «умного дома», чтобы узнать когда владелец вернулся домой. Некоторые компании используют MAC-адреса устройств для мониторинга посетителей, чтобы потом показывать им в гугле таргетированную рекламу.
5. WiFi Packet Monitor
Другой пример использования promiscuous mode — графический мониторинг активности канала, также как и в предыдущем случае, подключения к самой сети не требуется.
Исходный код был взят здесь, из него была убрана поддержка записи на SD (на плате её все равно нет) и был исправлен баг с графической библиотекой. Переключать номер канала для мониторинга можно либо нажатием кнопки (на плате её тоже нет:) либо посылкой соответствующего числа через Serial Monitor в Arduino IDE.
Одна плата ESP32 может мониторить только 1 канал, но при дешевизне этих плат вполне можно сделать вот так:
Заключение
Как можно видеть, в плане соотношения возможностей и цены, ESP32 довольно интересны, и в любом случае, намного функциональнее обычных Arduino. Эксперименты с WiFi также довольно занимательны, на плате можно держать не только вполне функционирующий веб-сервер (даже с поддержкой websockets), но и изучить работу WiFi и MAC более детально.
В целом, модули ESP32 интересны тогда, когда возможностей Arduino уже не хватает, а использовать Raspberry Pi с Linux еще избыточно. Кстати, вычислительные возможности ESP32 позволяют использовать даже модуль камеры, так что плату можно использовать в качестве беспроводного видеозвонка или прототипа для домашней системы видеонаблюдения.
Руководство по разработке ESP32 QQ Группа: 824870185, в формате PDF, аккуратный макет.
Цели и задачи обучения
- Освоить рабочий процесс OTA
- Мастер OTA программирования ESP32
Объясните рабочий процесс ОТА
В реальном процессе разработки продукта онлайн-обновление (OTA) может удаленно решить проблемы, возникающие при разработке программного обеспечения продукта, и лучше удовлетворить потребности пользователей.
Обновление OTA (по беспроводной сети) - это процесс загрузки прошивки в модуль ESP с использованием соединения WiFi вместо последовательного порта.
Существует три способа обновления OTA ESP32:
В трех случаях обновления первая загрузка микропрограммы должна быть выполнена через последовательный порт.
Процесс OTA не имеет никакой безопасности и должен гарантировать, что разработчики могут получать обновления только из законных / доверенных источников. После завершения обновления модуль перезапустится и выполнит новый код. Разработчики должны убедиться, что приложения, работающие на модуле, закрыты и перезапущены безопасным способом.
Используемый в настоящее время ESP-WROOM-32 включает 4 МБ SPI Flash. При компиляции программы esp32 через make menuconfig -> PartitionTable вы можете выбрать один из трех разделов: заводская программа (без раздела OTA) / заводская программа (двойной раздел OTA) / определенный пользователем раздел. Как показано ниже:
Конфигурация в menuconfig предназначена только для изменения макроса в файле конфигурации. Фактически, исходный путь конфигурации раздела Flash, соответствующий ESP32 SDK: Раздел Flash настроен.
- Нет OTA-раздела: partitions_singleapp.csv, partitions_singleapp_coredump.csv
- Двойные OTA-разделы: partitions_two_ota.csv, partitions_two_ota_coredump.csv
С двумя OTA-разделами, раздел 4M SPI Flash:
В ESP32 SPI Flash есть (как минимум) четыре раздела, связанных с обновлением:
- Область данных OTA: решите, в какой области запустить приложение
- Область Factory App: на заводе есть приложение по умолчанию
- OTA_0 область: приложение OTA_0
- OTA_1 область: приложение OTA_1
Когда обновление OTA выполняется впервые, демонстрация OTA записывает целевое приложение в раздел OTA_0, а после завершения записи данные раздела данных OTA обновляются и перезапускаются.
Когда система перезагружается, она получает данные раздела данных OTA для расчета и затем решает загрузить приложение раздела OTA_0 (а не приложение раздела Factory App по умолчанию) для осуществления обновления.
Таким же образом, если ESP32 уже запускает приложение в OTA_0 после определенного обновления, OTA Demo записывает целевое приложение в раздел OTA_1 при обновлении в это время. После перезагрузки выполните раздел OTA_1 для обновления. По аналогии, обновленное целевое приложение всегда будет записано в интерактивном режиме между двумя разделами OTA_0 и OTA_1 и не повлияет на встроенное ПО Factory App, как показано ниже.
конфиденциальность
Для получения новой прошивки модуль должен быть подключен к беспроводной сети, что делает его принудительно взломанным и загруженным другим кодом. Чтобы уменьшить вероятность взлома, рассмотрите возможность использования пароля для защиты своих загрузок, выбора определенных портов OTA или шифрования файлов bin.
Читайте также: