Готовую 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на ESP32GNDкGNDTXадаптера кRXплатыRXадаптера кTXплаты
После этого подключаем адаптер к компьютеру. Обычно драйверы ставятся автоматически.
Для загрузки прошивки используем:
pio run -e EBYTE_ESP32-S3 -t upload
Когда в консоли появится сообщение Connecting..., нужно перевести плату в режим загрузки. На моей ESP32-S3 Super Mini это делалось так:
зажать
Bootнажать
Resetотпустить
Resetчерез секунду отпустить
Boot
После этого прошивка начинает загружаться на контроллер.
Что получилось у меня


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