Попробуем написать простейшее приложение для 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 Ком.
Скорость загрузки
Поскольку прошивка для 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