LoRa on Pi

// raspberry pi optionsRaspberry Pi, Dire Wolf & SDR

Operators already running a Raspberry Pi for other ham radio applications can integrate LoRa APRS without buying dedicated ESP32 hardware. The radiohound fork of Dire Wolf adds native LoRa support via two paths: a hardware SPI path for LoRa Pi HATs (full TX + RX), and a software-defined radio path for RTL-SDR dongles (RX only via GNU Radio).

FeatureHardware SPI (LoRa HAT)SDR bridge (RTL-SDR)
ReceiveYesYes
Transmit (beacons, digi)YesNo — RTL-SDR is RX only
Hardware cost$15–40 (LoRa HAT)~$25 (RTL-SDR dongle)
CPU — Raspberry Pi 3~0.5%~20–35%
CPU — Raspberry Pi 5~0.2%~8–15%
Decode qualityChip-nativeGood — SF7–SF12, BW 125 kHz
TX beaconsYes (via PBEACON)Dropped (logged only)
Dire Wolf directiveLCHANNEL (native SPI)NCHANNEL (KISS TCP)
Best use caseiGate + digipeaterRX-only iGate / monitoring

// hardware pathRaspberry Pi + LoRa HAT (TX & RX)

Attaching a LoRa HAT to the Raspberry Pi GPIO header gives you a full iGate and digipeater with transmit capability. HATs using the SX1276 or SX1278 chip connect via SPI and are supported by the radiohound Dire Wolf fork via the LCHANNEL directive.

Primary Software

Dire Wolf lora-spi Fork

Adds native SPI bus support for LoRa modules to Dire Wolf. The fork uses the LCHANNEL directive to configure the SPI LoRa radio as a channel. Full iGate, digipeater, KISS TNC, and APRS-IS functionality. Very low CPU overhead — suitable for Pi 3, Pi Zero.

  • Supports SX1276 / SX1278 (1st gen) and SX1262 / SX1268 (2nd gen) chips
  • SPI must be enabled via raspi-config before use
  • Full Dire Wolf feature set: iGate, digipeater, KISS TNC
  • Check the branch README for current build instructions
radiohound / direwolf — feature/lora-spi
Alternative Software

RPi-LoRa-KISS-TNC-2ndgen

A Python-based KISS TNC that controls a LoRa module via SPI and presents a standard KISS TCP interface to any APRS software. Useful when the Dire Wolf fork doesn’t support your specific hardware, or when you prefer a Python-based approach.

  • Supports both SX127x (1st gen) and SX126x (2nd gen) chips
  • Presents KISS TCP interface on a configurable port
  • Works with older LoRa APRS iGate HATs
  • Pin assignments (DIO1, BUSY, TXEN, RXEN) need configuring per board
IZ7BOJ / RPi-LoRa-KISS-TNC-2ndgen

Compatible LoRa HATs

Any HAT using the SX1276 or SX1278 chip connected via SPI should work. Common options include boards from Dragino, Waveshare, and ioT4Pi. Always verify the GPIO pin assignments (CS, RESET, DIO0/IRQ) match the software configuration before building.

SPI setup required Before using any LoRa SPI HAT, enable the SPI interface on your Raspberry Pi: run sudo raspi-config → Interface Options → SPI → Enable. Reboot after enabling. Without this step, the software cannot communicate with the LoRa chip.

// sdr receive pathRTL-SDR + GNU Radio — Software LoRa Decode (RX Only)

The radiohound Dire Wolf fork also supports receiving LoRa APRS via an RTL-SDR dongle — no dedicated LoRa hardware required. Raw IQ samples from the RTL-SDR are fed into GNU Radio’s gr-lora_sdr blocks for full Chirp Spread Spectrum demodulation, then bridged to Dire Wolf via KISS TCP.

