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

В этом примере конфигурации используется отладочная плата YD-ESP32-23 и LoRa-модуль DX-LR20-900M22S (аналог модуля E22-900M22 [6]) Сначала надо выполнить шаги "Этап 1" и "Этап 2" из [1]. На этих шагах устанавливается PlatformIO и закачивается репозиторий Git проекта Meshtastic.

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

1. Выберите основу для конфигурации. В папке firmware/variants/esp32s3/ репозитория Meshtastic находится множество готовых конфигураций для различных электронных устройств, где используется проессор ESP32-S3. Я выбрал конфигурацию heltec_v3 которая, как мне показалось, лучше всего подходит для платы YD-ESP32-23. В этой конфигурации надо будет сделать настройку выводов портов для подключения модуля LoRa-радио на чипе LLCC68 (он используется в модуле DX-LR20-900M22S).

2. Сделайте копию папки firmware/variants/esp32s3/heltec_v3 и всего содержимого, что в ней находится, в папку firmware/variants/esp32s3/myvariant2.

Замечание: имейте в виду, что имена вариантов глобальны, поэтому задавайте уникальные имена для новых вариантов аппаратуры Meshtastic.

3. Отредактируйте файл myvariant2/variant.h, где задаются номера портов ввода/вывода и другие опции. Для платы 260321mechtastic, в разделе настроек LoRa убедитесь, что присутствует определение USE_SX1262. Исправьте также назначение ножек портов, макросы LORA_xxx.

[]

260321meshtastic common view

260321meshtastic SCH

260321meshtastic PCB

#define LED_POWER LED

#define USE_SSD1306 // У Heltec_v3 есть экран SSD1306

#define RST_OLED 37
#define SDA_OLED 38
#define SCL_OLED 39
#define RESET_OLED RST_OLED
#define I2C_SDA SDA_OLED
#define I2C_SCL SCL_OLED

// Разрешение второй шины для внешних периферийных устройств
#define SDA 21
#define SCL 20
#define I2C_SDA1 SDA
#define I2C_SCL1 SCL

#define VEXT_ENABLE Vext // активный уровень лог. 0, подает питание на экран OLED
// и на усилитель антенны LoRa
#define BUTTON_PIN 0

#define ADC_CTRL 37
#define ADC_CTRL_ENABLED LOW
#define BATTERY_PIN 1 // Вывод для измерения напряжения на батарее, делитель
// напряжения подключен к напряжению батареи
#define ADC_CHANNEL ADC_CHANNEL_0
#define ADC_ATTENUATION ADC_ATTEN_DB_2_5 // настройка lower dB для делителя напряжения
#define ADC_MULTIPLIER 4.9 * 1.045

// Подойдет и для чипа LLCC68, поскольку они совместимы программно:
#define USE_SX1262

#define LORA_DIO0 -1 // Нет подключения на модуле SX1262
#define LORA_RESET 7
#define LORA_DIO1 4 // SX1262 IRQ
#define LORA_DIO2 5 // SX1262 BUSY
#define LORA_DIO3 // Не подключено на печатной плате, но соединено внутри с TTGO SX1262,
// если DIO3 лог. 1 то TXCO разрешен
#define LORA_RXEN 9
#define LORA_TXEN 46
#define LORA_SCK 17
#define LORA_MISO 15
#define LORA_MOSI 16
#define LORA_CS 18

#ifdef USE_SX1262
#define SX126X_CS LORA_CS
#define SX126X_DIO1 LORA_DIO1
#define SX126X_BUSY LORA_DIO2
#define SX126X_RESET LORA_RESET
#define SX126X_RXEN LORA_RXEN // Добавьте эти две строки, если
#define SX126X_TXEN LORA_TXEN // используете LORA_RXEN и LORA_TXEN
#endif

#define SX126X_DIO2_AS_RF_SWITCH
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
#define HAS_32768HZ 1

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

#define EBYTE_E22_900M22S   // Включает поддержку конкретного модуля
#define TX_GAIN_LORA 7 // Усиление встроенного усилителя E22

// --- Параметры вывода радиосигнала ---
// Максимальная выходная мощность модуля = +22 dBm:
#define SX126X_MAX_POWER 22
// Включает DIO2 для управления внешним RF-переключателем:
//#define SX126X_DIO2_AS_RF_SWITCH

// --- Ток и усиление (опционально, для точной настройки) ---
// Лимит тока в мА для достижения макс. мощности:
#define SX126X_CURRENT_LIMIT 140.0

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

