Справочник программиста Библиотеки Гид по TFT-дисплеям

WeMos D1 R2 обновление прошивки по WiFi (OTA)

Сегодня мы рассмотрим как сделать обновление прошивки по WIFI на Wemos D1 R2.

WeMos D1 R2 обновление прошивки по WiFi (OTA)

Как-то очень быстро стало не хватать возможностей стандартного Arduino Uno R3 для мелкой домашней автоматизации. Почему-то захотелось подключать собираемые устройства к сети не витой парой, а через Wi-Fi, забрезжила потребность в большем количестве свободных пинов, захотелось иметь возможность использовать PWM и прерываний больше, чем на двух пинах.

Да и памяти в Arduino Uno вдруг оказалось очень мало. Далеко не все пожелания влезают в скромный объем памяти, установленной на плате.

В поисках более интересной и удобной платы, я совершенно случайно наткнулся на нечто? совмещающее в себе почти все, а может быть, даже и все хотелки. Речь далее пойдет о платах для домашней автоматизации и интернета вещей производства WeMos на чипе ESP8266EX.

Немного о ESP8266EX и WeMos

Чип EPS8266 от китайской компании Espressif появился на рынке в 2014 году и сразу же привлек внимание общественности. С одной стороны, EPS8266 — чип максимально интегрировавший обвязку и позволяющий создавать очень простые платы с минимум элементов, да еще и со встроенным современным Wi-Fi. А с другой стороны, стоимость чипа неимоверно низкая (к 2016 году цена опустилась вдвое).

По этой причине множество производителей принялись, с неистощимым энтузиазмом, выпускать новые платы, на основе чипа от Espresiff. Хотя, при мало-мальском умении использовать в своих проектах можно и голый чип ESP8266, благо самая нужная обвязка встроена сразу в него. Что неимоверно удобно.

Espresiff создала свой чип с прицелом на «Интернет вещей», поэтому он обладает весьма скромными размерами, вместительной памятью, способностью к разгону и нескольким режимам энергосбережения. К слову, в ESP8266 реализован даже суперэкономичный режим, в котором устройство потребляет самый мизерный мизер энергии, но при этом не отключается от сети Wi-Fi. У разработчиков открывается невероятная возможность по реализации первоклассных проектов с питанием от батарей.

Несмотря на то что EPS8266 можно использовать как самостоятельное изделие, многие производители наладили выпуск плат совместимых с линейкой Arduino. Что еще больше повысило популярность чипа, но уже среди энтузиастов сделать что-то своими руками да в единичном экземпляре. Возможность использования EPS8266 в Arduino-совместимых проектах стало возможным благодаря характеристикам чипа. Большой объем памяти, и внятная архитектура позволили не только сделать его совместимым с Arduino и NodeMCU , но и с множеством других программно-аппаратных экосистем. Компании и индивидуальные разработчики к настоящему моменту уже навыпускали великое множество прошивок, предназначенных для различных целей. Существуют даже варианты реализации, позволяющие программировать устройство через браузер . Согласитесь, что функционал богатый и устройство нашло широкий отклик среди масс.

Что же до компании WeMos . Получить внятную информацию о самой компании мне так и не удалось. Известно только, что она китайская, продает свою продукцию, в том числе, и через фирменный магазин на AliExpress, зарегистрирована на GitHub в 2014 году, аккурат в момент выпуска описываемого чипа. По слухам, какая-то команда разработчиков, учувствовавшая в другом проекте, организовала WeMos и наладила выпуск плат. Но какого-либо подтверждения я так найти и не смог. В общем — полная анонимность J, даже номера телефона на сайте нет.

Кстати, многие называют чип EPS8266 именно так, но в спецификации он обзывается как EPS8266EX. Два это разные чипа или просто называются безалаберно непонятно. Ни поиск по форумам, ни чтение спецификаций производителя, не помогли мне разобраться в этом вопросе. Посему будем считать, что оба названия обозначают одно и то же.

