Zero Node: Автономний Meshtastic Ретранслятор
Опубліковано 28.01.2026, 18:55 в категорії YouTube

Перед вами - проєкт над яким я працював весь останній час - це автономний репітер для мережі Meshtastic, який має гарну автономність, та забезпечить вас надійним зв'язком на відстанях аж до 10 кілометрів! Як я його зробив, які компоненти використав, та з якими труднощами стикнувся - про це все і буде сьогоднішня стаття!
Награвшись зі своїми портативними вузлами Meshtastic, я зрозумів що пора рухатись далі. Я хотів зробити зовнішній автономний вузол-ретранслятор, який би був енергоефективним, заряджався від сонця, мав би гарну антену, герметичний корпус, ну і щоб все це було ще й на платі, щоб цей вузол виглядав гарно та охайно, а не як ті що я робив до цього. Як бачите, планів зібралось немало, тож давайте про все по порядку.
Вибір мікроконтролера
Почалось все з вибору мікроконтролера. Наразі Meshtastic підтримує три основних чіпи:
- ESP32
- RP2040
- nRF52.
ESP32 це мабуть найбільш поширений в нас мікроконтролер, але на жаль і найменш енергоефективний. І хоч він і має крутий режим light sleep про який я дізнався згодом, від ESP32 я вирішив відмовитись.
nRF52 це найбільш енергоефективний мікроконтролер серед наведених. Навіть без всяких режимів сну, він споживає менше 10 мА струму, що ну дуже мало. Але на противагу цьому, він коштує немало грошей, і до цього я з ним не стикався, тому від нього я теж відмовився. Хоча вже після написання статті, та зйомки відео, я дізнався що існують девборди ProMicro NRF52840, які коштують набагато дешевше, але, нехай це буде темою для відео/статті якось іншим разом.
Ну і залишився RP2040 від Raspberry Pi. В плані енергоефективності він знаходиться посередині між ESP32 та nRF52, а також коштує значно менше за них. Тому, начитавшись в інтернеті що він споживає вдвічі менше енергії ніж ESP32, я вирішив обрати його, а саме двеборд RP2040 Zero.

Вибір радіодмодуля
Наступна задача - вибір радіомодуля. Я зупинився на радіомодулях Ra-01/Ra-02. Знаю що багато хто не оцінить такий вибір, адже їх вихідна потужність становить всього 20 dBm, тобто 100 мВт, що дуже мало. Але потужність це не найголовніший критерій зв'язку, куди важливіше буде антена та її висота. Наведу приклад:
5-го грудня німецький супутник SONATE-2 проводив SSTV трансляцію зображень, і його сигнал я спіймав на свою ATA антену, яка розрахована на 137 МГц, в той час як сигнал був на частоті 145 МГц. При цьому, потужність трансмітера супутника становить всього 500 мВт! Тобто - мала потужність, не зовсім підходяща антена, ще й відстань до супутника - мінімум 430 км. Але не дивлячись на все це, сигнал прекрасно чути, адже між моєю високо розташованою антеною, та супутником - була пряма видимість.
А отже високо розташований малопотужний вузол буде цілком справлятись зі своєю задачею. Більш того, модулі на 1-2 Вт потребують гарного лінійного живлення, яке набагато складніше реалізувати, через напругу живлення модулів, 5V, а отдже 1S акумулятори відпадають. Тому поки я зупинився саме на малопотужних модулях.
Але, якщо ця тема буде вам цікава, то можливо колись спробую зробити і потужний вузол, з правильним живленням.

