Посмотр рубрик

О ESP8266/ESP32, начало работы

В данном разделе уроков рассмотрим работу с МК ESP8266 и ESP32 под Arduino фреймворком и использование их сетевых возможностей.

Подразумевается, что читатель уже ознакомился с базовыми уроками C/C++ и Arduino, умеет работать в Arduino IDE или PlatformIO и использовать стандартные инструменты языка и фреймворка

ESP - семейство МК, точнее SoC, от китайского производителя Espressif. Это мощные контроллеры с большим количеством оперативной памяти, внешней Flash, радиосвязью на борту, а самое главное - очень дешёвые. Это позволяет делать сложные многофункциональные устройства с сетевыми возможностями буквально на базе одного чипа. Многие модели поддерживаются Arduino-фреймворком и MicroPython, но набор возможностей, API и поддержка конкретных сред заметно отличаются между семействами.

  • ESP8266 - младшая версия, изначально скорее всего была задумана как UART WiFi модем и продавалась с закрытой заводской прошивкой. Позже SDK был выложен в открытый доступ и энтузиасты сделали полноценное ядро для Arduino. Имеет некоторые особенности и урезанную периферию. Китайцы сделали много разных плат на его основе, но отличаются они по сути размером и количеством выведенных пинов. Подробнее о возможностях и платах на его основе - в этом уроке
  • ESP32 - современное семейство полноценных контроллеров с большим количеством модификаций. Разные чипы могут иметь Bluetooth, BLE, IEEE 802.15.4 для Zigbee/Thread, аппаратное шифрование, ЦАП, touch-контроллер, USB-контроллер, второе ядро и различные ускорители. Полного набора сразу нет ни у одной модели, поэтому чип нужно выбирать под задачу. Сравнить модели можно в официальной табличке
ESP8266 ESP32 ESP32-S2 ESP32-S3 ESP32-C3 ESP32-C6
Год выпуска 2014 2016 2019 2020 2020 2021
Процессор Tensilica L106 80/160MHz Tensilica LX6 240MHz, 2 ядра Tensilica LX7 240MHz Tensilica LX7 240MHz, 2 ядра RISC-V 160MHz RISC-V 160MHz
Bluetooth X Classic / BLE 4.2 X BLE 5.0 BLE 5.0 BLE 5.0
SRAM 160KB (доступно ~50KB) 520KB 320KB 512KB 400KB 400KB
Шифрование Flash X XTS-AES-128/256 XTS-AES-128 XTS-AES-128
SPI 2 4 4 4 3 3
I2C 1 2 2 2 1 2
I2S 1 2 1 2 1 1
UART 2 3 2 3 2 3
GPIO 17 (доступно 11) 34 43 44 22 22
LED PWM 0 16 8 8 6 6
MCPWM 0 2 0 2 0 1
USB X X OTG FS/Serial OTG FS Serial Serial
ADC 1x 10-bit 18x 12-bit 20x 13-bit 20x 12-bit 6x 12-bit 7x 12-bit
DAC X 2x 8-bit 2x 8-bit X X X
Touch 0 10 14 14 X X
  • Все перечисленные в таблице процессоры 32-битные и имеют WiFi
  • LED PWM - аппаратный генератор ШИМ на любых пинах (у ESP8266 программный ШИМ на любых пинах)
  • MCPWM - специальный блок для управления моторами, 6 пинов на 1 блок
  • USB - имеется в виду аппаратный USB, т.е. напрямую в МК с имитацией Serial или USB-флешки

Документация #

Возможности радио #

Радио-модуль в ESP может работать в нескольких режимах, рассмотрим их и какие возможности они дают:

  • WiFi STA (Station) - ESP подключается к точке доступа: домашний роутер, смартфон со включенной точкой доступа или другая ESP в режиме AP и может общаться с участниками сети, включая точку доступа - например управляться с них или управлять ими. Если точка доступа имеет выход в Интернет, то ESP может делать запросы на удалённые серверы (заходить на сайты, проверять почту, работать с API, получать прогноз погоды или хостить Телеграм-бота), а также просто "управляться" с любого другого устройства из любой точки мира (через VPN или MQTT) или быть частью умного дома - IoT

  • WiFi AP (Access Point) - ESP сама работает как точка доступа, к которой могут подключаться другие устройства. Максимальное количество клиентов зависит от чипа, версии SDK и настроек. ESP создаёт локальную сеть: можно, например, подключиться к ней со смартфона и открыть интерфейс управления

  • WiFi AP+STA - работают одновременно оба режима, т.е. ESP может быть подключена к роутеру и в то же время к ней может быть подключен смартфон. Также в этом режиме можно сделать большую многоуровневую сеть на ESP

  • ESP-NOW - протокол Espressif для прямого обмена небольшими пакетами поверх служебных кадров WiFi без точки доступа. Позволяет сделать радиоуправление, сеть датчиков или свой вариант mesh-сети. Дальность сильно зависит от антенны, выбранного PHY-режима, помех и условий, но в среднем сильно дальнобойнее Wi-Fi: до 1 км в идеальных условиях, до 400 м со стандартной антенной на прямой видимости и до 50 м в помещении. ESP-NOW может работать одновременно с обычным WiFi, но все участники должны использовать совместимый радиоканал, а совместная работа накладывает ограничения