extra_configs =
variants/*/*.ini
# Эта строчка подключит файл platformio.ini в вашей папке myvariant2:
variants/*/*/platformio.ini
variants/*/diy/*/platformio.ini
src/graphics/niche/InkHUD/PlatformioConfig.ini

Откройте файл firmware/variants/esp32s3/myvariant2/platformio.ini и внесите в него следующие изменения:

; YD-ESP32-23 Development Board
; https://github.com/rtek1000/YD-ESP32-23
[env:myvariant2]
custom_meshtastic_hw_model = 43
custom_meshtastic_hw_model_slug = HELTEC_V3
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = Heltec V3
custom_meshtastic_images = heltec-v3.svg, heltec-v3-case.svg
custom_meshtastic_tags = Heltec
custom_meshtastic_partition_scheme = 8MB

extends = esp32s3_base
board = heltec_wifi_lora_32_V3
board_level = pr
board_check = true
board_build.partitions = default_8MB.csv
build_flags =
${esp32s3_base.build_flags}
-D myvariant2
-I variants/esp32s3/myvariant2
-D ARDUINO_USB_MODE=1
-D ARDUINO_USB_CDC_ON_BOOT=1

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

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

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

cd ..\..\..

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

python3 -m venv pio-env
source pio-env/bin/activate
rm -rf .pio
pio run -e myvariant2

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

Environment    Status    Duration
-------------  --------  ------------
myvariant2     SUCCESS   00:03:10.597
=============================== 1 succeeded in 00:03:10.597 ==============================
*** Original Arduino "idf_component.yml" restored ***
Building .pio/build/myvariant2/firmware-myvariant2-2.8.0.84d8c22.bin
esptool v5.2.0
Creating ESP32-S3 image...
Merged 4 ELF sections.
Successfully created ESP32-S3 image.
Creating binary "firmware-myvariant2-2.8.0.84d8c22.factory.bin" with:
    Offset   | File
 -  0x0      | bootloader.bin
 -  0x8000   | partitions.bin
 -  0xe000   | boot_app0.bin
 -  0x10000  | firmware-myvariant2-2.8.0.84d8c22.bin
Successfully created combined binary image.
esp32_create_combined_bin([".pio/build/myvariant2/firmware-myvariant2-2.8.0.84d8c22.bin"],
 [".pio/build/myvariant2/firmware-myvariant2-2.8.0.84d8c22.elf"])
Generating combined binary for serial flashing
    Offset | File
 -  0x0 | ~/firmware/.pio/build/myvariant2/bootloader.bin
 -  0x8000 | ~/firmware/.pio/build/myvariant2/partitions.bin
 -  0xe000 | ~/.platformio/packages/framework-arduinoespressif32/tools/partitions/boot_app0.bin
 - 0x10000 | ~/firmware/.pio/build/myvariant2/firmware-myvariant2-2.8.0.84d8c22.bin
Using esptool.py arguments: --chip esp32s3 merge_bin -o ~/firmware/.pio/build/myvariant2
 /firmware-myvariant2-2.8.0.84d8c22.factory.bin --flash_mode dio --flash_freq 80m --flash_size
 8MB 0x0 ~/firmware/.pio/build/myvariant2/bootloader.bin 0x8000 ~/firmware/.pio/build/myvariant2
 /partitions.bin 0xe000 ~/.platformio/packages/framework-arduinoespressif32/tools/partitions
 /boot_app0.bin 0x10000 ~/firmware/.pio/build/myvariant2/firmware-myvariant2-2.8.0.84d8c22.bin
Warning: Deprecated: Option '--flash_mode' is deprecated. Use '--flash-mode' instead.
Warning: Deprecated: Option '--flash_freq' is deprecated. Use '--flash-freq' instead.
Warning: Deprecated: Option '--flash_size' is deprecated. Use '--flash-size' instead.
Warning: Deprecated: Command 'merge_bin' is deprecated. Use 'merge-bin' instead.
esptool v5.2.0
SHA digest in image updated.
Wrote 0x2318d0 bytes to file '~/firmware/.pio/build/myvariant2
 /firmware-myvariant2-2.8.0.84d8c22.factory.bin', ready to flash to offset 0x0.
mtjson_esp32_part(["mtjson"], [".pio/build/myvariant2/firmware-myvariant2-2.8.0.84d8c22.bin",
 ".pio/build/myvariant2/littlefs-myvariant2-2.8.0.84d8c22.bin"])