Живлення
До речі про живлення. Я хочу щоб цей вузол живився від акумуляторів, мав можливість живитись від зовнішнього блока живлення, заряджаючи та використовуючи при цьому акумулятор як ДБЖ, ну і бонусом міг би заряджати акумулятори від сонячної панелі.
З зовнішньою зарядкою все зрозуміло - беремо платку TP4056, і все. Вона не тільки зарядить акумулятор, а і вбереже його від перерозряду.
Для зарядки від сонця я взяв MPPT модуль, CN3791. Його плюс полягає в тому, що змінюючи резистивний дільник на платі, модуль можна адаптувати під різні напруги сонячних панелей. Ще важливо, що це саме MPPT модуль, Maximum Power Point Tracker, а отже він є доволі ефективним, і зможе вичавити з сонячних панелей хоч якийсь струм навіть в доволі похмурі дні.

Стосовно сонячної панелі, я взяв ось таку панель на 3 Вт, з напругою 6В. Колись в магазині voron вона обійшлась мені в 260 грн. Навіть в зимні сонячні дні вона видає більше половини своєї потужності, що дуже непогано. Коли небо затягнуто щільними хмарами та йде сніг, потужність звісно набагато менше, але вона все одно є, тож це вже хоч трішки але сповільнить розряджання акумулятора. Але сонячна панель ніяк не прив'язана до майбутньої плати, і як я вже казав, модуль можна налаштувати під різні панелі, тож ви можете обрати і будь яку іншу панель. Я обрав саме такі, бо вони в мене вже були, і до цього не раз рятували під час блекаутів, заряджаючи мій павербанк навіть коли не було сонця.
Схема

Плюс мінус уявивши все це в голові, я склав схему майбутнього ретранслятора. Давайте розглянемо її трохи детальніше.
Спочатку напруга з акумулятора та зовнішнього блоку живлення потрапляє на мосфет IRLML6401. Якщо зовнішнє живлення присутнє, то мосфет закритий, і все живиться виключно від зовнішнього блока живлення. Як тільки зникає зовнішня напруга, відносно Source на Gate мосфета, через наявний всередині діод, напруга стане від'ємна, і мосфет P типу відкриється, і вузол буде живитись вже від акумулятора. Такий собі міні ДБЖ виходить. Цю ідею я до речі взяв зі схеми Лілки, і такий ж принцип використовується в девборді Lilygo T3S3, на основі якого багато хто робить свої вузли та репітери.
Після мосфета живлення потрапляє на LDO, Low Dropout Regulator, тобто лінійний стабілізатор з низьким падінням напруги, TLV1117LV33 на 3.3В. Ззовні він майже не відрізняється від поширеного лінійного стабілізатора AMS1117, корпус однаковий, розпіновка однакова, напруга однакова, але диявол криється в деталях. На відміну від AMS, TLV має менше падіння напруги та набагато краще переварює низькі напруги, навіть коли вхідна напруга дорівнює вихідній, тому він ідеально підходить для роботи з акумуляторами, і важливо використовувати саме його.

Просадка звісно присутня, але по перше таких струмів у репітері не буде, а по друге - навіть так, напруга не виходить за мінімально допустимі значення як для мікроконтролера так і для радіомодуля.
Тепер, коли напруга безпечна для мікроконтролера та радіомодуля, вона йде на невеличкий LC фільтр, який, як я сподіваюсь, прибере хоча б частину зайвих шумів, які будуть виникати внаслідок роботи TP4056 та CN3791, щоб на радіомодуль прийшла чиста та гарна напруга.
І в цілому на цьому схема живлення закінчується. Далі я додав мікроконтролер, радіомодуль, а також температурний датчик AHT10. До цього я ніколи не робив нічого подібного, що розміщувалось би на вулиці, та ще й мало б акумулятори, тому мені цікаво моніторити температуру всередині корпуса, адже акумулятори не дуже люблять низькі температури. В теорії цей датчик, або навіть будь який інший, можна також вивести за межі корпусу, і таким чином, бонусом до Meshtastic ретранслятора, ви отримаєте ще й міні метеостанцію.

Також тут є ще два резистивних дільника, один щоб дивитись напругу акумулятора, і один щоб детектити наявність зовнішнього живлення. Завершивши схему, я вирішив протестувати основні блоки.
Тести