В моем распоряжении оказалась плата WeMos D1 R2. Приведу ее некоторые характеристики:

  • 80 MHz 32-bit процессор Tensilica Xtensa L106 . Возможен негарантированный разгон до 160 МГц.
  • IEEE 802.11 b/g/n Wi-Fi. Поддерживается WEPи WPA/WPA
  • 16 портов ввода/вывода, SPI, I2 C, I2 S, UART, 10-bit АЦП.
  • Питание 3,0–3,6 В. Среднее потребление 80 мА. Потребление до 170 мА в режиме передачи, 60 мА в режиме приема, пиковое потребление возможно до 500 мА. Присутствует режим пониженного потребления с сохранением соединения с точкой доступа ~1 мА.
  • Установлена Flash память объемом 4 Мб.

Дополнительно необходимо заметить, что сам чип работает при температурах от -40С и до +125С, что соответствуют лучшим технологическим стандартам. Хотя, я лично сомневаюсь, что готовая плата будет работать при температуре в 125 градусов, ведь все остальные элементы обвязки тоже нужно подбирать под столь высокие температурные стандарты, а на такой подвиг согласятся далеко не все производители.

Устанавливаем ПО для работы с WeMos на ПК под управлением Win10

Напомню, что чип EPS8266 способен работать одинаково хорошо с различными типами прошивок, в том числе и с Arduino. И именно под Arduino с его Arduino IDE я и попробую провернуть фокус, при котором плата WeMos D1 R2 будет подключаться к моей Wi-Fi сети, а я смогу обновлять прошивку без подключения платы к компьютеру шнурком и прямо из Arduino IDE. Все это под Windows 10 x64.

  1. Для начала необходимо установить более-менее современную версию Arduino IDE. Нужна версия не ниже 1.6.4.
  2. Устанавливаем Git (клиентское приложение для работы с онлайн-репозиторием контроля версий исходного кода) https://git-scm.com/download/win .
  3. Устанавливаем Python (среда для скриптового языка Python). Нужна версия из бранча 2.7 https://www.python.org/downloads/ . С более свежей, 3-й веткой, работать, скорее всего, не будет.

При установке Python, стоит установить галочку, чтобы исполняемые файлы прописались в путь поиска. Иначе сию операцию придется делать вручную. А мало кто помнит, как это делается.

4. Скачиваем и устанавливаем драйвер по статье на нашем сайте.

Я не пробовал запускать плату без драйвера для обновления OTA. Без драйвера, но с установленными описаниями Arduino IDE видит плату и может загружать в плату новые прошивки. Возможно, что драйвер нужен как раз для беспроводного обновления.

5. Устанавливаем утилиты для компиляции исходных кодов для EPS8266 и описания платы для Arduino IDE. Важно установить все это в нужную директорию. Установка осуществляется путем вызова git clone https://github.com/esp8266/Arduino.git esp8266 в созданной директории esp8266com. Если git у вас не запускается их командной строки, то стоит проверить переменную path и попробовать перезайти в терминал.

Правильный путь установки в директорию туда, куда установлена Arduino IDE. Например, C:\Program Files (x86)\Arduino\hardware\esp8266com\

Переходим в созданную поддиректорию tools. И в этой директории запускаем python get.py и все необходимые компоненты автоматически скачиваются в директорию esp8266.

6. Скачиваем примеры с сервера GitHub командой git clone https://github.com/wemos/D1_mini_Examples.git

Директорию для закачки примеров необходимо выбирать ту, где сами примеры и располагаются на вашем ПК. В моем случае, это оказалась директория в папке OneDrive.

7. После установки примеров перезаходим в Arduino IDE или просто его запускаем, открываем любой из примеров для WeMos, например, Hello World, выбираем требуемые параметры настройки платы через меню Tools Arduino IDE. Здесь выбираем плату WeMos D1 и запускаем его на исполнение.

Прошу обратить внимание на то, что WeMos D1 R2 хоть и Arduino совместимая плата, но ожидать, что на ней будут нормально работать любые скетчи от Arduino не стоит. Как минимум впаянный светодиод тут привязан к совсем другому пину, нежели на платах Arduino, например, на Arduino UNO R3.