manifest_gather(["mtjson"], [".pio/build/myvariant2/firmware-myvariant2-2.8.0.84d8c22.bin",
 ".pio/build/myvariant2/littlefs-myvariant2-2.8.0.84d8c22.bin"])
{'name': 'firmware-myvariant2-2.8.0.84d8c22.elf', 'md5': '9340536cf34c0d56f8f9d3c9e9eb8af0',
 'bytes': 4988848}
{'name': 'firmware-myvariant2-2.8.0.84d8c22.bin', 'md5': '236023947a6ae912a54693ca18eea9f8',
 'bytes': 2234576, 'part_name': 'app0'}
{'name': 'firmware-myvariant2-2.8.0.84d8c22.factory.bin', 'md5': 'b76065dff62c5ad64c1617703a4d4734',
 'bytes': 2300112}
{'name': 'littlefs-myvariant2-2.8.0.84d8c22.bin', 'md5': '0f8a8b1425e02b9df584617a3487bf35',
 'bytes': 1572864, 'part_name': 'spiffs'}
=================================== [SUCCESS] Took 386.78 seconds ===================================
Environment    Status    Duration
-------------  --------  ------------
myvariant2     SUCCESS   00:06:26.780
=================================== 1 succeeded in 00:06:26.780 =====================================

3. Запрограммируйте прошивку. После прошивки в папке .pio/build/myvariant2/ окажутся файлы:

$ ls -1 .pio/build/myvariant2/
bootloader.bin
firmware-myvariant2-2.8.0.84d8c22.bin
firmware-myvariant2-2.8.0.84d8c22.elf
firmware-myvariant2-2.8.0.84d8c22.factory.bin
firmware-myvariant2-2.8.0.84d8c22.map
firmware-myvariant2-2.8.0.84d8c22.mt.json
libFrameworkArduino.a
littlefs-myvariant2-2.8.0.84d8c22.bin
partitions.bin

Для первой прошивки используйте файл *.factory.bin (т. е. firmware-myvariant2-2.8.0.84d8c22.factory.bin):

cd .pio/build/myvariant2
esptool.py write_flash 0x0 firmware-myvariant2-2.8.0.84d8c22.factory.bin

или так:

pio run -e myvariant2 -t upload --upload-port /dev/ttyACM0

Вот подробное объяснение каждого файла, который появился после успешной компиляции:

[Основные прошивочные файлы (самые важные)]

firmware-myvariant2-2.8.0.84d8c22.factory.bin

- Назначение: полный образ прошивки для первичной установки

- Что включает: всё необходимое для первого прошивания (загрузчик, приложение, разделы)

- Когда использовать: 

  - Первая прошивка нового устройства
  - Полная переустановка системы
  - Восстановление "кирпича"

- Как прошить:

cd .pio/build/myvariant2
esptool.py write_flash 0x0 firmware-myvariant2-2.8.0.84d8c22.factory.bin

firmware-myvariant2-2.8.0.84d8c22.bin (App)

- Назначение: только основное приложение (без загрузчика и разделов)

- Что включает: только код прошивки Meshtastic

- Когда использовать: обновление существующей прошивки через OTA или через PlatformIO

- Как прошить: через веб-интерфейс Flasher или `pio run -t upload`

[Системные файлы]

bootloader.bin

- Назначение: загрузчик системы

- Что делает: инициализирует оборудование, загружает основную прошивку

- Когда нужен: обычно включён в `.factory.bin`, отдельно используется редко

partitions.bin

- Назначение: таблица разделов flash-памяти

- Что определяет: где и какие данные хранятся (OTA разделы, файловая система, настройки)

- Важно: ваша конфигурация `board_build.partitions = default_8MB.csv` определила эту таблицу

littlefs-myvariant2-2.8.0.84d8c22.bin

- Назначение: образ файловой системы LittleFS

- Что хранит: 

  - Веб-интерфейс
  - Статические файлы
  - Конфигурации по умолчанию

- Объём: 8MB раздел (согласно вашей конфигурации)

Отладочные файлы

*.elf (Executable and Linkable Format)

- Назначение: исполняемый файл с отладочной информацией

- Когда нужен: 

  - Отладка через GDB
  - Анализ дампа памяти
  - Отладка креш-логов

*.map

- Назначение: карта памяти - где расположены функции и переменные

- Использование:

  - Оптимизация размера прошивки
  - Отладка переполнения памяти
  - Поиск "тяжёлых" функций

- Полезно: при ошибках `not enough memory`

*.mt.json (Meshtastic metadata)

- Назначение: метаданные для системы обновлений Meshtastic

- Содержит: версию, хэши, информацию о совместимости

- Используется: для OTA обновлений и веб-флешера

libFrameworkArduino.a

- Назначение: статическая библиотека Arduino framework