Спочатку я припаяв все до мікроконтролера. Не звертайте уваги на зовнішній вигляд, адже це лише прототип, щоб впевнитись що все працює саме таке як задумано, бо до цього я не робив Meshtastic вузлів на цьому мікроконтролері. Так як RP2040 не має Bluetooth та WiFi, для налаштування вузла треба підключатись через Type-C, використовуючи застосунок, або command line інтерфейс.

Споживання струму виявилось значно більше ніж я очікував, в районі 40 мА. Це все ще менше ніж ESP32, навіть з вимкненим Bluetooth та екраном, але все ще дуже далеко до енергоефективності nRF52. Але не поспішайте розчаровуватись, RP2040 ще має один козир в рукаві, про який поговоримо згодом.
Тестуючи вузол далі, я дізнався одну невеличку прикрість в плані використання даного мікроконтролера. Meshtastic постійно перевіряє напругу акумулятора, і коли вона падає нижче за певний поріг, вузол переходить в глибокий сон на задану вами кількість часу. Через цю певну кількість часу вузол прокидається, і знову дивиться на напругу. Якщо вона збільшилась - він повністю прокидається, і починає працювати. Якщо ні - знову відправляється в глибокий сон, і так по колу.
Так ось, досліджуючи вихідний код Meshtastic, я помітив, що RP2040 не вміє нормально виходити з цього сну, так званого dormant моду, і тому для відновлення працездатності пристрій просто перезавантажується, тож про гарний uptime можете забути)0 Це звісно сумно, адже пройде певний час поки вузол знову піде в глибокий сон, а отже він буде споживати більше струму в той час коли насправді повинен спати, але думаю на це можна закрити очі, адже в режимі глибокого сну вузол споживає всього лише 1-2 мА, тож воно того точно варте.
Ще одна умовність полягає в тому, що коли напруга акумулятора впаде нижче за 3.3V, LDO перестає її стабілізувати, тож якщо наприклад на акумуляторі буде 3V, ці ж 3V, або навіть менше, будуть і на мікроконтролері. Тому мікроконтролер тут не може міряти напругу акумулятора нижче за 3.3V, адже в такому випадку референсна напруга аналогово-цифрового перетворювача буде постійно падати, синхронно з вимірюваною напругою. Це можна було б легко виправити, додавши інше опорне джерело напруги, але на жаль на RP2040 Zero потрібний пін нікуди не виведено.
Тому я додав в конфіг плати трохи іншу криву розряду, щоб вузол йшов в глибокий сон вже при 3.4V на акумуляторі. Все одно при цій напрузі акумулятор вже віддав майже всю свою енергію, плюс буде невеличкий запас на оці прокидання мікроконтролера:
#define OCV_ARRAY 4190, 4050, 3990, 3890, 3800, 3750, 3700, 3650, 3600, 3500, 3400
Далі я протестував схему ДБЖ.

Для цього я спаяв його на макетній платі, та підпаяв до свого портативного вузла. Чому саме його, спитаєте ви? Все просто - він має екранчик, а також споживає більше струму, тож дозволить по перше візуально побачити що вузол не вимкнувся, а по друге трохи більше навантажити сам ДБЖ.
За наявності живлення, як і задумувалось, все живиться від зовнішнього блока живлення - струм з акумулятора не йде. Але слід розірвати коло, як струм одразу потече з акумулятора, при цьому вузол не перезавантажується. Слід повернути напругу назад - і вузол одразу перемикається на зовнішнє джерело, знову ж таки, без перезавантаження. Чудово!
Плата

