Meshtastic: компиляция прошивки Печать
Добавил(а) microsin   

Ниже показан пошаговый процесс компиляции прошивки Meshtastic для ESP32 и модуля E22-900M30S [2].

Поскольку произвольного оборудования (ESP32 + E22-900M30S) нет готовой официальной платы, основной задачей будет адаптация существующей конфигурации. Процесс состоит из нескольких этапов: от подготовки инструментов до сборки и заливки прошивки.

[Этап 1: Подготовка среды сборки]

Для компиляции прошивки вам понадобится набор инструментов. Вся работа ведется через командную строку.

1. Установите Git: система контроля версий для скачивания исходного кода.

2. Установите Python 3: скрипты сборки и инструменты PlatformIO написаны на Python.

3. Установите PlatformIO Core: это основная среда сборки для Meshtastic. Удобнее всего установить её через терминал. В системах macOS/Linux и Windows это делается одной и той же командой:

pip install platformio

После установки можно использовать команду pio в терминале.

После запуска и завершения команды pip install platformio попытка запустить pio в командной строке заканчивается неудачей с сообщением об ошибке:

pip install platformio
Defaulting to user installation because normal site-packages is not writeable
Collecting platformio
  Downloading platformio-6.1.19-py3-none-any.whl.metadata (7.2 kB)
...
Collecting bottle==0.13.* (from platformio)
Collecting pyelftools< 1,>=0.27 (from platformio)
  Using cached pyelftools-0.32-py3-none-any.whl.metadata (372 bytes)
Installing collected packages: pyelftools, bottle, semantic_version, marshmallow,
 h11, colorama, anyio, ajsonrpc, wsproto, starlette, click, uvicorn, platformio
   ━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  1/13 [bottle]
WARNING: The script bottle.exe is installed in 'C:\Users\myuser\AppData\Roaming\Python\Python314\Scripts' which is not on PATH. Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location. ...

pio 'pio' is not recognized as an internal or external command, operable program or batch file.

Проблема ясна: Python установил исполняемые файлы PlatformIO в директорию, которая не добавлена в системную переменную PATH. Windows просто не знает, где искать команду pio. Ниже показано как это исправить.

Решение 1: добавить директорию в PATH (постоянно). Самый правильный способ — добавить нужную папку в переменные окружения.

1. Найдите путь. Из сообщений команды установки pip install platformio видно, что pio.exe находится здесь:

C:\Users\myuser\AppData\Roaming\Python\Python314\Scripts

2. Откройте настройки переменных среды. Нажмите Win + R, введите sysdm.cpl и нажмите Enter. Перейдите на вкладку Дополнительно → Переменные среды... (Advanced → Environmemt Variables...).

Meshtastic PlatformIO Environment variables

3. Измените переменную Path. Для этого в разделе "Системные переменные" (System variables) найдите переменную Path и выберите кликните на кнопку "Изменить..." (Edit...). В этом окне кликните на кнопку "Создать" (New) и вставьте скопированный путь (для нашего примера это C:\Users\myuser\AppData\Roaming\Python\Python314\Scripts, ваш путь может отличаться). Нажмите ОК во всех окнах.

Meshtastic PlatformIO add pio path

4. Проверьте, как применились изменения. Для этого перезапустите командную строку (CMD) и выполните команду pio --version:

pio --version
PlatformIO Core, version 6.1.19

Решение 2: использовать полный путь (быстро, разово). Если нужно просто запустить PlatformIO один раз для сборки, можно не настраивать PATH, а указывать полный путь к pio.exe каждый раз.

C:\Users\myuser\AppData\Roaming\Python\Python314\Scripts\pio --version

Для сборки прошивки вы будете использовать эту длинную команду, например для варианта EBYTE_ESP32-S3:

C:\Users\myuser\AppData\Roaming\Python\Python314\Scripts\pio run -e EBYTE_ESP32-S3