- Что это: скомпилированная основа Arduino для ESP32-S3

- Кэшируется: для ускорения пересборки

[Практические рекомендации]

Для первой прошивки нового устройства:

# Используйте factory.bin
esptool.py --chip esp32s3 --port /dev/ttyUSB0 write_flash 0x0 \
 .pio/build/myvariant2/firmware-myvariant2-2.8.0.84d8c22.factory.bin

Для обновления уже работающего устройства:

# Через PlatformIO (автоматически выберет правильный файл)

pio run -e myvariant2 -t upload

или так, с указанием правильного порта:

pio run -e myvariant2 -t upload --upload-port /dev/ttyACM0

Альтернативно можно прошить через веб-интерфейс Meshtastic (использует .bin файл).

Для OTA обновления (по воздуху):

- Используйте файл firmware-myvariant2-2.8.0.84d8c22.bin
- Загрузите через веб-интерфейс устройства

Для отладки после программного сбоя:

- Сохраните `.elf` и `.map` файлы
- Они помогут расшифровать дамп памяти в осмысленные имена функций

[Типичный сценарий прошивки через PlatformIO]

# Сборка и прошивка (автоматически)
pio run -e myvariant2 -t upload

Что происходит:

1. Компиляция всех файлов
2. Линковка в .elf
3. Конвертация в .bin
4. Прошивка bootloader.bin, partitions.bin, app.bin

Важно: *.factory.bin - это комбинация bootloader.bin + partitions.bin + firmware.bin. Именно этот файл рекомендуется для начальной прошивки, так как он гарантирует правильную конфигурацию всех разделов.

[Как проверить работу программы]

После успешной прошивки устройства первым делом нужно убедиться, что оно запустилось и работает корректно. Самый простой и надежный способ — подключиться к нему через официальные клиенты - Python CLI [2] или Web CLI [3].

Вот пошаговая инструкция, как это сделать:

Проверка через последовательный порт (самый надежный способ)

Это лучший вариант для первичной проверки, так как он не зависит от настроек радио и показывает полный журнал запуска устройства.

1. Установите Python и официальный CLI:

Если у вас еще не установлен Python, скачайте его с [официального сайта](https://www.python.org/). Установите Meshtastic Python CLI, выполнив в терминале (или командной строке `cmd` от имени администратора в Windows) команду:

pip install meshtastic

2. Подключитесь к устройству:

- Подключите плату к компьютеру через USB. Для платы YD-ESP32-23 это будет второй интерфейс, который подписан как "COM" на обратной стороне платы.

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

meshtastic --noproto --port /dev/ttyACM0

- Кратковременно нажмите на кнопку RST. Если вы видите поток сообщений, значит устройство загрузилось и работает.

Проверка через Android / iOS приложение (для реального использования)

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

1. Установите приложение Meshtastic из вашего магазина приложений (Google Play или App Store).

2. Включите на телефоне Bluetooth (BLE). Приложение находит устройство именно по Bluetooth, а не через USB.

3. Откройте приложение и нажмите "Connect". Оно должно автоматически обнаружить вашу плату.

4. После подключения вы увидите основную информацию об устройстве и сможете отправлять и принимать сообщения.

Функциональная проверка: отправка сообщения

Чтобы окончательно убедиться, что все работает, можно отправить тестовое сообщение с помощью Python CLI.

# Отправить приветственное сообщение в эфир (на все узлы рядом)
meshtastic --sendtext "Hello, mesh!"

# Или отправить сообщение конкретному узлу (укажите его ID)
meshtastic --dest 1234567890 --sendtext "Привет, конкретный узел!"

Если команда выполнилась без ошибок, это значит, что и USB-соединение, и радиомодуль работают корректно .

[Устранение возможных проблем]

 Устройство не определяется по USB: проверьте драйверы USB-to-Serial чипа (CH343P). Возможно, потребуется установить драйвер Windows с сайта производителя.

CLI не находит устройство: убедитесь, что нет других программ (например, Arduino IDE), которые могли "захватить" порт.

Появляются ошибки: обратите внимание на сообщения красным цветом в логе `meshtastic --noproto`. Это поможет понять, корректно ли настроены порты GPIO модуля LoRa в вашем файле variant.h.

См. также список часто задаваемых вопросов в статье [4].

[Ссылки]

1. Meshtastic: компиляция прошивки.
2. Meshtastic Python CLI Guide.
3. Meshtastic Web Client Overview.
4. Meshtastic: компиляция прошивки для ESP32-C3 Super-Mini.
5. Android Application Installation site:meshtastic.org.
6. E22-900M22S: руководство пользователя.