Что купить? #

Для знакомства с сетевыми возможностями и создания первых IoT проектов рекомендую плату Wemos mini (ESP8266) по ряду причин:

  • Дешёвая
  • Компактная, но удобна для работы на макетке
  • Меньший вес прошивки, загружается быстро (по сравнению с ESP32)
  • Быстрая компиляция даже в Arduino IDE (по сравнению с ESP32)
  • Стабильный API Arduino (по сравнению с ESP32, где постоянно что-то меняют и ломают)
  • Есть отдельный урок про неё
В наборе GyverKIT Aliexpress
START
IOT
EXTRA
Купить

Продвинутым юзерам гораздо интереснее будет попробовать ESP32 - она из коробки работает на FreeRTOS, имеет полноценную документацию на свой SDK и комфортно программируется без Arduino фреймворка, т.е. "напрямую". Также МК гораздо более мощный и может работать с камерой, а это целый пласт интересных применений и проектов. На сайте есть урок о популярной плате ESP32 с камерой.

Начало работы #

Поддержка плат настраивается точно так же, как у любых других Arduino-совместимых плат:

  • Arduino IDE - ссылка для менеджера плат:
    • ESP8266: https://arduino.esp8266.com/stable/package_esp8266com_index.json, в менеджере esp8266 by ESP8266 Community. Для платы Wemos mini выбрать в менеджере плат LOLIN(WEMOS) D1 R2 & mini
    • ESP32: https://espressif.github.io/arduino-esp32/package_esp32_index.json, в менеджере esp32 by Espressif Systems. Какую плату выбирать - см. описание конкретной платы
  • PlatformIO - конфиг:
    • ESP8266 (на примере Wemos mini)
      [env:d1_mini]
      platform = espressif8266
      board = d1_mini
      framework = arduino
      monitor_speed = 115200
      upload_speed = 921600
      monitor_filters = esp8266_exception_decoder, default
      build_type = debug
      board_build.filesystem = littlefs
    • ESP32 (на примере стандартной ESP32 dev board)
      [env:esp32dev]
      platform = espressif32
      board = esp32dev
      framework = arduino
      monitor_speed = 115200
      monitor_filters = esp32_exception_decoder
      board_build.filesystem = littlefs
      board_build.f_cpu = 240000000L

На момент написания урока поддержка ESP32 в PlatformIO остановилась на последней версии 2.0.17, тогда как официальная версия уже давно 3.x. За что PlatformIO обиделась на Espressif можно почитать здесь, а если вам нужна актуальная версия ядра ESP32 в PIO - используйте форк pioarduino, для этого достаточно прописать в конфиге platform = https://github.com/pioarduino/platform-espressif32/releases/download/stable/platform-espressif32.zip вместо platform = espressif32

Для работы Arduino ядра ESP32 выше v2 нужна как минимум Windows 10 64-bit. Для работы на 32-bit и/или Windows 7 нужна версия v1.0.6 и Python 3.8.x, но это очень старая версия с большим количеством проблем и отличий от актуальной

Особенности #

Компиляция #

Arduino IDE имеет особенность - она компилирует весь проект заново каждый раз. Ядро ESP довольно тяжёлое, поэтому компилируется очень долго, особенно на слабых компьютерах. Для работы с ESP рекомендуется освоить работу в VS Code + PlatformIO - компиляция проходит многократно быстрее, да и в целом писать код там гораздо удобнее.

Загрузка прошивки #

У ESP8266, классического ESP32 и многих плат на их основе есть два основных режима запуска, которые выбираются состоянием загрузочных пинов во время сброса. Для этих семейств главную роль играет GPIO0:

  • Download (GND) - режим загрузки прошивки по UART
  • Boot или Flash (VCC) - запуск прошивки из Flash памяти

На отладочных платах пин подтянут к VCC, чтобы МК по умолчанию запускался в режиме Boot. USB-преобразователь на плате обычно сам переводит МК в режим Download перед загрузкой прошивки, но на некоторых платах это работает плохо или не работает вовсе, поэтому обычно на ESP-платах выведены две кнопки - Reset и IO0, подключенные вторым контактом к GND. Кнопка IO0 может называться Flash или Boot: сама по себе она только прижимает загрузочный пин к GND, а режим Download выбирается при сбросе или включении питания.