Важное примечание: после того как вы добавите путь в PATH, обязательно закройте и откройте заново все окна командной строки, которые были открыты до этого. Изменения в переменных среды не применяются к уже запущенным процессам.

[Этап 2: Загрузка исходного кода]

Скачайте исходный код прошивки Meshtastic с GitHub [1]:

git clone https://github.com/meshtastic/firmware.git

Перейдите в папку с проектом:

cd firmware

Инициализируйте и обновите субмодули (нужно для зависимостей):

git submodule update --init

[Этап 3: Адаптация конфигурации для E22-900M30S]

Это ключевой шаг. Поскольку ваш модуль отличается от стандартных, нужно указать прошивке, к каким пинам ESP32 он подключен.

1. Выберите основу для конфигурации. В папке variants/esp32s3 находятся готовые варианты конфигураций, найдите EBYTE_ESP32-S3. Она идеально подходит в качестве стартовой точки, так как уже содержит настройки для работы с модулями Ebyte. В этой конфигурации надо будет сделать настройку выводов портов для подключения модуля LoRa-радио (E22-900M30S).

2. Сделайте копию папки variants\esp32s3\EBYTE_ESP32-S3 и всего содержимого, что в ней находится, в папку variants\esp32s3\myvariant.

cd variants\esp32s3
cp -R EBYTE_ESP32-S3 myvariant

3. Перейдите в папку myvariant и откройте для редактирования файл variant.h (в этом примере использовался редактор кода VScode, но вы можете использовать любой другой подходящий редактор текста, например notepad2).

cd myvariant
code variant.h

Meshtastic edit variant h

4. Найдите секцию с определениями портов для LoRa (SX126X_CS, LORA_SCK и т.д.) и измените номера GPIO в соответствии с вашей схемой подключения E22 к ESP32.

// Пример настройки (замените номера на свои)
#define SX126X_CS 10
#define LORA_SCK 11
#define LORA_MOSI 12
#define LORA_MISO 7
#define SX126X_RESET 6
#define SX126X_BUSY 5
#define SX126X_DIO1 4

5. Установите правильные параметры мощности. Для модуля E22-900M30S важно указать его максимальную выходную мощность (30 дБм). Обычно это делается с помощью флагов сборки. Найдите их в том же файле variant.h или добавьте в platformio.ini для вашего окружения следующие строки:

#define EBYTE_E22_900M30S   // Включает поддержку конкретного модуля
#define TX_GAIN_LORA 7 // Усиление встроенного усилителя E22
#define SX126X_MAX_POWER 22 // Мощность, подаваемая на вход усилителя с чипа SX1262

6. (Опционально) настройте дисплей, GPS и другие компоненты. Если к вашей плате подключен OLED-экран или GPS-модуль, укажите пины для шины I2C или UART в том же файле variant.h:

#define HAS_SCREEN 1  // Сообщаем прошивке, что экран есть
#define I2C_SCL 9 // Номера портов GPIO интерфейса экрана
#define I2C_SDA 8
#define GPS_TX_PIN 1 // Номер порта GPIO, к которому подключен TX GPS-модуля