Впевнившись що все працює як і задумано, на основі схеми я спроєктував ось таку плату. Звісно можна було б використовувати не модулі, а повноцінно розвести все на одній платі, але по перше це тестовий варіант, а по друге, в нас часто буває легше дістати саме модулі, а не мікросхеми окремо. Плату я проєктував під корпуси розміром 115 на 90 мм. В репозиторії якщо що будуть вказані підходящі корпуси, тож можете подивитись їх креслення і підібрати інший, якщо потрібно.
Спочатку я хотів додати на плату холдер під акумулятори 18650, але пізніше передумав, адже по перше - він займає дуже багато місця на платі, а по друге - він прив'язує користувача до конкретного типорозміру та кількості акумуляторів. Тому натомість я додав коннектор XT-30, а що саме туди буде підключено, залежить вже від вас. Але пам'ятайте що все це йде на TP4056, а отже це повинен бути якийсь 1S Li-Ion або Li-Pol акумулятор.
Також я додав місце під антенний конектор U.FL, на випадок якщо використовується модуль Ra-01, адже він такого конектора не має.
На цьому плата була завершена.
А з втіленням її в реальність мені допоміг спонсор цього проєкту - PCBWay! Я вже не вперше замовляю плати на PCBWay, тому сміливо можу вам їх радити, якість завжди дуже гарна, і навіть дуже дрібні деталі виконані просто бездоганно. Тож якщо вам для ваших проєктів потрібні плати - обов'язково звертайтесь до PCBWay!

Пайка
Тепер, маючи плати, можна запаяти деталі. Гарною практикою є спочатку запаювати маленькі деталі, а вже потім великі. Виключенням в мене став лише дросель, так як замовляючи його, я випадково замовив трішки більший розмір, і через доволі щільне компонування деталей, спочатку я запаяв його.

Ось така виходить крута плата. Звісно місцями кривувато, але це лише тому що я паяв під камерою. Без камери це набагато зручніше робити, тому деякі косяки я виправляв за кадром. Тож не звертайте уваги на деякі моменти які були в відео, я нормально паяю, чесно, правда))00
Це до речі мабуть моя перша плата, яка вийшла взагалі без проблем. Нічого не переплутано, все гарно виглядає, і все працює. Щоправда знайшлась одна проблема в схемотехніці. Як виявилось високоомний дільник гарно підходить для вимірювання напруги, але чомусь зовсім не підходить для детекції відсутності напруги. Хоч я і зробив в коді пін підтягнутим до землі, на ньому все одно звідкілясь була присутня напруга, і вузол завжди думав що напруга є. Я не знаю чи це проблема з Raspberry Pi, чи з конкретно моїм мікроконтролером, або ще з чимось, але я замінив резистори дільника на десятикілоомні і все працює як слід.
Також на пізніх етапах тестування я помітив, що діод D1, який я додав для захисту MPPT модуля, заважає йому нормально працювати, так як він унеможливлює зворотній зв'язок з акумулятором, тому його треба замінити на перемичку.
Прошивка мікроконтролера та тести

Цікавою особливістю RP2040 є те, що для прошивки не треба встановлювати ніяких драйверів та утиліт. Достатньо просто затиснути кнопку BOOT мікроконтролера, і підключити його до комп'ютера або телефону. Мікроконтролер в такому випадку підключиться у вигляді звичайного флеш накопичувача, на який достатньо буде скинути спеціальний .uf2 файл з прошивкою, і все.
Трохи почекавши, мікроконтролер перезавантажиться і почне працювати. Дуже зручно наприклад для оновлення прошивки віддалених репітерів, щоб не тягнути з собою ноутбук в якесь там поле або на гори.
Енергоспоживання
Ну а маючи працюючу плату на руках, я продовжив експериментувати з вузлом, тож тепер саме час поговорити про козир RP2040 про який я казав раніше. Копаючись в коді проєкту, я побачив що ми маємо змогу зменшити тактову частоту мікроконтролера зі 133 МГц до 18 МГц. Це повинно значно зменшити енергоспоживання вузла, хоча натомість це додасть невеличкі незручності - наприклад перестане працювати USB, а отже для керування треба буде використовувати зовнішній UART перетворювач.
І це виявилось невеличкою проблемою, адже за замовчуванням, при зменшенні тактової частоти код перенаправляє комунікацію на другий UART, піни якого в мене зайняті радіомодулем та датчиком температури. Тому довелось правити код, щоб комунікація відбувалась на першій лінії, де стоїть світлодіод, бо ним не так шкода пожертвувати, як I2C лінією.
Давайте подивимось, скільки вузол споживає зі зменшеною частотою.

