Знакомство с недорогим и функциональным микроконтроллером ESP8266: прошивка и пример использования

Обзор микроконтроллера ESP8266

ESP8266 — китайский микроконтроллер (далее МК) от производителя Espressif с поддержкой WiFi-интерфейса. Управлять всем этим можно не только с браузера, но и из приложений на Android/iOS/Desktop. Если МК будет применяться там, куда не достаёт WiFi-сеть, то ESP8266 может работать в режиме точки доступа.

Примечание В этой статье не будут рассмотрены практические примеры применения ESP8266. Речь пойдёт об основных преимуществах и возможностях этого МК.

Содержание:

    1. Разновидности МК серии ESP и их плат
    2. Характеристики
    3. Как работать с микроконтроллером ESP8266?
    4. Прошивка
    5. В чём прошивается?
    6. Основы
    7. Распределение памяти

Микроконтроллер ESP8266 работает с внешней flash-памятью по интерфейсу SPI. Её объём варьируется от 512 Кбайт до 4 Мбайт. При желании и умении микросхему памяти можно будет перепаять на версию до 32 Мбайт.

Разновидности МК серии ESP и их плат

Существует около полутора десятка версий МК серии ESP и огромное количество плат с ними. Рассмотрим самые популярные из них.

Микроконтроллеры ESP8266

ESP-01

Микроконтроллер ESP8266 версия ESP-01

Микроконтроллер ESP-01. Источник

  •  Имеет 8 разведённых контактов (VCC, GND, UTXD, URXD, CH_PD, GPIO0, GPIO2, GPIO6) и PCB-антенну (печатный проводник на самой плате).
  • Из разведённых выводов тут присутствуют только 3 GPIO, но не стоит видеть в этом одни минусы. Если нужно будет управлять одним реле или получать данные с датчика температуры, вам не понадобятся все выводы МК, достаточно будет лишь пары. К тому же, существуют платы и шилды с возможностью простой коммутации именно к этой версии МК. Например такая:
Плата WiFi-реле для микроконтроллера ESP8266

Плата WiFi-реле. Источник

ESP-03

Плата ESP-03

Плата ESP-03. Источник

  • Здесь появляется керамическая антенна. Она считается немного эффективней своего печатного собрата.
  • Также на плате разведены все доступные выводы GPIO. В этой статье описана разница между типами антенн для микроконтроллеров ESP8266.

ESP-07

Плата ESP-07

Плата ESP-07. Источник

  • В этой версии в глаза сразу бросается металлический экран (который перед этим появляется на ESP-06).
  • На борту керамическая антенна и разъём для внешней антенны.

ESP-12

Разные варианты микроконтроллера ESP-12

Разные варианты микроконтроллера ESP-12. Источник

В свою очередь, существует несколько вариантов этой версии: ESP-12S, ESP-12F, ESP-12E. Вторая и третья версии имеют на торце дополнительно 6 разведённых контактов.

Платы

WeMos D1 mini

Плата WeMos D1 mini

Плата WeMos D1 mini. Источник

  • Имеет распайку девяти GPIO-контактов.
  • На плате имеется небезызвестный мост CH34x (такие часто ставят на клоны Arduino).
  • Установлен МК с 4 Мбайт flash-памяти.
  • Недостаток для некоторых — придётся самому паять контакты на плату (идут в комплекте).
  • Конструкционно совместима с различными выпускаемыми шилдами реле/датчиками.

NodeMCU v0.9/v1

Плата NodeMCU v0.9

Плата NodeMCU v0.9. Источник

Первое поколение плат серии NodeMCU. На ней распаяны все 11 GPIO-портов. Некоторые из них обладают дополнительными функциями (UART, I2C, SPI, PWM, ADC). Хотя на плате впаяны контакты, она занимает всю ширину беспаечной макетной платы, что затрудняет работу на ней. МК имеет 4 Мбайт flash-памяти. Также имеется мост CH340.

NodeMCU v3

Плата NodeMCU v3

Плата NodeMCU v3. Источник

Финальная версия платы этой серии. Существует и v2 «Amica», которая меньше по габаритам. v3 носит название «LoLin» и отличается от предыдущей версии только размерами и незначительными деталями (например дополнительной распайкой шины питания). Кроме традиционного моста CH340/CH341 на платы ставят чип CP2102, так что внимательней с выбором драйвера на них.

Характеристики

Все эти (и не только эти) платы выполнены на чипсете микроконтроллера ESP8266EX, а следовательно, характеристики у них одинаковые:

  • Протоколы: 802.11 b/g/n/e/i.
  • Диапазон частот: 2.4 ГГц – 2.5 ГГц.
  • Процессорное ядро: Tensilica L106 32 разряда.
  • Диапазон напряжений питания: 2.5 В – 3.6 В.
  • Среднее потребление тока: 80 мA.
  • Режимы WiFi: Station/SoftAP/SoftAP+Station.
  • Безопасность: WPA/WPA2.
  • Шифрование: WEP/TKIP/AES.
  • Обновление прошивки: через UART, по радиоканалу (OTA — Other The Air).
  • Сетевые протоколы: IPv4, TCP/UDP/HTTP/FTP.
  • Поддержка WiFi Direct (P2P), P2P Discovery, P2P GO (Group Owner) mode, GC (Group Client) mode, P2P Power Management.
  • Встроенные аппаратные ускорители: CCMP (CBC-MAC, режим счётчика), TKIP (MIC, RC4), WAPI (SMS4), WEP (RC4), CRC.
  • Поддержка LUA-скриптов.