7. Добавьте ваш новый вариант сборки myvariant к списку вариантов Meshtastic. Корневой файл firmware\platformio.ini подключает все .ini файлы из папки variants/*/*.ini, в том числе и ваш файл platformio.ini в папке myvariant.

 Откройте файл firmware\variants\esp32s3\myvariant\platformio.ini и внесите в него следующие изменения (измененные значения выделены жирным шрифтом):

[env:myvariant]
extends = esp32s3_base
; board assumes the lowest spec WROOM module: 4 MB (Quad SPI) Flash, No PSRAM
board = ESP32-S3-WROOM-1-N4
board_level = extra
build_flags = ${esp32s3_base.build_flags}
-D myvariant
-I variants/esp32s3/myvariant

[Этап 4: Сборка и заливка прошивки]

Теперь, когда конфигурация готова, можно приступить к компиляции. 

1. Перейдите в корневой каталог репозитория (в папку firmware):

cd ..\..\..

2. Запустите сборку. В корневой папке firmware загруженного репозитория [1] выполните команду:

pio run -e myvariant

Первая сборка может занять 10-15 минут, так как PlatformIO загрузит все необходимые инструменты и библиотеки. В случае успеха вы увидите сообщение `SUCCESS`, а готовый файл прошивки (`.bin` или `.uf2`) будет находиться в папке .pio/build/myvariant/.

При запуске компиляции командой pio.exe run -e myvariant возникает ошибка:

pio run -e myvariant
Processing myvariant (board: ESP32-S3-WROOM-1-N4; platform:
platformio/espressif32@6.13.0; framework: arduino)
------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
PROGNAME: firmware-myvariant-2.7.21.d3a8684
ESP32_FS_IMAGE_NAME: littlefs-myvariant-2.7.21.d3a8684
CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/ESP32-S3-WROOM-1-N4.html
PLATFORM: Espressif 32 (6.13.0) > ESP32-S3-WROOM-1-N4 (4 MB Flash, No PSRAM)
HARDWARE: ESP32S3 240MHz, 512KB RAM, 4MB Flash
DEBUG: Current (esp-builtin) On-board (esp-builtin) External (cmsis-dap, esp-bridge,
 esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h,
  olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES:
 - framework-arduinoespressif32 @ 3.20017.241212+sha.dcc1105b
 - tool-esptoolpy @ 2.41100.0 (4.11.0)
 - tool-mklittlefs @ 1.203.210628 (2.3)
 - toolchain-riscv32-esp @ 8.4.0+2021r2-patch5
 - toolchain-xtensa-esp32s3 @ 8.4.0+2021r2-patch5
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
[nanopb] No generation needed.
Found 98 compatible libraries
Scanning dependencies...
Dependency Graph
|-- ESP8266 and ESP32 OLED driver for SSD1306 displays @ 4.4.1
|-- OneButton @ 2.6.1
...
Building in release mode
Using meshtastic platformio-custom.py, firmware version 2.7.21.d3a8684 on myvariant
Using flags:
-DAPP_VERSION=2.7.21.d3a8684
-DAPP_VERSION_SHORT=2.7.21
-DAPP_ENV=myvariant
-DAPP_REPO=meshtastic/firmware
-DBUILD_EPOCH=1775336400
-DUSERPREFS_RINGTONE_RTTTL=\"24:d=32,o=5,b=565:f6,p,f6,4p,p,f6,p,f6,2p,p,b6,p,b6,p,
 b6,p,b6,p,b,p,b,p,b,p,b,p,b,p,b,p,b,p,b,1p.,2p.,p\"
-DUSERPREFS_TZ_STRING=\"tzplaceholder                                         \"
Compiling .pio\build\myvariant\src\BluetoothCommon.cpp.o
xtensa-esp32s3-elf-g++: error: CreateProcess: No such file or directory
Compiling .pio\build\myvariant\src\DebugConfiguration.cpp.o
*** [.pio\build\myvariant\src\BluetoothCommon.cpp.o] Error 1
xtensa-esp32s3-elf-g++: error: CreateProcess: No such file or directory
*** [.pio\build\myvariant\src\DebugConfiguration.cpp.o] Error 1
============================================= [FAILED] Took 23.19 seconds 
Environment    Status    Duration
-------------  --------  ------------
myvariant      FAILED    00:00:23.185
======================================== 1 failed, 0 succeeded in 00:00:23.185 

Эта ошибка вероятно происходит из-за слишком длинных путей до корневой папки Meshtactic (пути до папки firmware) или до файлов PlatformIO. В моем случае это было из-за слишком длинного пути до папки .platformio, которая находилась в профиле текущего пользователя Windows.

Как устранить ошибку:

1. Создайте папку PlatformIO на диске C: (полный путь C:\PlatformIO).

2. Переместите все содержимое каталога c:\Users\имя_пользователя\.platformio в эту новую созданную папку.

3. Создайте новую переменную окружения PLATFORMIO_HOME_DIR со значением C:\PlatformIO.

4. Проверьте, что путь к содержимому папки bin, где находится компилятор xtensa-esp32s3-elf-g++ и другие утилиты, находится также в переменой Path (c:\PlatformIO\packages\toolchain-xtensa-esp32s3\bin\).

3. Подключите устройство и залейте прошивку. Самый простой способ — использовать встроенную команду PlatformIO:

pio run -e myvariant -t upload

Если у вашей платы ESP32 возникают проблемы с автоматическим входом в режим прошивки, возможно, придется сделать это вручную: зажать кнопку BOOT, нажать и отпустить RESET, после чего отпустить BOOT.

В папке firmware\.pio\build\myvariant будут находиться файлы наподобие следующих:

.sconsign314.dblite
bootloader.bin
firmware-myvariant-2.7.21.d3a8684.bin
firmware-myvariant-2.7.21.d3a8684.elf
firmware-myvariant-2.7.21.d3a8684.factory.bin
firmware-myvariant-2.7.21.d3a8684.map
firmware-myvariant-2.7.21.d3a8684.mt.json
libFrameworkArduino.a
littlefs-myvariant-2.7.21.d3a8684.bin
longcmd-d74f4dd60e3a14731d6172de793a8148
partitions.bin

Вот полная команда для прошивки ESP32-S3 с помощью esptool:

esptool.py --chip ESP32-S3 --port COM3 --baud 921600 write_flash 0x0 bootloader.bin 0x8000 partitions.bin 0xe0000 littlefs-myvariant-2.7.21.d3a8684.bin 0x10000 firmware-myvariant-2.7.21.d3a8684.bin

Замените здесь COM3 на правильный COM-порт вашего устройства.

Альтернативная команда с factory.bin (проще). Если вы хотите прошить всё одним файлом (включая LittleFS):

esptool.py --chip ESP32-S3 --port COM3 --baud 921600 write_flash 0x0 firmware-myvariant-2.7.21.d3a8684.factory.bin

Если нужно сначала стереть flash:

esptool.py --chip ESP32-S3 --port COM3 erase_flash
esptool.py --chip ESP32-S3 --port COM3 --baud 921600 write_flash 0x0 firmware-myvariant-2.7.21.d3a8684.factory.bin

Пояснение адресов:

0x0 - bootloader.bin
0x8000 - partitions.bin
0xe0000 - littlefs (файловая система)
0x10000 - основная прошивка (app)

[Важные дополнения и советы]

● Внимание к питанию: модуль E22-900M30S — мощный передатчик. Убедитесь, что ваш источник питания способен обеспечить стабильные 5 В и достаточный ток (до 1-2 А в пиках). Рекомендуется устанавливать электролитические конденсаторы большой емкости (например, 1000-2000 мкФ) и керамический конденсатор на 100 нФ непосредственно у пинов питания модуля для сглаживания пульсаций.

● Проверка выходной мощности: многие пользователи отмечали, что при неправильной конфигурации модуль E22 может работать не на полную мощность, а на стандартных для SX1262 22 дБм. Убедитесь, что вы правильно определили флаги EBYTE_E22_900M30S, TX_GAIN_LORA и SX126X_MAX_POWER.

● Правила использования: мощность в 30 дБм (1 Вт) во многих странах превышает разрешенную для нелицензируемого использования. Перед использованием обязательно ознакомьтесь с местными нормативными актами и, при необходимости, ограничьте мощность через настройки устройства в приложении Meshtastic.

[Ссылки]

1. meshtastic / firmware.
2. E22-900M30S: руководство пользователя.
3. Meshtastic: быстрый старт.
4. Meshtastic: настройка и конфигурирование устройства.