Еще одна особенность при работе с D1 и другими платами от WeMos, а скорее всего от всех реализованных на ESP8266 — вывод в терминал может осуществляться с мусором либо постоянно, либо при начале отображения. Иногда все начинает работать само по себе, иногда требуется поиграть со скоростями последовательного порта (в окне терминала и в скетче), дабы подобрать скорость, которая будет работать именно у вас.

Собственно, на этом настойка подключения WeMos платы к Arduino IDE завершена. Если что-то не работает или работает как-то не так, необходимо попробовать пройти все шаги еще раз, внимательно относясь к каждому из них.

Обновления Over The Air (OTA) для WeMos D1 R2

А теперь подбираемся к самому интересному. К тому, как обновлять прошивку у устройства по воздуху используя соединение Wi-Fi. Итак, у нас есть рабочая Arduino IDE с возможностью использования плат WeMos и чипов ESP8266.

В обновлении по воздуху нет ничего сверхъестественного. В модуль загружается скетч, который подключается к Wi-Fi сети и в цикле loop, при помощи функции, слушает на определенном порту сигналы от удаленного загрузчика. Как только поступает требуемый сигнал, то в память устройства закачивается свежая прошивка, которая и загружается после рестарта.

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

Для того чтобы настроить загрузку прошивок OTA, необходимо открыть скетч BasicOTA из примеров для Arduino от WeMos.

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

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();
  }

  // Port defaults to 8266
  // ArduinoOTA.setPort(8266);

  // Hostname defaults to esp8266-[ChipID]
  // ArduinoOTA.setHostname("myesp8266");

  // No authentication by default
  // ArduinoOTA.setPassword("admin");

  // Password can be set with it's md5 value as well
  // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
  // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");

  ArduinoOTA.onStart([]() {
    String type;
    if (ArduinoOTA.getCommand() == U_FLASH)
      type = "sketch";
    else // U_SPIFFS
      type = "filesystem";

    // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using 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();
}

Затем настроить параметры для подключения к сети Wi-Fi, а именно имя сети и пароль доступа. Далее, загружаем скетч в устройство, отключаем его от компьютера и подключаем к внешнему источнику питания. После того как устройство с прошивкой загрузится и подключится к вашей Wi-Fi сети, то оно появится в виде сетевого устройства в меню выбора портов для взаимодействия с устройством. Дополнительно можно настроить такие параметры, как пароль доступа к устройству для обновления, номер порта и прочее.

Ну и собственно все. В дальнейшем можно встроить функциональность OTA в ваш код или же нарастить свой код используя BasicOTA как материнский контейнер. Обновление по воздуху будет работать в том случае, если будет вызываться соответствующий метод ArduinoOTA в цикле loop. Если ваша прошивка слишком сложная, содержит длительные циклы или занята какими-то сложными расчетами, то есть риск того, что обновление не будет подхватываться с первого раза. Поэтому стоит соблюдать баланс интересов в вашей прошивке.

Некоторые особенности

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

Первое, что нужно уяснить, так это то, что WeMos работает с напряжением 3.3 Вольта, а большинство полноформатных плат Arduino с напряжением 5 вольт. И даже если на плате есть выход 5 вольт, то использовать это напряжение стоит с осторожностью.

Цифровые входы платы выдают напряжение в диапазоне от 1.8 и до 3.3 Вольта с пиковым током до 200 мА. Единственный аналоговый вход способен работать с напряжением в диапазоне от 3.0 и до 3.6 вольт. Возможно, что в ваших проектах потребуется согласование напряжений.

Отличается плата WeMos D1 R2 от аналога Arduino и по языку программирования, вернее, набором функций и прочими тонкостями. Например, описание пинов задаются не просто номерами, а с четким указанием цифровой это пин или нет. Так пин с номером 1 обозначается как D1.

На текущий момент (конец лета 2016) функция Serial Monitor для OTA пока не реализована в IDE. По этой причине рекомендуется использовать внешний терминал и подключить его к соответствующему сетевому порту.

Оригинал статьи - http://blog.kvv213.com/2016/09/wemos-d1-r2-ustanovka-v-sisteme-i-obnovlenie-proshivki-po-vozduhu-ota/

28.05.2017 | Публикации | Теги статьи |
Ардуино+