Mesh-PI is, as far as I know, the smallest SX1262 LoRa board ever made for the Raspberry Pi. It's built around the ultra-small 10×10 mm Ebyte E22-900MM22S (Semtech SX1262, 868/915 MHz) module — the board is barely bigger than the module itself.
It's designed to run Meshtastic with the Linux-native daemon meshtasticd, but since it's just a plain SX1262 on the SPI bus, it works with any LoRa / LoRa-mesh stack — Meshtastic, Reticulum / RNode, your own RadioLib project… Ideal for a compact, always-on router / MQTT gateway node, with the full power of Linux behind it: SSH, MQTT, Home Assistant, scripting…
Version 1.0
- Placement for Ebyte E22-900MM22S module — SX1262, 868/915 MHz ISM, up to 22 dBm, ~7 km range, 10×10 mm
- u.FL antenna connector — or solder an edge-mount SMA connector / wire antenna instead
- 2 status LEDs (Green = OK, Red = fault) driven from GPIO
- Powered straight from the Pi 3.3 V rail, with proper bulk + low-ESR decoupling (100 µF tantalum + 47 µF MLCC + 100 nF)
- Designed for
meshtasticd(Meshtastic Linux-native)
Mesh-PI is deliberately minimal and purpose-built for a static router node — small, cheap, efficient, and it does exactly that job, perfectly.
- No GPS — on purpose. Dropped to save space and cost. A fixed router doesn't move, so its location is set once as a fixed position in Meshtastic; an on-board GPS would only add size, price and power draw for nothing.
- 22 dBm — on purpose. The board uses the SX1262's native 22 dBm rather than a 1 W (30 dBm) amplified front-end. Going 1 W would mean tapping the Pi 5 V rail and adding a dedicated 3.3 V regulator for the extra current — which would blow up the whole "tiny shield" idea. At 22 dBm the module runs straight off the Pi 3.3 V and stays cool. The E22-900 covers 850–930 MHz, so it works in EU868 (where 22 dBm is capped to the legal limit) as well as US915 and the other 900 MHz regions — where the full 22 dBm is usable.
Small, focused, and it just works. 🎯
SPI is the classic MOSI / MISO / SCLK. NSS (chip-select) sits on GPIO26 — a free GPIO, not CE0 — to avoid the cs-gpios conflict of recent Raspberry Pi kernels (meshtasticd / RadioLib drives it directly). The RF switch uses DIO2 for TX (DIO2_AS_RF_SWITCH) and a GPIO for RX.
Raspberry PI E22-900MM22S (SX1262)
GPIO26 <----> NSS (chip select)
SCLK <----> SCK
MOSI <----> MOSI
MISO <----> MISO
GPIO23 <----> NRST (reset, active low)
GPIO22 <----> BUSY
GPIO24 <----> DIO1 (IRQ)
GPIO27 <----> RXEN
DIO2 <----> TXEN (tied together -> DIO2_AS_RF_SWITCH)
DIO3 : not connected (32 MHz XTAL on module, no TCXO)
Raspberry PI On Board LEDs
GPIO18 <----> Green LED (status OK)
GPIO17 <----> Red LED (fault)
Install the Meshtastic Linux daemon (see the official docs), then declare the radio in /etc/meshtasticd/config.yaml:
Lora:
Module: sx1262
CS: 26
IRQ: 24
Busy: 22
Reset: 23
RXen: 27
DIO2_AS_RF_SWITCH: true
# No DIO3_TCXO_VOLTAGE — the E22-900MM22S uses a passive 32 MHz XTAL, not a TCXO
⚠️ Do NOT setDIO3_TCXO_VOLTAGEon this board. The MM22S variant is crystal-based; setting it would tell the SX1262 to power a non-existent TCXO and the radio would fail to init (-707). (The larger M22S is TCXO — that's a different module.)
Enable SPI and set the boot state of the reset / LED pins in /boot/firmware/config.txt:
dtparam=spi=on
# Keep the radio out of reset from the bootloader (NRST is active-low -> drive high)
gpio=23=op,dh
# LEDs off at boot (active-high -> drive low)
gpio=17,18=op,dl
Then set the LoRa region and node role from any Meshtastic client, or the CLI:
meshtastic --host localhost --set lora.region EU_868 --set device.role ROUTER
The two on-board LEDs give an at-a-glance health status, blinked from GPIO by a small systemd service:
- 🟢 Green (GPIO18) blinks when WiFi and
meshtasticdare both up - 🔴 Red (GPIO17) blinks when either one is down
The script is scripts/monitoring-led.sh (uses gpioset from libgpiod v2).
# 1. Copy the script in place
sudo install -m 0755 scripts/monitoring-led.sh /usr/local/bin/monitoring-led.sh
# 2. Create the systemd service
sudo tee /etc/systemd/system/monitoring-led.service > /dev/null <<'EOF'
[Unit]
Description=Mesh-PI monitoring LEDs (green=OK, red=fault)
After=NetworkManager.service meshtasticd.service
[Service]
Type=simple
ExecStart=/usr/local/bin/monitoring-led.sh
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
# 3. Enable + start (runs at every boot)
sudo systemctl enable --now monitoring-ledCheck with systemctl status monitoring-led — the green LED should start blinking. The gpio=17,18=op,dl line in config.txt above keeps both LEDs off during boot, before the service takes over.
This design is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License — build it, tweak it, share it, but not for commercial use.
If I put a batch of these on Lectronz, you'll be able to order one there.
News and other projects on my blog.