Important: this is different from standard Dire Wolf + rtl_fm Standard Dire Wolf piped from rtl_fm only decodes VHF APRS (144.390 MHz, 1200 baud AFSK). It cannot decode LoRa because LoRa uses CSS modulation, not FM audio. The radiohound fork’s lora_sdr_bridge.py adds proper CSS demodulation via GNU Radio — a completely separate decode path.
SDR bridge signal path
RTL-SDR dongle
  | USB — IQ samples ~1 Msps
  ▼
GNU Radio (gr-lora_sdr blocks)
  | demodulate Chirp Spread Spectrum
  | decode LoRa frames + SNR metadata
  ▼
lora_sdr_bridge.py
  | strip non-printable preamble bytes
  | validate TNC2 header
  | encode as AX.25 UI frame, wrap in KISS
  ▼ TCP KISS server (port 8002)
Dire Wolf (NCHANNEL 10  127.0.0.1  8002)
  ▼
APRS-IS iGate / decoder
The bridge acts as the KISS TCP server; Dire Wolf connects to it using the NCHANNEL directive. This directive is available in WB2OSZ’s dev branch and Dire Wolf 1.9+. The native SPI driver uses LCHANNEL for LoRa HATs wired directly to the Pi.
Use the SDR bridge when
  • You only need to receive and gate LoRa APRS — no TX needed
  • You already have an RTL-SDR dongle for other purposes
  • You do not have a LoRa hardware HAT
  • You have a Raspberry Pi 4 or 5 — Pi 3 will spend 20–35% CPU on GNU Radio
Use the hardware bridge when
  • You need to transmit — beacons, digipeating
  • CPU budget is tight — Pi 3, Pi Zero will struggle with GNU Radio
  • You want chip-native decode quality
  • You prefer a simpler LCHANNEL config with no external bridge process

Recommended RTL-SDR Hardware

Any RTL2832U-based dongle works, but a TCXO (Temperature Controlled Crystal Oscillator) model is strongly recommended for stable frequency accuracy. Cheap dongles without TCXO drift significantly, which can cause decode failures. The RTL-SDR Blog V3 or V4 and NooElec NESDR SMArt are reliable choices at around $25–30.


// combined setupRunning Both VHF APRS and LoRa on One Pi

A Raspberry Pi can run both a LoRa APRS iGate and a VHF APRS iGate simultaneously — covering both networks from a single piece of hardware. The two paths run as separate Dire Wolf instances on different ports, each gating to APRS-IS independently.

LoRa APRS iGate

LoRa HAT via SPI → Dire Wolf (lora-spi fork) → APRS-IS on port 14580. Uses LCHANNEL. ~0.5% CPU on Pi 3.

VHF APRS iGate

RTL-SDR → rtl_fm -f 144.39M → standard Dire Wolf → APRS-IS on port 14580. ~15–20% CPU on Pi 3.

Optional: SDR LoRa monitor

Second RTL-SDR → GNU Radio → lora_sdr_bridge → Dire Wolf NCHANNEL. Adds a software LoRa receive path. Pi 4/5 recommended for this combination.

Pi 4 / Pi 5 recommendation for combined stations On a Pi 3, running the LoRa SPI iGate plus the VHF RTL-SDR iGate is comfortable (total ~20% CPU). Adding the GNU Radio SDR LoRa bridge on top pushes Pi 3 to its limits. A Pi 4 or Pi 5 handles all three paths simultaneously with headroom to spare.

// resourcesCommunity & Further Reading

The radiohound Dire Wolf fork is actively developed. Build instructions, configuration examples, and troubleshooting are best found in the repository README and the LoRa APRS Discord community.

Primary Repository

radiohound / direwolf

The lora-spi feature branch of Dire Wolf. Contains both the SPI hardware driver (LCHANNEL) and the SDR bridge documentation (lora_sdr_bridge.py / NCHANNEL). Read the README and the LoRa-specific documentation files before building.

radiohound / direwolf — feature/lora-spi
Community

LoRa APRS Discord

The active hub for Pi-based iGate questions, Dire Wolf configuration help, hardware recommendations, and troubleshooting. Most active developers and early adopters of the lora-spi fork are reachable here.

Join Discord — discord.gg/rYnBNQHdeu