Для ручного перевода платы в режим загрузки нужно зажать IO0, кликнуть по Reset и отпустить IO0, после этого можно загружать прошивку. Также если автоматический запуск в режиме загрузки прошивки не работает, может помочь просто зажатие IO0 после запуска процесса загрузки прошивки на компьютере.

Инфо о старте #

При запуске ROM и загрузчик могут отправлять в UART0 информацию о причине перезагрузки и загрузке. У ESP8266 ROM-лог идёт на необычной скорости 74880 бод, а у классического ESP32 обычно на 115200. У других семейств скорость и даже интерфейс вывода могут отличаться. Если скорость монитора не совпадает, в начале будет виден набор непонятных символов:

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

Exception #

ESP8266 и ESP32 умеют обрабатывать исключения (exception) - это критические ошибки в работе программы, после которых МК перезагружается, но прямо перед этим отправляет в Serial (на текущей скорости) информацию о причине сбоя. Вывод обрамлён ------ и выглядит как заголовок, после которого идёт набор шестнадцатеричных адресов и служебных значений:

В таком виде он ни о чём не скажет - его нужно расшифровать. Для этого на компьютере нужен бинарник той же самой прошивки, которая сейчас запущена на МК.

Arduino IDE #

В Arduino IDE 1.8 это можно сделать при помощи плагина EspExceptionDecoder. Со страницы релизов нужно скачать версию и распаковать в рабочую папку Arduino (по умолчанию Документы/Arduino) в подпапку tools (если её нет - надо создать). Arduino IDE 2 старые Java-плагины из папки tools не поддерживает, поэтому для неё нужен отдельный внешний декодер или другой подход:

После перезапуска Arduino IDE в меню Инструменты должен появиться пункт EspExceptionDecoder. Запускать его нужно, когда выбрана соответствующая плата и программа скомпилирована. Текст исключения нужно вставить в декодер:

При возникновении ошибки ERROR: xtensa-lx106-elf-gdb.exe not found! во время запуска декодера нужно полностью переустановить ядро ESP8266 с удалением остатков из папки Arduino15

PlatformIO #

Здесь всё проще - достаточно включить фильтр монитора в platformio.ini, как в примере конфига выше (строка monitor_filters = esp32_exception_decoder для esp32). Теперь монитор порта будет сам декодировать исключения:

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

Сборка схем #

При подключении компонентов к ESP нужно помнить о некоторых вещах.

Системные пины #

Не все пины на плате можно использовать свободно - некоторые отвечают за системные функции, к некоторым подключена память и трогать их нельзя, а некоторые должны иметь конкретный логический уровень на момент запуска МК. Эти особенности должны быть указаны в описании платы. Например, нагрузка, удерживающая IO0 в низком уровне во время сброса, помешает обычному запуску прошивки.

Логический уровень #

ESP имеет логический уровень 3.3 V. Многие модули и датчики умеют питаться от 3.3 V, но это нужно проверять по их документации: модуль, рассчитанный на 5 V, не обязан корректно работать от меньшего напряжения. Если компонент допускает 3.3 V и по питанию, и по логическим уровням, совместное питание от 3.3 V обычно является самым простым вариантом:

Если у внешнего компонента логический уровень именно 5 V, то нужно посмотреть, что делают его пины:

  • Если пин передаёт данные на ESP (выход с датчика, TX UART, MISO SPI) - сигнал 5 V нельзя подавать напрямую. Нужен делитель напряжения или подходящий преобразователь логических уровней. Защитные диоды не превращают вход в 5-вольт-толерантный и не предназначены для постоянного ограничения такого сигнала

  • Если пин принимает данные с ESP (вход датчика, RX UART, MOSI SPI), то нужно смотреть документацию на компонент - будет ли он считать 3.3 V высоким сигналом. Если нет, нужен преобразователь уровня или питание компонента от допустимого более низкого напряжения. Случайный диод в питании не является универсальным преобразователем уровней

Питание #

ESP - довольно прожорливый МК, особенно при включенном WiFi: короткие пики потребления могут быть заметно выше среднего. Источник и стабилизатор нужно выбирать по документации конкретного чипа или платы, обычно с запасом хотя бы до 500 мА. Допустимое напряжение на входе платы тоже зависит от её схемы - нельзя считать, что любую ESP-плату можно безопасно питать от 7 V, и тем более не стоит подавать 12-15 V без явного разрешения производителя.

Полезные страницы #


(11 голосов)
Подписаться
Уведомить о
guest

6 комментариев
Старые
Новые Популярные
Прокрутить вверх