ESP8266 - простейшее приложение

С помощью Platformio и фреймворка Arduino

Попробуем написать простейшее приложение для SoC ESP8266 с помощью экосистемы PlatformIO.

В качестве «железной» части удобно взять NodeMCU любой версии или любую другую плату основанную на модуле ESP12E.

Я предполагаю, что вы уже установили себе PlatformIO.

Создание проекта

Создадим каталог для нашего будущего приложения и перейдём в него:

mkdir esp-simple
cd esp-simple

Далее создадим шаблон проекта с помощью PlatformIO:

platformio init -d ./ -b esp12e --ide vscode

Здесь мы указываем команду init - создать новый проект или удалить существующий.

Ключи:

  • -d ./ - каталог, в котором следует создать проект. В данном случае каталог текущий и ключ можно было не указывать.
  • -b esp12e - для какой отладочной платы мы создаём проект. В данном случае - для абстрактного модуля ESP12E.
  • --ide vscode - этот ключ указывает команды создать дополнительные файлы для работы с конкретной IDE. Я использую VS Code, но это не принципиально.

Быструю подсказку по команде всегде можно получить указав ключ -h.

pio init -h

Usage: pio init [OPTIONS]

Options:
  -d, --project-dir DIRECTORY
  -b, --board ID
  --ide [atom|clion|codeblocks|eclipse|emacs|netbeans|qtcreator|sublimetext|vim|visualstudio|vscode]
  -O, --project-option TEXT
  --env-prefix TEXT
  -s, --silent
  -h, --help                      Show this message and exit.

Обратите внимание, что сейчас я использовал сокращённое имя pio. При работе в консоли использование сокращённого имени удобнее, поэтому далее, я буду использовать его.

Но вернёмся к новосозданному проекту. После выполнения команды pio init мы получили подробный отчёт, о результате выполнения.

The current working directory /home/ivan/Projects/esp-simple will be used for project.
You can specify another project directory via
`platformio init -d %PATH_TO_THE_PROJECT_DIR%` command.

The next files/directories have been created in /home/ivan/Projects/esp-simple
platformio.ini - Project Configuration File
src - Put your source files here
lib - Put here project specific (private) libraries

Project has been successfully initialized!
Useful commands:
`platformio run` - process/build project from the current directory
`platformio run --target upload` or `platformio run -t upload` - upload firmware to embedded board
`platformio run --target clean` - clean project (remove compiled files)
`platformio run --help` - additional information

Были созданы:

  • Файл platform.ini содержащий необходимую для проекта конфигурацию.
  • Каталог src для исходных кодов вашего приложения.
  • Каталог lib для специфичных для проекта библиотек отсутствующих в реестре библиотек PlatfromIO.

Так же видим подсказку по сборке и загрузке приложения в устройство, но пока нам собирать нечего.

Если заглянуть в файл platformio.ini, то увидим минимально необходимые настройки проекта.

[env:esp12e]
platform = espressif8266
board = esp12e
framework = arduino

Следует отметить, что система сборки позволяет работать с несколькими окружениями env, которые могут отличаться специфичными настройками для одной и той же платы, или вообще позволять произвести сборку для разных плат.

Первый код

Создадим в каталоге src/ файл Main.cpp со следующим содержимым:

#include <Esp.h>

void setup() {
    pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
    digitalWrite(LED_BUILTIN, LOW);
    delay(100);
    digitalWrite(LED_BUILTIN, HIGH);
    delay(900);
}

Те кто уже имел дело с Arduino наверняка узнали полезнейшую вещь - мигалку светодиодом. Этакий «Hello world» в мире электроники.

Скомпилируем его:

pio run

И если всё было сделано правильно, то увидим много информации о процессе сборки:

[Thu Sep 28 17:56:26 2017] Processing esp12e (platform: espressif8266; board: esp12e; framework: arduino)
---------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
Collected 23 compatible libraries
Looking for dependencies...
No dependencies
Compiling .pioenvs/esp12e/src/Main.o
... очень много информации о сборке ...
Linking .pioenvs/esp12e/firmware.elf
Calculating size .pioenvs/esp12e/firmware.elf
text	   data	    bss	    dec	    hex	filename
221232	    888	  29408	 251528	  3d688	.pioenvs/esp12e/firmware.elf
Building .pioenvs/esp12e/firmware.bin