Как работать с микроконтроллером ESP8266?

Есть два способа работы с ним:

  • управление через AT-команды и автономная работа со своей прошивкой. В первом случае ESP8266 работает только в паре с другими МК, во втором — может работать независимо (хотя никто не запрещает присоединить её к другому МК).
  • «Из коробки» МК поставляется с прошивкой для работы через AT-команды. Для этого ESP8266 подключается к любому другому МК по UART-интерфейсу. Для демонстрации работы AT-команд ESP8266 можно подключить к компьютеру через USB-UART переходник и запустить монитор последовательного порта (например из Arduino IDE). Про то, как работать с этими командами, можно прочитать в этой статье.

Прошивка

В большинстве случаев намного удобней прошивать МК и работать с ним со своей прошивкой. Однако тут тоже есть свои нюансы. Вот 3 варианта событий:

  • У вас «голый» ESP8266, например ESP-01. Вам потребуется USB-UART переходник, который нужно подключить к МК. Этот переходник обязательно должен быть на 3-вольтовой логике, т. к. иначе можно легко отправить ваш МК в кибер-Вальхаллу. Про процесс подключения можно прочитать здесь.
  • Второй случай идентичен первому, кроме того, что вместо переходника можно использовать любую плату Arduino. Достаточно специальным образом подключить ESP8266 к UART-контактам Arduino, а её саму «отключить», замкнув контакт аппаратного сброса (RESET) на землю. Естественно, питать ESP8266 нужно будет от шины питания 3.3 В. В этом случае в качестве переходника USB-UART будет выступать мост (чаще всего CH340) на самой плате Arduino. Этот процесс также описан в статье выше.
  • Лучший вариант — это плата с USB-UART мостом на борту (как NodeMCU, WeMos и прочие). В этом случае ничего дополнительного делать не нужно — просто подключайте плату через USB.

В чём прошивается?

Например NodeMCU Flasher (которая подходит не только для плат NodeMCU) или ESPTool (необходим Python).

Однако в этой статье работа с МК и процесс прошивки будут рассмотрены в Arduino IDE.

Изначально среда Arduino IDE не предназначена для работы с МК серии ESP. Чтобы это исправить, идём в Файл → Настройки и в поле Дополнительные ссылки для Менеджера плат вставляем эту ссылку:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

Потом открываем Инструменты → Плата → Менеджер плат и в открывшемся списке в самом низу находим плату «esp8266 by ESP8266 Community» (если с этим возникли трудности — используем поиск вверху окна). Устанавливаем последнюю версию платы (около 150 Мбайт).

После установки в списке плат появится немалое количество плат. Если не нашли свою плату или не знаете её названия — выбирайте Generic ESP8266 Module. Теперь можно выбрать свой МК в списке COM-портов.

У ESP8266 две скорости передачи: основная — её вы указываете при инициализации последовательного порта, и скорость, на которой передаётся отладочная информация. Она передаётся сразу после подачи питания на МК. Обычно это скорости 115200 бод и 74800 бод 0 соответственно.

Основы

Если вы не владеете базовыми знаниями работы с платформой Arduino, наверстать упущенное можно в нашей статье про основы использования Arduino.

После скачивания платы ESP8266 с помощью менеджера, в примерах появится большое количество скетчей. Рассмотрим один из них (Файл → Примеры → ESP8266WebServer → HelloServer):

#include <ESP8266WiFi.h> 
#include <WiFiClient.h> 
#include <ESP8266WebServer.h> 

const char* ssid = "........"; // Указываем имя существующей точки доступа
const char* password = "........"; // Указываем пароль существующей точки доступа

ESP8266WebServer server(80);

void handleRoot() { // Обработчик запроса клиента по корневому адресу
  // Отправляем клиенту
  server.send(200, "text/plain", "Привет от ESP8266!");
}

void handleNotFound() { // Обрабатываем небезызвестную ошибку 404
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
}

void setup(void) {
  Serial.begin(115200);

  WiFi.mode(WIFI_STA); // Устанавливаем Wi-Fi модуль в режим клиента (STA)
  WiFi.begin(ssid, password); // Устанавливаем ssid и пароль от сети, подключаемся
  
  while (WiFi.status() != WL_CONNECTED) { // Ожидаем подключения к Wi-Fi
    delay(500);
    Serial.print(".");
  }
  
  // Выводим информацию о подключении
  Serial.println("");
  Serial.print("Подключено к ");
  Serial.println(ssid);
  Serial.print("IP адрес: ");
  Serial.println(WiFi.localIP());

  // Устанавливаем обработчики. Можно сделать двумя способами:
  server.on("/", handleRoot);

  server.on("/inline", []() {
    server.send(200, "text/plain", "Отличная работа!");
  });

  server.onNotFound(handleNotFound); // Вызывается, когда обработчик не назначен

  // Запускаем сервер
  server.begin();
  Serial.println("HTTP-сервер запущен");
}

