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

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

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

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

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

  • ESP8266 - младшая версия, изначально скорее всего была задумана как UART WiFi модем и продавалась с закрытой заводской прошивкой. Позже SDK был выложен в открытый доступ и энтузиасты сделали полноценное ядро для Arduino. Имеет некоторые особенности и урезанную периферию. Китайцы сделали много разных плат на его основе, но отличаются они по сути размером и количеством выведенных пинов. Подробнее о возможностях и платах на его основе - в этом уроке
  • ESP32 - современное семейство полноценных контроллеров, насчитывает более 10 модификаций и по несколько плат с каждой. Они по всем параметрам лучше ESP8266, а также имеют дополнительные аппаратные блоки, например Bluetooth, BLE, ZigBee, аппаратное шифрование, ЦАП, touch-контроллер, USB-контроллер, второе ядро, ускорители для нейросетей, математики, графики и многое другое в разных сочетаниях (не считая GPIO, UART, SPI, I2C, I2S, ADC, таймеров...), сравнить модели ESP32 можно в официальной табличке
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
ROM 0 (только внешняя) 448KB 128KB 384KB 384KB 384KB
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 сама работает как точка доступа, к которой могут подключаться другие устройства: максимум 8 для ESP8266 и 10 для ESP32. ESP создаёт полноценную локальную сеть, то есть устройства могут общаться как между собой, так и с самой ESP, условно можно подключиться к ESP со смартфона и управлять ей

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

  • ESP-NOW - радиосвязь с другими ESP. Это не WiFi, а отдельный протокол связи на той же частоте. Он более энергоэффективный, более устойчивый к помехам и работает на большем расстоянии, чем WiFi - до 1 км в идеальных условиях, до 400 м со стандартной антенной на прямой видимости и до 50 м в помещении. Не может работать одновременно с WiFi режимами. Позволяет передавать любые данные между МК, сделать радиоуправление или mesh-сеть

Что купить? #

Для знакомства с сетевыми возможностями и создания первых 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 - компиляция проходит многократно быстрее, да и в целом писать код там гораздо удобнее.

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

ESP всех версий имеет особенность - МК может запускаться (подача питания или сброс кнопкой Reset) в двух режимах, они переключаются состоянием пина GPIO 0 перед запуском:

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

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

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

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

При каждом запуске ESP8266 и ESP32 отправляют в UART0 (по сути в монитор порта) информацию о причине перезагрузки и некоторые системные параметры для отладки. Это происходит на скорости 74880 бод, на любой другой скорости монитора будет выведен просто набор символов:

Эта информация не особо полезна, поэтому подстраивать Serial под неё не имеет смысла - просто привыкаем к тому, что при каждом старте в мониторе будет строка с мусором.

Exception #

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

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

Arduino IDE #

В Arduino IDE это делается при помощи плагина EspExceptionDecoder. Со страницы релизов нужно скачать актуальную версию и распаковать в рабочую папку Arduino (по умолчанию Документы/Arduino) в подпапку 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 влияет на режим загрузки МК, поэтому нельзя подключать к нему что-то с подтянутым к GND или замкнутым на GND/VCC пином.

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

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

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

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

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

Питание #

ESP - довольно прожорливый МК, особенно при включенном WiFi, поэтому ему нужно обеспечить качественное питание с током около 300 мА (с запасом). На платах обычно стоит стабилизатор, который рассчитан на такие нагрузки при внешнем питании до 7V - нельзя питать их от 12-15V, как классические Arduino.

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

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

5 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Прокрутить вверх