Full DigiPi APRS Deployment Guide

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

ComponentPurpose
Raspberry PiCompute + Linux host
microSD (16–32 GB)OS + logs
USB Audio/PTT InterfaceAudio I/O + PTT control
VHF FM Radio1200-baud AFSK
Power Supply≥ 3A recommended
AntennaProperly 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

  1. Receiver audio
    • Dire Wolf shows clean decode stats
    • No clipping warnings
  2. Transmit audio
    • Other APRS stations decode reliably
    • No splatter or over-deviation
  3. 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

SymptomLikely Cause
No decodesAudio level / wrong device
CRC errorsOver/under modulation
TX but no decodeTXDELAY too short
APRS-IS disconnectsNetwork or passcode
RF loopsIS→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.

Leave a Reply

Your email address will not be published. Required fields are marked *