void loop(void) {
  server.handleClient();
}

Что делает этот скетч? МК подключается к вашей WiFi-сети и запускает сервер. В монитор последовательного порта выведется локальный IP-адрес (к примеру, 192.168.0.105). Вбиваем этот IP в адресную строку браузера, после чего в нём должна отобразиться строка «Привет от ESP8266!». Таким же образом можно проверить адрес /inline.

Ознакомиться с API МК можно в их официальном репозитории.

Распределение памяти

Внешняя память распределена на следующие разделы:

  • скетчи (память для прошивки);
  • файловая система SPIFFS;
  • OTA-Update (прошивка, переданная «по воздуху»);
  • EEPROM (да-да, её у МК тоже нет, поэтому она имитируется на flash-памяти);
  • конфигурация WiFi.

Файловая система SPIFFS

Один из плюсов внешней flash-памяти — файловая система. В неё можно с лёгкостью записать файлы (веб-странички, медиа-файлы и прочее) на микроконтроллеры ESP8266. На аппаратном уровне это можно было бы реализовать подключив к МК модуль SD-карт. Однако это решение требует свободных портов.

Размер файловой системы (от 32 Кбайт до 15 Мбайт) зависит от самого объема flash-памяти и от конфигурации, выставленной в Инстурменты → Flash size. Например, конфигурация 4M (2M SPIFFS) предназначена для МК с общим объёмом flash-памяти 4 Мбайт, 2 Мбайт из которых будут выделены под файловую систему.

SPIFFS не работает с папками — она содержит только список файлов. Соответственно, если загрузить в неё папку style, в которой будет файл header.css, то в файловую систему систему запишется файл с именем /style/header.css. Об этом стоит помнить, потому что длина файлового имени не должна превышать 31 символ (читается 32, но символ с кодом 0 отведён под завершение строки).

Для загрузки файлов потребуется инструмент ESP8266FS, интегрирующийся в Arduino IDE. Инструкция по установке:

  1. Качаем инструмент по ссылке выше.
  2. В папке Arduino IDE создайте папку tools (если её там ещё нет).
  3. В папку tools распакуйте скачанный архив. Должно быть так:
    …/Arduino/tools/ESP8266FS/tool/esp8266fs.jar.
  4. После запуска среды в папке скетча (Скетч → Показать папку скетча) нужно создать папку data. Её содержимое будет загружаться в файловую систему.
  5. После кликаем в Инструменты → ESP8266 Sketch Data Upload, чтобы загрузить данные в файловую систему. После загрузки в панели статуса высветится «SPIFFS Image Uploaded». Перед процессом загрузки в файловую систему обратите внимание: если открыт монитор последовательного порта — закрываем его.

Как работать с SPIFFS и файлами в ней, можно узнать в этой статье.

Энергонезависимая память EEPROM

Работа с внешней памятью немного отличается от стандартной.

  • Перед считыванием или записью данных нужно инициализировать EEPROM, указав при этом выделяемую под неё память (от 4 до 4096 байт) функцией EEPROM.begin(size).
  • Привычная функция EEPROM.write(addr, value) записывает данные не на саму энергонезависимую память, а в оперативную.
  • Чтобы внесённые данные записались в память, нужна функция EEPROM.commit() (или же EEPROM.end(), чтобы заодно очистить данные из оперативной памяти).
  • Метод EEPROM.read(addr) возвращает байт из памяти по адресу.

Прошивка «по воздуху» OTA-Update

Для этого вам потребуется установленный Python.

В скетч нужно добавить файл: #include <ArduinoOTA.h>. Инициализируем и настраиваем OTA следующими строками:

ArduinoOTA.setHostname("Host-ESP");// Имя хоста
ArduinoOTA.setPassword((const char *)"password");// Пароль для подключения к хосту. Если не нужен — комментируем эту строку
ArduinoOTA.begin();// Инициализация

После этого достаточно в метод loop() добавить строку: ArduinoOTA.handle().

Прошиваем МК по проводу. В случае успешной загрузки в списке портов появится новый хост с именем «esp8266-xxxxxx», где esp8266 — указанное выше имя хоста, а xxxxxx — локальный IP-адрес МК. Выбираем его.

Теперь микроконтроллер ESP8266 можно прошивать «по воздуху».

Хинт для программистов: если зарегистрируетесь на соревнования Huawei Cup, то бесплатно получите доступ к онлайн-школе для участников. Можно прокачаться по разным навыкам и выиграть призы в самом соревновании.

Перейти к регистрации