Просто неймовірно! Споживання впало аж вдвічі. Тож використання RP2040 в якості мікроконтролера можна вважати повністю виправданим рішенням, адже при повністю зарядженому акумуляторі, в простої вузол споживає всього лише близько 90 мВт. А якщо ще й прибрати світлодіод та температурний датчик, то можна ще пару міліват виграти.
Проблеми
Щоправда, деякі нюанси таки є. Можливо це лише в мене так, але при низькій тактовій частоті вузол не виконує команди по UART. Тобто він приймає команду, відповідає на неї, але не виконує. Неможливо ані налаштувати вузол таким чином, ані відправити повідомлення. І неважливо звідки та команда прийшла, з застосунку на телефоні, чи з термінала на комп'ютері.
Але при цьому вузол продовжує повноцінно функціонувати по LoRa, тобто він відповідає на радіо команди, ретранслює повідомлення, і так далі. Тобто роль саме репітера в такому випадку він виконує без питань. А щоб його налаштувати, можна спочатку залити звичайну прошивку, далі налаштувати вузол через застосунок або command line інтерфейс, і вже після цього залити прошивку зі зменшеною тактовою частотою.
Налаштування зберігаються в пам'яті мікроконтролера, тож він їх завантажить і буде працювати як треба. Тому в репозиторії ви зможете знайти два варіанти прошивки, а також невеличку інструкцію по компіляції. Я не став робити форк репозиторія Meshtastic, а натомість зробив гіт патч, так як зміни там дуже незначні.
То скільки то все пропрацює?
В цілому, знаючи споживання вузла, та ємність акумуляторів, можна приблизно прикинути скільки то все пропрацює в найгірших умовах - тобто взагалі без зарядки. Але розрахунки це одне, а практика це інше, тому мені захотілось підійти більш емпіричним шляхом. Я написав невеличкий bash скрипт, який, використовуючи інший вузол, раз на 15 хвилин по радіоканалу запитує телеметрію з цього вузла - напругу, uptime, і тд, і логує все це в файл:
#!/bin/bash
while true
do
date "+%d.%m.%Y %H:%M:%S"
meshtastic --port /dev/ttyUSB0 --request-telemetry --dest '!12345678'
sleep 900
echo " "
done | tee -a telemetry_logs
Тобто це і зімітує активність в мережі, і дозволить побачити максимальний uptime, якого вдасться досягти. В якості акумуляторів я взяв два акумулятори 18650 ємністю приблизно 3000 мАг, тобто в загальному 6000 мАг, і залишив все це лежати на деякий час.

Чесно кажучи мені вже навіть набридло чекати поки акумулятори розрядяться))00 Без всякої зовнішньої підзарядки вузол пропрацював більше чотирьох діб, і навіть не думав зупинятись. Акумулятор при цьому не розрядився навіть на половину, і навіть не встиг вийти на свою номінальну напругу.
Тож я думаю такий сетап повинен пропрацювати більше тижня, а саме 10-11 діб якщо вірити розрахункам. Хотілось звісно висадити акумулятор повністю, але на це не було часу, адже треба було продовжувати зйомку відео. Звісно, якщо у вас висока активність в мережі, значення буде менше, але тим не менш, це неймовірно гарний результат. За такий період точно повинно хоч раз вийти сонечко, і підзарядити акумулятори.

