Skip to content

Build a node ​

Prototype

MeshSat is a prototype in active development. Its dependability is unproven. Do not rely on it for life safety.

There are two versions. v0 is the bench unit the first tests ran on. v1 is the one meant to become a product. v1 has run since 21 September 2026: the wiring below is what is soldered on the bench unit, by the labels printed on the board. The Peli build is not finished.

v1: T-Beam Supreme ​

Parts ​

PartNotes
LILYGO T-Beam Supreme, 868 MHzESP32-S3, SX1262 LoRa, u-blox M10S GPS, AXP2101 power chip and a holder for one 18650 cell
RockBLOCK 9603with its 10-pin cable
One 18650 Li-ion cellwe use a Samsung INR18650-35E
Peli 1020 case135 x 90 x 43 mm inside. By the dimensions, the T-Beam (100 x 33 x 28 mm) and the RockBLOCK (45 x 45 x 16 mm) fit side by side; not dry-fitted yet. The Peli 1050 is the roomier fallback
IP68 panel-mount USB-Ccharging and flashing through the case wall. It must carry the data lines, not only power
12 mm momentary panel buttonwired across the T-Beam's own power button
Waterproof SMA bulkhead cable and an 868 MHz antennathe LoRa antenna sits outside the case
90 degree USB-C adapterabout 21 mm is left at the T-Beam's USB-C end, too little for a straight plug

Wiring ​

Four wires between the T-Beam's long header and the RockBLOCK's connector. Use the labels printed beside the pins on the T-Beam, in the left column of the long header; the schematic's connector numbers are not on the board.

T-Beam, printed labelRockBLOCK
TXD (GPIO43)pin 6, TXD (the modem's input)
RXD (GPIO44)pin 1, RXD (the modem's output)
DC5 (the 3.7 V rail the firmware switches on)pin 8, power in
GNDpin 10, GND

TXD and RXD are also on the 4-pin QWIIC socket. Never use DC1 for the modem: that is the board's own 3.3 V. The 2.4 GHz antenna for Bluetooth is on the board; only the LoRa antenna is external.

  • Leave RockBLOCK pins 7 (OnOff) and 9 (Li-Ion) unconnected. A floating OnOff means on.
  • The panel button goes across the T-Beam's power button (SW3 on the schematic, PWR_KEY to GND). A short press turns the node on, a long press turns it off, and the RockBLOCK goes off with it.
  • Screw the LoRa antenna on before the first power-up. The firmware transmits within seconds of booting, and LILYGO warns that transmitting without an antenna can damage the radio.
  • The RockBLOCK's antenna side faces the lid, towards the sky.

Power ​

The RockBLOCK runs from the T-Beam's DCDC5 rail at 3.7 V. The firmware switches it on at boot and keeps it on while the node runs, so incoming messages are not delayed. The rail is a step-down from the cell, so once the cell falls below about 3.8 V the modem's supply follows it. The RockBLOCK needs 3.0 V or more.

The Meshtastic firmware the T-Beam ships with keeps DCDC5 off. With that firmware the RockBLOCK stays dark, which is expected. It powers up once the MeshSat firmware is on.

v0: XIAO ESP32-S3 ​

PartNotes
Seeed Studio XIAO ESP32-S3the ESP32-S3 kit with the Wio-SX1262 on its B2B connector, 868 MHz
RockBLOCK 9603with its 10-pin cable
A 5 V source rated for at least 500 mAfor the RockBLOCK. A USB-C power bank works
XIAO ESP32-S3RockBLOCK
D6 (GPIO43)pin 6, TXD (the modem's input)
D7 (GPIO44)pin 1, RXD (the modem's output)
pin 8, power in: the 5 V source
GNDpin 10, GND, shared with the 5 V source

Use the XIAO's own pads

The Wio-SX1262 board also has pads labelled D5, D6 and D7, but on the ESP32-S3 kit they are not connected to anything. Wires on those pads leave the modem silent.

A power bank's USB-A port can switch itself off because the XIAO draws so little; use its USB-C port. Never feed 5 V into the XIAO's 5V pin while the XIAO is plugged into a computer: that pin is the USB supply line with no diode. Full wiring, power notes and a bench console for testing the modem link: BENCH.md.

Firmware ​

Build meshsat-firmware with PlatformIO Core 6.1.19. Version 6.2.0 stops with ModuleNotFoundError: SCons.Tool.FortranCommon.

sh
pip install "platformio==6.1.19"
git clone https://github.com/meshsat/meshsat-firmware.git
cd meshsat-firmware
pio run -e meshsat-tbeam-s3-rockblock     # v1; use meshsat-xiao-s3-rockblock for v0

Flash it over USB with esptool. Erase first on a board that ran something else:

sh
esptool --chip esp32s3 --port /dev/ttyACM0 erase-flash
esptool --chip esp32s3 --port /dev/ttyACM0 write-flash \
  0x0      .pio/build/meshsat-tbeam-s3-rockblock/firmware-meshsat-tbeam-s3-rockblock-*.factory.bin \
  0x670000 .pio/build/meshsat-tbeam-s3-rockblock/littlefs-meshsat-tbeam-s3-rockblock-*.bin \
  0x340000 mt-esp32s3-ota.bin

mt-esp32s3-ota.bin is Meshtastic's Bluetooth update loader, from the Meshtastic 2.8.0 release. It is not in the factory image, and without it the node cannot be updated from the phone.

Then set it up like any Meshtastic node, with the Meshtastic app or CLI: your region, an owner name, and Bluetooth pairing set to a fixed PIN of your own.

Updates ​

Released builds are on the releases page, each with its SHA-256. In MeshSat Android 2.22.8 or later, Settings > Satellite > Node firmware > Check for update asks GitHub for the latest release, picks the build your node runs, checks the download's size and SHA-256, and installs it over Bluetooth. The card shows the version on the node and the one available. Update from a file takes a firmware-<build>-<version>.bin you downloaded yourself. The node keeps its settings and its Bluetooth pairing.

Over USB, writing the app image alone at 0x10000 does the same.

Pair with MeshSat Android ​

In MeshSat Android 2.9.10 or later, open Settings, tap Scan for Meshtastic devices, and tap Connect next to your node. The scan lists every Meshtastic device in range, so pick the node by its name: v0 advertises as MSIR_ followed by four hex digits. Pair with your fixed PIN when the phone asks.

With Use the node's modem on (the default), the app takes the modem while it is connected. After a restart it reconnects to the same node and takes the modem back by itself. Disconnect in Settings stops that until you connect again. On v1 the modem answers about 10 seconds after power-up, and the app keeps asking until it does.