Raspberry Pi + Dire Wolf + systemd (iGate / Digipeater)
Scope and Design Goals
This guide documents a production-style APRS DigiPi deployment using:
- Raspberry Pi (Zero 2 W, 3, or 4)
- External USB audio/PTT interface (CM108-based or equivalent)
- VHF FM radio (e.g., Baofeng UV-5R Mini)
- Dire Wolf as a software TNC
- systemd for deterministic startup, restart, and logging
Design Objectives
- Headless, unattended operation
- Deterministic startup and recovery
- RF-safe defaults (no loops, no over-TX)
- Minimal OS footprint
- Clean separation of config, runtime, and logs
Hardware Architecture
Required Components
| Component | Purpose |
|---|---|
| Raspberry Pi | Compute + Linux host |
| microSD (16–32 GB) | OS + logs |
| USB Audio/PTT Interface | Audio I/O + PTT control |
| VHF FM Radio | 1200-baud AFSK |
| Power Supply | ≥ 3A recommended |
| Antenna | Properly tuned for 144.390 MHz |
Hardware Notes
- Avoid VOX for packet operation
- Use fixed audio gain (no AGC, no “mic boost”)
- Keep TX duty cycle conservative
Operating System Preparation
Flash OS
Use Raspberry Pi OS Lite (64-bit preferred).
During imaging:
- Enable SSH
- Set locale/timezone
- Disable desktop environment
Initial System Hardening
sudo apt update && sudo apt full-upgrade -y
sudo apt install -y \
git \
build-essential \
cmake \
libasound2-dev \
libudev-dev \
libgps-dev \
libhamlib-dev \
libgpiod-dev \
avahi-daemon \
alsa-utils
Disable unnecessary services:
sudo systemctl disable bluetooth
sudo systemctl disable triggerhappy
Audio Device Verification
Plug in the USB audio interface.
arecord -l
aplay -l
You should see something like:
card 1: AllInOneCable [AllInOneCable], device 0
Test audio capture:
arecord -D plughw:CARD=AllInOneCable,0 -f S16_LE -r 48000 test.wav
Installing Dire Wolf
Build from Source (Recommended)
you can choose whatever directory you wish it doesnt have to be /usr/src
cd /usr/src
sudo git clone https://github.com/wb2osz/direwolf.git
cd direwolf
sudo mkdir build && cd build
sudo cmake ..
sudo make -j$(nproc)
sudo make install
sudo make install-conf
Verify installation:
direwolf -t 0
Directory Layout (Best Practice)
/etc/direwolf/
├── direwolf.conf
├── digipeater.conf
└── igate.conf
/var/log/direwolf/
└── direwolf.log
/run/direwolf/
└── runtime files (tmpfs)
Create directories:
sudo mkdir -p /etc/direwolf /var/log/direwolf /run/direwolf
sudo chown -R root:root /etc/direwolf
sudo chown -R pi:pi /var/log/direwolf
Dire Wolf Core Configuration
/etc/direwolf/direwolf.conf
# Audio device
ADEVICE plughw:CARD=AllInOneCable,0
ARATE 48000
# Callsign
MYCALL callsign-10
# Channel
CHANNEL 0
MODEM 1200
# PTT (GPIO example)
PTT GPIO 3
# TX timing (handheld-safe)
TXDELAY 300
TXTAIL 30
SLOTTIME 10
PERSIST 63
# Logging
LOGFILE /var/log/direwolf/direwolf.log
# Enable APRS
INCLUDE /etc/direwolf/igate.conf
INCLUDE /etc/direwolf/digipeater.conf
iGate Configuration
/etc/direwolf/igate.conf
IGSERVER noam.aprs2.net
IGLOGIN callsign-10 <APRS_PASSCODE>
# Gate RF → IS only for nearby traffic
IGFILTER m/30
# Disable IS → RF by default (safe)
IGTXVIA 0
Engineering rationale:
Start RF→IS only. Enable IS→RF later if explicitly required.
Digipeater Configuration
/etc/direwolf/digipeater.conf
DIGIPEATER 0 0
DUPCHECK 10
TRACE
# Conservative WIDE path
DIGIPEAT WIDE1-1
Avoid WIDE2-2 unless filling a known coverage gap.
systemd Service Unit
/etc/systemd/system/direwolf.service
[Unit]
Description=Dire Wolf APRS TNC
After=network.target sound.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/direwolf -c /etc/direwolf/direwolf.conf -t 0
Restart=always
RestartSec=5
User=pi
Group=pi
Nice=-5
LimitRTPRIO=99
WorkingDirectory=/run/direwolf
StandardOutput=append:/var/log/direwolf/direwolf.log
StandardError=append:/var/log/direwolf/direwolf.log
[Install]
WantedBy=multi-user.target
Enable and start:
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable direwolf
sudo systemctl start direwolf
Validation & Testing
Check Service Status
systemctl status direwolf
Monitor Logs
tail -f /var/log/direwolf/direwolf.log
Expected output:
- Audio device initialized
- Channel configured
- APRS-IS login successful
- Packet decodes visible
RF Calibration Checklist
- Receiver audio
- Dire Wolf shows clean decode stats
- No clipping warnings
- Transmit audio
- Other APRS stations decode reliably
- No splatter or over-deviation
- Timing
- PTT engages before AFSK
- No truncated packets
Operational HardeningPower Loss Recovery
- systemd auto-restart handles crashes
- Boot order ensures audio device ready
- No manual intervention required
Thermal & Duty Cycle
- Beacon ≥ 10 minutes
- Avoid unnecessary digipeating
- Monitor radio temperature empirically
Security Considerations
- No inbound ports required
- APRS-IS outbound only
- SSH key-based login recommended
- No GUI attack surface
Troubleshooting Matrix
| Symptom | Likely Cause |
|---|---|
| No decodes | Audio level / wrong device |
| CRC errors | Over/under modulation |
| TX but no decode | TXDELAY too short |
| APRS-IS disconnects | Network or passcode |
| RF loops | IS→RF enabled improperly |
Extensions & Enhancements
- GPS-disciplined beaconing
- Dual-radio RX/TX separation
- Solar + battery deployment
- Packet error rate (PER) logging
- APRS telemetry channels
Closing Notes
This DigiPi deployment demonstrates how low-cost hardware, when paired with disciplined system design, can deliver a reliable RF data node suitable for:
- Learning and experimentation
- Community APRS infrastructure
- Emergency communications support
- Edge telemetry systems
The key is not the hardware—it’s engineering restraint and observability.