Готовую Meshtastic-ноду можно просто купить. Это быстро, удобно и, в некоторых случаях, даже дешевле. Но тогда теряется самое интересное: возможность собрать устройство самому, разобраться в распиновке, поковыряться в прошивке и на практике понять, как все это работает.

Я решил пойти именно этим путем и собрал свою ноду на ESP32-S3 Super Mini. Ниже покажу, какие комплектующие использовал, как все подключал и что пришлось менять в прошивке, чтобы это заработало.

Компоненты

Для сборки самодельной Meshtastic-ноды я использовал такой набор компонентов:

  • ESP32-S3 Super Mini - 373 ₽, 1 шт. ссылка

  • LoRa-антенна 868 MHz, 5 dBi, SMA Male to Female - 134 ₽, 1 шт. ссылка

  • GPS Neo-6M v2 - 251 ₽, 1 шт. ссылка

  • LoRa E22-900M30S - 873 ₽, 1 шт. ссылка

  • OLED-дисплей 0.96", 128x64, SSD1306 - 233 ₽, 1 шт. ссылка

  • USB-UART преобразователь - 187 ₽, 1 шт. ссылка

  • Провода-перемычки, около 20 шт.

  • Беспаечная макетная плата, 2 шт.

Если не учитывать провода, макетки и USB-UART адаптер, итоговая стоимость получается 1864 ₽.
С адаптером уже 2051 ₽.

Да, это дороже, чем некоторые готовые бюджетные ноды. Но собирать такую штуку самому намного интереснее.

Также стоит добавить, что некоторые компоненты я покупал дешевле, чем они продаются на маркет плейсе сейчас. Например я получил 20% скидку на лору из-за того, что мне в начале прислали модуль не на ту частоту.

Подключение

На первый взгляд этап подключения кажется самым сложным. Но у ESP32-S3 есть важное преимущество: у нее очень гибкая матрица GPIO. На практике это означает, что интерфейсы SPI, I2C и UART можно развести по разным свободным пинам и затем указать их в конфигурации прошивки.

Ниже как раз показана схема, которая помогает понять сам принцип:

Распиновка ESP32-S3 super mini

Конечно, это не значит, что можно бездумно использовать вообще любой вывод. Некоторые пины могут быть заняты служебными функциями платы, USB или режимом загрузки. Но в целом свободы для разводки у ESP32-S3 действительно много, и для самодельной ноды это очень удобно.

Прошивка

Теперь перейдем к прошивке. Если открыть официальный сайт Meshtastic, то в списке поддерживаемых устройств самодельных плат, разумеется, не будет. И это нормально: каждая готовая сборка завязана на конкретную распиновку, набор компонентов.

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

Сначала клонируем репозиторий с прошивкой:

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

Для сборки понадобится PlatformIO. У меня macOS, поэтому я устанавливал его через Homebrew:

brew install platformio

Дальше переходим в каталог репозитория, открываем папку variants/, затем esp32s3/, и внутри выбираем EBYTE_ESP32-S3. Этот вариант удобно взять за основу, потому что он уже рассчитан на связку ESP32-S3 и EBYTE-модуля.

Открываем файл variant.h и меняем распиновку LoRa под свою схему подключения. В моем случае получилось так:

#define SX126X_CS 10   // EBYTE module's NSS pin // FIXME: rename to SX126X_SS
#define LORA_SCK 11     // EBYTE module's SCK pin
#define LORA_MOSI 12    // EBYTE module's MOSI pin
#define LORA_MISO 7    // EBYTE module's MISO pin
#define SX126X_RESET 6 // EBYTE module's NRST pin
#define SX126X_BUSY 5  // EBYTE module's BUSY pin
#define SX126X_DIO1 4  // EBYTE module's DIO1 pin

Ниже в этом же файле находим настройки I2C для дисплея и подставляем свои пины SCL и SDA:

// I2C
#define I2C_SCL 9
#define I2C_SDA 8

Если вы используете экран, не забудьте включить его в конфигурации:

#define HAS_SCREEN 1

Ниже расположен блок, связанный с GPS. Здесь логика та же: нужно указать тот пин, к которому подключен модуль. В моем случае на плате почти не осталось свободных GPIO, поэтому я использовал только одну линию данных от GPS.

Я сознательно не задействовал выводы TX и RX, подписанные на самой плате, чтобы не мешать прошивке и отладке через последовательный порт. Поэтому подключил только передачу данных от GPS-модуля к ESP32-S3:

#define GPS_TX_PIN 1

После этого стоит поправить скорость прошивки и монитора порта. Для этого открываем platformio.ini и добавляем в нужное окружение:

upload_speed = 115200
monitor_speed = 115200

Теперь можно собирать прошивку:

pio run -e EBYTE_ESP32-S3

Зачем нужен USB-UART адаптер

Тут может возникнуть закономерный вопрос: зачем вообще внешний USB-UART адаптер, если ESP32-S3 обычно можно прошивать напрямую через встроенный USB-C?

Если ваша плата нормально определяется и шьется через родной порт, внешний адаптер не нужен. Но у меня с дешевыми платами это работало нестабильно, поэтому я сразу взял отдельный преобразователь. С ним процесс оказался предсказуемее.

Подключение простое:

  • 5V адаптера к 5V на ESP32

  • GND к GND

  • TX адаптера к RX платы

  • RX адаптера к TX платы

После этого подключаем адаптер к компьютеру. Обычно драйверы ставятся автоматически.

Для загрузки прошивки используем:

pio run -e EBYTE_ESP32-S3 -t upload

Когда в консоли появится сообщение Connecting..., нужно перевести плату в режим загрузки. На моей ESP32-S3 Super Mini это делалось так:

  1. зажать Boot

  2. нажать Reset

  3. отпустить Reset

  4. через секунду отпустить Boot

После этого прошивка начинает загружаться на контроллер.

Что получилось у меня

Готовая самодельная нода. (1 рис)
Готовая самодельная нода. (1 рис)
Готовая самодельная нода. (2 рис)
Готовая самодельная нода. (2 рис)

Выглядит конечно неаккуратно, но это работает! Далее планирую избавиться от проводов и все распаять на плате.