Такие длинные простыни вы будете получать не каждый раз, а только при первой сборке, изменении файла platformio.ini или после выполнения команды pio run -t clean, поскольку сборщику приходится собрать объектные файлы из всех необходимых исходников.

В дальнейшем сборщик пересобирает только изменённые файлы.

Готовый к прошивке файл у нас попал в скрытую служебную директорию .pioenvs/esp12e/firmware.bin и может быть от туда без труда скопирован для дальнейшего распространения. Наличие чётко определённого места очень удобно, особенно по сравнению с Arduino IDE, где приходится играть в квест «Найди куда я собрал бинарник в этот раз».

Прошивка железа

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

Процесс прошивки не сложнее процесса сборки, главное не забыть подключить плату к компьютеру по USB (ну или по последовательному порту, если у вас собственная разработка без преобразователя USB->Serial).

pio run -t upload

После запуска этой команды пойдёт процесс загрузки:

[Thu Sep 28 18:08:40 2017] Processing esp12e (platform: espressif8266; board: esp12e; framework: arduino)
---------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
Collected 23 compatible libraries
Looking for dependencies...
No dependencies
Looking for upload port...
Auto-detected: /dev/ttyUSB0
Uploading .pioenvs/esp12e/firmware.bin
Uploading 226272 bytes from .pioenvs/esp12e/firmware.bin to flash at 0x00000000
................................................................................ [ 36% ]
................................................................................ [ 72% ]
.............................................................                    [ 100% ]
==== [SUCCESS] Took 25.99 seconds ==== 

На платах подобных NodeMCU как правило установлена схема сброса и перевода SoC ESP8266 в режим загрузчика и в этом случае загрузка пройдёт автоматически.

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

Для этого следует подтянуть выход GPIO0 к земле через резистор 1-10 Ком, и произвести сброс контроллера кратковременной подачей низкого уровня на вход RESET.

После этого модуль готов к прошивке.

Если же у вас голый модуль ESP12E или ему подобный, то помните, что для нормальной работы модуля вывод CH_PD должен быть подтянут к питанию через резистор 1-10 Ком, вывод GPIO15 должен быть подтянут к земле через резистор 1-10 Ком.

ESP

Скорость загрузки

Поскольку прошивка для ESP8266 даже в таком минимальном варианте получается достаточно тяжелой загрузка длится долго. В моём случае почти 26 секунд.

Поправить это достаточно просто. Дело в том, что по умолчанию скорость последовательного порта при загрузке устанавливается 115200 baud, но сам ESP8266 прекрасно работает и на скорости 921600 baud, что в восемь раз выше скорости по умолчанию.

Для явного указания скорости загрузки добавьте в platform.ini в конец секции [env:esp12e] строчку:

upload_speed = 921600

После этого соберите приложение заново pio run и прошейте устройство pio run -t upload.

У меня после этого время загрузки сократилось до 12.8 секунд. Это меньше чем в 2 раза, а ожидали 8!

Но следует иметь в виду, что на скорость загрузки влияет не только скорость канала обмена данными но и скорость записи во Flash-память устройства, устойчивать канала связи - на больших скоростях могут быть потери пакетов или сам микроконтроллер не будет успевать обрабатывать всё свалившееся на него счастье.

На самом деле, я получил оптимальную скорость загрузки на скорости канала в 460800 baud.

Скорость Время
921600 12.8
460800 10.5
230400 15.8
115200 25

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

Порт загрузчика

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

Для того, что бы помочь ему с выбором, можно указать порт явно прописав в platformio.ini какое устройство необходимо.

upload_port = /dev/ttyUSB1

Или указать диапазон возможных имён последовательных портов, на которых следует искать ESP8266.

; Любой порт имя которого начинается с /dev/ttyACM
upload_port = /dev/ttyACM*

Для пользователей Windows:

; COM5 или COM7
upload_port = COM[57]

Подробнее о параметрах загрузчика можно прочитать в официальной документации.

 
comments powered by Disqus