І в цілому, на цьому основа репітера вже готова. Далі все залежить від вас - яку антену ви використаєте, які акумулятори, яку сонячну панель, як то все будете кріпити, і так далі - проєкт в цьому плані вийшов доволі модульним. Якщо ж вам цікаво як поступив я - то я закріпив все на поліпропіленовій трубі, використовуючи тримачі для труб. В корпусі як раз були отвори під гвинти.
В якості антени ж я використав саморобну J-pole антену. Трішки складнувато було звісно її узгодити, але результати в неї дуже гарні. Якщо вас таке цікавить, можливо колись зроблю про неї окреме відео та статтю.
Сонячну панель в свою чергу я тимчасово приклеїв на тримач для труби за допомогою термоклею. Наголошую - тимчасово. По перше, термоклей не дуже годиться для використання на вулиці, особливо коли там спека, а по друге, для максимізації ефективності, панель повинна бути нахилена на певний градус. Оптимальний градус для вашого регіону можна подивитись в інтернеті, але в мене на жаль не було часу вигадувати якесь більш ефективне кріплення, та і подібний кут теж має свої переваги - менше шансів що панель засипле снігом.
Всередині корпусу, за допомогою дихлорметану я приклеїв тримач для акумуляторів, до якого потім підпаяв дроти та конектор. Дихлорметан буквально плавить пластик, змушуючи його змішуватись в таку єдину, липку, в'язку масу, а коли він випарується, пластик повернеться до первинного стану, і виникне з'єднання набагато міцніше ніж якби все це фіксував звичайний клей.

В іншій частині корпусу я просвердлив отвір під гермоввід для дроту з сонячної панелі, а також під пігтейл для при'єднання антени. Звісно, цей пігтел взагалі не герметичний, але нагадаю що цей репітер це лише тестовий варіант, який я не зможу довго тримати на вулиці через своє доволі близьке розташування до лінії фронту, але колись я таки сподіваюсь протестувати його на повну.

Тепер слід зафіксувати плату всередині. Це можна зробити якісно, а саме вплавити або вклеїти в отвори корпуса спеціальні гайки під гвинтики М3. Або можна зробити швидко - зафіксувати плату маленькими саморізами. Монтажний отвір на платі має діаметр рівно 3мм, завдяки чому плату можна зафіксувати і так і так, але особисто я оберу другий варіант.

По ітогу вийшло щось таке.
В моєму випадку, я прикрутив поліпропіленову трубку до іншої, металевої, використовуючи антенні скоби. І тепер, підіймаючи цю трубку, я маю дуже гарний лінк з іншим Meshtastic вузлом, розташованим за 10 кілометрів від мене, сидячи при цьому в себе в кімнаті. Тож мої слова про потужність з початку відео підтверджені - гарна антена, гарна висота, і буде якісний зв'язок навіть з малими потужностями.

Звісно я не кажу що будь який вузол в радіусі 10 кілометрів зможе докричатись до цього репітера - ні. Слід розуміти, що гарна антена та висота повинна бути на обох кінцях, і лише коли мережа буде достатньо розвинена, тоді і наземні пристрої без проблем зможуть зв'язатись з тим, ким треба.
На цьому я вважаю статтю завершеною, але сам проєкт - ні. Я ще дуже багато чого хочу спробувати, та протестувати, але на жаль безпекова ситуація в моєму селищі, а також брак часу - не дають це зробити. Але я сподіваюсь колись ще повернутись до цього ретранслятора, поки я робив це відео мені довелось багато так копатись в коді Mesthastic, завдяки чому я тепер трохи ліпше розумію що там відбувається під капотом на хардварному та софтварному рівні.
Нагадаю, що проєкт повністю відкритий, і ви можете також його повторити - я створив репозиторій в якому є і плата, і креслення, і інструкція по компіляції прошивки якщо вам треба щось змінити, або якщо не треба - там будуть вже і готові .uf2 файли.
Post Scriptum
Це текстова версія мого відео, доступного за посиланням.