Aviation and Pirate Radio Monitoring Station Design

Complete Aviation Monitoring Station Design

Overview

This document outlines a comprehensive aviation monitoring station capable of receiving:

  • ADS-B (1090 MHz): Aircraft positions, altitudes, speeds, and flight data
  • VHF ACARS: Traditional line-of-sight aircraft data link communications
  • VDL Mode 2: Digital successor to plain ACARS
  • Satellite AERO (L-band): Inmarsat-based aircraft communications (~1.5 GHz)
  • HFDL (Optional): HF Data Link for oceanic/polar communications (2-22 MHz)

The station includes a dual-TV display system for real-time visualization.


System Architecture

┌─────────────────────────────────────────────────────────────────────────────────┐
│                         AVIATION MONITORING STATION                             │
├─────────────────────────────────────────────────────────────────────────────────┤
│                                                                                 │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐           │
│  │  ADS-B   │  │   VHF    │  │  L-Band  │  │    HF    │  │  ADS-B   │           │
│  │ Antenna  │  │ Antenna  │  │  Patch   │  │ Antenna  │  │ Antenna  │           │
│  │ (1090)   │  │(Airband) │  │(Inmarsat)│  │(Optional)│  │(978 UAT) │           │
│  └────┬─────┘  └────┬─────┘  └────┬─────┘  └────┬─────┘  └────┬─────┘           │
│       │             │             │             │             │                 │
│       │             │        ┌────┴────┐        │             │                 │
│  ┌────┴────┐        │        │   LNA   │        │        ┌────┴────┐            │
│  │ Filter  │        │        │(SAWbird)│        │        │ Filter  │            │
│  │ (1090)  │        │        └────┬────┘        │        │ (978)   │            │
│  └────┬────┘        │             │             │        └────┬────┘            │
│       │             │             │             │             │                 │
│  ┌────┴────┐  ┌────┴────┐  ┌────┴────┐  ┌────┴────┐  ┌────┴────┐                │
│  │FlightAw │  │ RTL-SDR │  │ RTL-SDR │  │ SDRplay │  │ RTL-SDR │                │
│  │ProStick+│  │   V4    │  │   V4    │  │  RSPdx  │  │   V4    │                │
│  └────┬────┘  └────┬────┘  └────┬────┘  └────┬────┘  └────┬────┘                │
│       │             │             │             │             │                 │
│       └─────────────┴─────────────┴─────────────┴─────────────┘                 │
│                                   │                                             │
│                          ┌────────┴────────┐                                    │
│                          │ Powered USB 3.0 │                                    │
│                          │   Hub (10-port) │                                    │
│                          └────────┬────────┘                                    │
│                                   │                                             │
│                          ┌────────┴────────┐                                    │
│                          │   Mini PC       │                                    │
│                          │  (Intel N100)   │                                    │
│                          │  Dual HDMI Out  │                                    │
│                          └───┬─────────┬───┘                                    │
│                              │         │                                        │
│                        ┌─────┴───┐ ┌───┴─────┐                                  │
│                        │  TV 1   │ │  TV 2   │                                  │
│                        │ (Map)   │ │(Messages│                                  │
│                        │         │ │& Stats) │                                  │
│                        └─────────┘ └─────────┘                                  │
│                                                                                 │
└─────────────────────────────────────────────────────────────────────────────────┘

Hardware Components

1. ADS-B Reception (1090 MHz)

ADS-B is the backbone of modern aircraft tracking. Most commercial aircraft broadcast position, altitude, velocity, and identification.

ComponentRecommended OptionApproximate CostNotes
SDRFlightAware Pro Stick Plus$25Built-in LNA and 1090 filter, excellent
SDR (Alt)RTL-SDR Blog V4 + Filter$55More flexible, similar performance
AntennaFlightAware 1090 MHz$45Purpose-built, good gain
Antenna (Better)DPD Productions ADS-B$60Excellent performance
Antenna (DIY)Cantenna or Spider$15Fun project, decent results
FilterRTL-SDR 1090 Bandpass$20Essential if not using Pro Stick Plus
CableLMR-400 or RG-8X$30-50Low loss, keep under 50 ft

Optional: 978 MHz UAT (US Only)

UAT is used by general aviation in the US below 18,000 ft. Adds coverage for smaller aircraft.

ComponentRecommended OptionApproximate CostNotes
SDRRTL-SDR Blog V4$40Dedicated receiver
FilterRTL-SDR 978 Bandpass$20Reduces 1090 interference
AntennaShared with 1090 or separate$0-45Dual-band antenna works

2. VHF ACARS / VDL Mode 2 Reception

ComponentRecommended OptionApproximate CostNotes
SDRRTL-SDR Blog V4$40Excellent sensitivity, bias-tee
AntennaDiamond D130NJ Discone$100Wideband, good for airband
Antenna (Budget)RTL-SDR Blog Dipole Kit$25Configurable for 130 MHz
FilterRTL-SDR 1090 MHz Bandstop$15Reduces ADS-B interference
CableLMR-400 or RG-8X$30-50Keep runs under 50 feet

VHF ACARS Frequencies (North America):

FrequencyUsage
129.125 MHzACARS
130.025 MHzACARS
130.425 MHzACARS
130.450 MHzACARS
131.125 MHzACARS
131.475 MHzACARS (Delta primary)
131.550 MHzACARS (Primary/Universal)
136.700 MHzVDL Mode 2
136.750 MHzVDL Mode 2
136.800 MHzVDL Mode 2
136.900 MHzVDL Mode 2
136.975 MHzVDL Mode 2

3. Satellite AERO (L-Band Inmarsat) Reception

ComponentRecommended OptionApproximate CostNotes
SDRRTL-SDR Blog V4$40Bias-tee powers the LNA
LNANooelec SAWbird+ GOES$35Tuned for L-band
AntennaRTL-SDR Blog L-Band Patch$45Purpose-built for Inmarsat
Antenna (DIY)7-turn RHCP Helix$20Better gain, requires build
MountCamera tripod or custom$20-50Must point at satellite

Inmarsat Satellites for AERO:

SatellitePositionCoverageFrequency Range
Inmarsat 4-F398.0° WAmericas1545-1547 MHz
Inmarsat 3-F454.0° WAtlantic West1545-1547 MHz
Inmarsat 4-F1143.5° EAsia-Pacific1545-1547 MHz
Inmarsat 4-F263.9° EEMEA1545-1547 MHz
Inmarsat 3-F215.5° WAtlantic East1545-1547 MHz

4. HFDL Reception (Optional)

ComponentRecommended OptionApproximate CostNotes
SDRSDRplay RSPdx$250Excellent HF performance
AntennaMLA-30+ Active Loop$60Compact, good HF performance
Antenna (Better)Random Wire 50-100 ft$20Better sensitivity
Antenna (Best)Wellbrook ALA1530LNP$400Professional-grade

HFDL Ground Station Frequencies (kHz):

StationLocationFrequencies
San FranciscoCalifornia6559, 8927, 11312, 17919, 21934
MolokaiHawaii6559, 8927, 11312, 13312, 17919
ReykjavikIceland3016, 6559, 8977, 11184, 15025
ShannonIreland3455, 6559, 8843, 10081, 13264
JohannesburgSouth Africa4681, 8834, 11321, 13321, 21949
KrasnoyarskRussia5508, 8886, 10087, 13321, 17919

5. Wideband HF Monitoring and Transceiver Integration

This section covers integration of wideband HF spectrum monitoring for pirate radio hunting, utility monitoring, and general HF exploration, plus integration with an all-band all-mode transceiver for transmit capability.

Wideband HF SDR Options

For continuous wideband monitoring with waterfall display, you need an SDR with good HF performance and wide instantaneous bandwidth.

SDRBandwidthFrequency RangeApproximate CostNotes
SDRplay RSPdx10 MHz1 kHz - 2 GHz$250Excellent HF, already in HFDL build
SDRplay RSPduo10 MHz (2 MHz dual)1 kHz - 2 GHz$280Dual tuner for simultaneous monitoring
Airspy HF+ Discovery768 kHz0.5 kHz - 31 MHz, 60-260 MHz$170Best dynamic range, narrow bandwidth
RX-888 MKII64 MHz1 kHz - 1.8 GHz$180Huge bandwidth, requires good PC
ELAD FDM-S324 MHz9 kHz - 108 MHz$1,100Professional grade

Recommendation: The SDRplay RSPdx is already in the build for HFDL. It can simultaneously run HFDL decoding and wideband monitoring using SDR++ with multiple VFOs. For dedicated pirate hunting with maximum waterfall coverage, add an RX-888 MKII or use the RSPduo’s dual tuner mode.

All-Band All-Mode Transceiver Integration

For a ham-integrated station, a modern transceiver with CAT control and built-in panadapter adds transmit capability and serves as a high-quality backup receiver.

Recommended Transceivers:

TransceiverPrice RangePanadapter BWKey Features
Icom IC-7300$1,100-1,200±500 kHzBest value, excellent SDR-based receiver, touch screen
Yaesu FT-991A$1,400-1,500±500 kHzAll-mode including C4FM, built-in tuner
Icom IC-7610$3,500-4,000±1 MHz dualDual watch, best-in-class receiver
Kenwood TS-890S$4,500-5,000±500 kHzTop-tier filtering, contest grade
Yaesu FTDX10$1,700-1,900±500 kHzHybrid SDR, good value
Elecraft K4$5,000+WidebandDirect sampling, modular

Best Value Pick: Icom IC-7300. Excellent SDR-based receiver, waterfall display, CAT control via USB, and well-supported by ham software. The built-in spectrum scope shows ±500 kHz which is useful for band scanning.

Integration Capabilities:

FeatureIC-7300FT-991AIC-7610
CAT ControlUSB (CI-V)USB (CAT)USB (CI-V) + LAN
Audio I/OUSB audio built-inUSB audio built-inUSB audio built-in
External DisplayHDMI via OTG (hacks)NoYes (DVI)
Panadapter OutputNo (internal only)NoYes (I/Q out)
Remote OperationVia softwareVia softwareNative network

Transceiver-Computer Integration

CAT Control Setup:

CAT (Computer Aided Transceiver) control allows software to read/set frequency, mode, and other parameters.

┌─────────────────┐          USB           ┌─────────────────┐
│   Transceiver   │◄──────────────────────►│    Computer     │
│   (IC-7300)     │                        │                 │
│                 │   CAT Control          │  - flrig        │
│                 │   Audio In/Out         │  - WSJT-X       │
│                 │   (digital modes)      │  - fldigi       │
│                 │                        │  - JS8Call      │
└─────────────────┘                        └─────────────────┘

Software for CAT Control:

SoftwarePurposeNotes
flrigCAT control daemonWorks with most rigs, integrates with fldigi/WSJT-X
rigctld (Hamlib)CAT control daemonUniversal, command-line based
OmniRigWindows CAT serverShares rig between multiple apps
Win4IcomSuiteIcom-specific controlExcellent for IC-7300/7610, adds features

Linux Setup with Hamlib:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# Install Hamlib
sudo apt install libhamlib-utils

# Find  rig's model number
rigctl --list | grep -i icom

# Start rigctld daemon for IC-7300 (model 3073)
rigctld -m 3073 -r /dev/ttyUSB0 -s 19200 &

# Test connection
rigctl -m 2 -r localhost:4532 f   # Get frequency
rigctl -m 2 -r localhost:4532 F 7255000   # Set to 7.255 MHz

Audio Routing:

Modern transceivers present as USB audio devices. Configure PulseAudio to route appropriately:

1
2
3
4
5
6
# List audio devices
pactl list short sources
pactl list short sinks

# Example: Route transceiver audio to virtual sink for recording
pactl load-module module-loopback source=alsa_input.usb-Icom_IC-7300 sink=recording_sink

Wideband HF Monitoring Display

For pirate radio hunting and band scanning, you want a persistent waterfall display showing activity across the HF spectrum.

Display Options:

SoftwarePlatformBandwidthBest For
SDR++Linux/WindowsFull SDR BWGeneral monitoring, multi-VFO
GQRXLinuxFull SDR BWSimple, clean interface
SDR ConsoleWindowsFull SDR BWFeature-rich, scheduler
OpenWebRX+Web-basedFull SDR BWRemote access, multi-user
CubicSDRCross-platformFull SDR BWLightweight
LinradLinux/WindowsFull SDR BWAdvanced, learning curve

Recommended Setup: Run SDR++ on the main PC with the RSPdx showing a wideband waterfall on one portion of TV 2, or dedicate a third display to HF monitoring.

SDR++ Multi-VFO Configuration:

SDR++ supports multiple simultaneous VFOs, allowing you to:

  • Monitor 6925 kHz for pirate radio
  • Watch 10000 kHz WWV for propagation reference
  • Scan the 40m band for activity
  • All while dumphfdl decodes HFDL in the background
SDR++ Layout:
┌─────────────────────────────────────────────────────────────────┐
│  Waterfall (5-10 MHz view)                                      │
│  ═══════════════════════════════════════════════════════════    │
│     ▓▓▓▓    ▓▓    ▓▓▓▓▓▓    ▓▓▓▓    ▓▓▓▓▓▓    ▓▓▓▓              │
│     ████    ██    ██████    ████    ██████    ████              │
│     ▼       ▼     ▼         ▼       ▼         ▼                 │
│   VFO 1   VFO 2  VFO 3    VFO 4   VFO 5     VFO 6               │
│   6925    7200   10000    11175   HFDL      14313               │
│   Pirate  40m    WWV      GHFS    decode    Maritime            │
└─────────────────────────────────────────────────────────────────┘

5. Compute Platform

OptionSpecsCostPros/Cons
Intel N100 Mini PC4-core, 16GB RAM, Dual HDMI$150-200Best choice: low power, dual display, plenty of USB
Beelink EQ12 ProN100, 16GB, 500GB$200Pre-built, reliable, fanless
GMKtec G3N100, 16GB, 512GB$180Good value, dual HDMI
ASUS Mini PCN100, expandable$180Brand name reliability

Minimum Specs for Full Station:

  • CPU: Intel N100 or better (4+ cores)
  • RAM: 16GB (8GB minimum, 16GB recommended)
  • Storage: 256GB SSD minimum, 512GB+ recommended for logging
  • Video: Dual HDMI or HDMI + DisplayPort
  • USB: At least 4x USB 3.0 ports

6. Display System

ComponentRecommended OptionCostNotes
TV 1 (Map)43" 4K TV$200-300TCL, Hisense, or similar
TV 2 (Data)43" 4K TV$200-300Match TV 1 for aesthetics
TV (Budget)32" 1080p TV$120 eachPerfectly adequate
MountDual TV wall mount$50-100Or separate mounts
HDMI Cables6-10 ft, HDMI 2.0$15High quality cables

7. Supporting Hardware

ItemRecommendationCost
Powered USB 3.0 HubSabrent 10-port powered$50
UPSAPC 600VA$70
Ethernet Switch8-port gigabit$25
Weatherproof EnclosureOutdoor electrical box$30
Lightning ArrestorDiamond SP1000$50
Grounding Kit8ft rod + strap$30

Complete Hardware Bill of Materials

Full Station Build (Aviation + HF Monitoring)

CategoryItemQtyUnit CostTotal
SDRs
FlightAware Pro Stick Plus1$25$25
RTL-SDR Blog V43$40$120
SDRplay RSPdx (HFDL + HF Mon)1$250$250
Antennas
FlightAware 1090 MHz1$45$45
Diamond D130NJ Discone1$100$100
RTL-SDR L-Band Patch1$45$45
Wellbrook ALA1530LNP (HF RX)1$400$400
Filters/LNAs
Nooelec SAWbird+ GOES1$35$35
1090 Bandstop Filter1$15$15
Compute
Beelink EQ12 Pro (N100)1$200$200
Sabrent USB Hub (10-port)1$50$50
Display
43" 4K TV2$250$500
Dual Wall Mount1$75$75
HDMI Cables2$10$20
Infrastructure
LMR-400 Cable (50ft)4$40$160
Lightning Arrestors3$50$150
Grounding Kit1$30$30
APC UPS 600VA1$70$70
SUBTOTAL (Monitoring Only)$2,290

Add Ham Transceiver Integration

CategoryItemQtyUnit CostTotal
Transceiver
Icom IC-73001$1,100$1,100
TX Antenna
End-Fed Half Wave (80-10m)1$150$150
49:1 Unun1$50$50
Antenna Switching
MFJ-1708B RF T/R Switch1$100$100
Interface
USB Cables for CAT/Audio2$10$20
SUBTOTAL (Ham Addition)$1,420

Grand Total: Full Station with Ham Integration

ConfigurationTotal Cost
Aviation Monitoring Only$2,290
Aviation + Ham Transceiver$3,710
Add 600W Amplifier+$800
Add Third Display+$300
Premium Build (all options)~$5,000

Budget Build (VHF + ADS-B + Satellite, No HFDL)

CategoryItemQtyUnit CostTotal
FlightAware Pro Stick Plus1$25$25
RTL-SDR Blog V42$40$80
FlightAware Antenna1$45$45
RTL-SDR Dipole Kit1$25$25
RTL-SDR L-Band Patch1$45$45
Nooelec SAWbird+1$35$35
Beelink EQ12 Mini PC1$180$180
Sabrent USB Hub1$30$30
32" 1080p TV2$120$240
Cables and misc1$75$75
TOTAL$780

Software Stack

Operating System

Recommended: Ubuntu Desktop 22.04 LTS or 24.04 LTS

Desktop environment needed for display output. Use a lightweight DE like XFCE for minimal resource usage.

1
2
# For minimal Ubuntu with XFCE
sudo apt install xubuntu-desktop

Core Decoder Software

SoftwarePurposeInstallationNotes
readsbADS-B decodingDocker or nativeBest performance, replaces dump1090
tar1090ADS-B web mapDocker or nativeBeautiful map interface
acarsdecVHF ACARSNative buildMulti-channel support
dumpvdl2VDL Mode 2Native buildFull protocol decode
JAEROSatellite AEROAppImageL-band Inmarsat
dumphfdlHFDLNative buildHF data link
acarshubACARS aggregator/displayDockerWeb dashboard for messages

Display Software

SoftwarePurposeNotes
tar1090Aircraft mapPrimary display for TV 1
acarshubACARS messagesPrimary display for TV 2
GrafanaStatistics/graphsOptional, for metrics
ChromiumKiosk browserDisplays web interfaces

Installation Guide

Step 1: Base System Setup

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# Update system
sudo apt update && sudo apt upgrade -y

# Install desktop environment (if not present)
sudo apt install -y xubuntu-desktop

# Install base dependencies
sudo apt install -y build-essential cmake git libusb-1.0-0-dev \
    pkg-config libglib2.0-dev libconfig-dev libliquid-dev \
    libxml2-dev libzmq3-dev libjansson-dev libsqlite3-dev \
    libprotobuf-c-dev protobuf-c-compiler libfftw3-dev \
    librtlsdr-dev libsoapysdr-dev chromium-browser unclutter

# Install Docker
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER

# Install RTL-SDR drivers
sudo apt install -y rtl-sdr

# Blacklist kernel module
echo 'blacklist dvb_usb_rtl28xxu' | sudo tee /etc/modprobe.d/blacklist-rtlsdr.conf
sudo modprobe -r dvb_usb_rtl28xxu

# Reboot to apply changes
sudo reboot

Step 2: Install ADS-B Stack (Docker Method)

Create a docker-compose file for the ADS-B stack:

1
mkdir -p ~/adsb && cd ~/adsb

Create docker-compose.yml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
version: '3.8'

services:
  readsb:
    image: ghcr.io/sdr-enthusiasts/docker-readsb-protobuf:latest
    container_name: readsb
    hostname: readsb
    restart: always
    devices:
      - /dev/bus/usb:/dev/bus/usb
    ports:
      - 8080:8080
      - 30002:30002
      - 30003:30003
      - 30005:30005
    environment:
      - TZ=America/New_York
      - READSB_DEVICE_TYPE=rtlsdr
      - READSB_RTLSDR_DEVICE=00000001
      - READSB_GAIN=autogain
      - READSB_LAT=YOUR_LATITUDE
      - READSB_LON=YOUR_LONGITUDE
      - READSB_RX_LOCATION_ACCURACY=2
      - READSB_STATS_RANGE=true
      - READSB_NET_ENABLE=true
    volumes:
      - readsb_rrd:/run/collectd
      - readsb_autogain:/run/autogain
    tmpfs:
      - /run/readsb:size=64M

  tar1090:
    image: ghcr.io/sdr-enthusiasts/docker-tar1090:latest
    container_name: tar1090
    hostname: tar1090
    restart: always
    depends_on:
      - readsb
    ports:
      - 80:80
    environment:
      - TZ=America/New_York
      - BEASTHOST=readsb
      - BEASTPORT=30005
      - LAT=YOUR_LATITUDE
      - LONG=YOUR_LONGITUDE
      - TAR1090_DEFAULTCENTERLAT=YOUR_LATITUDE
      - TAR1090_DEFAULTCENTERLON=YOUR_LONGITUDE
      - TAR1090_MESSAGERATEINTITLE=true
      - TAR1090_PAGETITLE=Aviation Monitor
      - TAR1090_PLANECOUNTINTITLE=true
      - TAR1090_ENABLE_AC_DB=true
      - TAR1090_FLIGHTAWARELINKS=true
      - HEYWHATSTHAT_PANORAMA_ID=
      - HEYWHATSTHAT_ALTS=3048,12192
      - TAR1090_SITESHOW=true
      - TAR1090_RANGE_OUTLINE_COLORED_BY_ALTITUDE=true
      - TAR1090_RANGE_OUTLINE_WIDTH=2.0
    volumes:
      - tar1090_heatmap:/var/globe_history
      - tar1090_timelapse:/var/timelapse1090
    tmpfs:
      - /run:exec,size=64M
      - /var/log

volumes:
  readsb_rrd:
  readsb_autogain:
  tar1090_heatmap:
  tar1090_timelapse:

Start the ADS-B stack:

1
docker compose up -d

Verify at http://localhost for tar1090 map.

Step 3: Install ACARS Stack (Docker Method)

Add to docker-compose.yml or create a new one:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
version: '3.8'

services:
  acarsdec:
    image: ghcr.io/sdr-enthusiasts/docker-acarsdec:latest
    container_name: acarsdec
    restart: always
    devices:
      - /dev/bus/usb:/dev/bus/usb
    environment:
      - TZ=America/New_York
      - SERIAL=00000002
      - FREQUENCIES=130.025;130.450;131.125;131.550
      - GAIN=40
      - SERVER=acars_router
      - SERVER_PORT=5550
    depends_on:
      - acars_router

  vdlm2dec:
    image: ghcr.io/sdr-enthusiasts/docker-vdlm2dec:latest
    container_name: vdlm2dec
    restart: always
    devices:
      - /dev/bus/usb:/dev/bus/usb
    environment:
      - TZ=America/New_York
      - SERIAL=00000002
      - FREQUENCIES=136.650;136.800;136.975
      - GAIN=40
      - SERVER=acars_router
      - SERVER_PORT=5555
    depends_on:
      - acars_router

  acars_router:
    image: ghcr.io/sdr-enthusiasts/acars_router:latest
    container_name: acars_router
    restart: always
    ports:
      - 5550:5550/udp
      - 5555:5555/udp
      - 15550:15550
      - 15555:15555
    environment:
      - TZ=America/New_York
      - AR_SEND_UDP_ACARS=acarshub:5550
      - AR_SEND_UDP_VDLM2=acarshub:5555
      - AR_RECV_UDP_ACARS=0.0.0.0:5550
      - AR_RECV_UDP_VDLM2=0.0.0.0:5555

  acarshub:
    image: ghcr.io/sdr-enthusiasts/docker-acarshub:latest
    container_name: acarshub
    restart: always
    ports:
      - 8888:80
    environment:
      - TZ=America/New_York
      - ENABLE_ACARS=true
      - ENABLE_VDLM2=true
      - ENABLE_ADSB=true
      - ADSB_URL=http://tar1090/data/aircraft.json
    volumes:
      - acarshub_data:/run/acars

volumes:
  acarshub_data:

Step 4: Assign Unique Serial Numbers to SDRs

Each RTL-SDR needs a unique serial number so software can address them:

1
2
3
4
5
6
7
# List connected RTL-SDRs
rtl_test

# Set serial numbers (run for each device, one at a time)
rtl_eeprom -s 00000001  # ADS-B receiver
rtl_eeprom -s 00000002  # VHF ACARS
rtl_eeprom -s 00000003  # L-Band satellite

Unplug and replug each device after setting its serial.

Step 5: Install Native Decoders (JAERO, dumphfdl)

JAERO (Satellite AERO):

1
2
3
4
5
# Download AppImage from GitHub releases
cd ~
wget https://github.com/jontio/JAERO/releases/download/v1.0.4.13/JAERO-v1.0.4.13-x86_64.AppImage
chmod +x JAERO-v1.0.4.13-x86_64.AppImage
mv JAERO-v1.0.4.13-x86_64.AppImage /usr/local/bin/jaero

dumphfdl:

1
2
3
4
5
6
7
cd ~
git clone https://github.com/szpajder/dumphfdl.git
cd dumphfdl
mkdir build && cd build
cmake ..
make -j$(nproc)
sudo make install

Step 6: Configure Dual Display System

Identify displays:

1
xrandr --query

Configure X11 for dual monitors:

Create /etc/X11/xorg.conf.d/10-monitor.conf:

Section "Monitor"
    Identifier "HDMI-1"
    Option "Primary" "true"
    Option "Position" "0 0"
EndSection

Section "Monitor"
    Identifier "HDMI-2"
    Option "Position" "1920 0"
EndSection

Auto-login setup:

Edit /etc/lightdm/lightdm.conf:

1
2
3
[Seat:*]
autologin-user=YOUR_USERNAME
autologin-user-timeout=0

Step 7: Create Kiosk Display Script

Create ~/start-displays.sh:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/bin/bash

# Wait for X to be ready
sleep 10

# Disable screen blanking and power management
xset s off
xset -dpms
xset s noblank

# Hide mouse cursor after 3 seconds of inactivity
unclutter -idle 3 &

# TV 1 (Left): tar1090 Map - Full Screen
chromium-browser \
    --new-window \
    --kiosk \
    --disable-infobars \
    --disable-session-crashed-bubble \
    --disable-restore-session-state \
    --noerrdialogs \
    --disable-translate \
    --no-first-run \
    --fast \
    --fast-start \
    --disable-features=TranslateUI \
    --window-position=0,0 \
    --window-size=1920,1080 \
    "http://localhost/?zoom=8" &

sleep 5

# TV 2 (Right): ACARS Hub Dashboard - Full Screen  
chromium-browser \
    --new-window \
    --kiosk \
    --disable-infobars \
    --disable-session-crashed-bubble \
    --disable-restore-session-state \
    --noerrdialogs \
    --disable-translate \
    --no-first-run \
    --fast \
    --fast-start \
    --disable-features=TranslateUI \
    --window-position=1920,0 \
    --window-size=1920,1080 \
    "http://localhost:8888" &

echo "Displays started"

Make executable:

1
chmod +x ~/start-displays.sh

Step 8: Auto-start on Boot

Create ~/.config/autostart/displays.desktop:

1
2
3
4
5
6
7
[Desktop Entry]
Type=Application
Name=Aviation Displays
Exec=~/start-displays.sh
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true

Display Layout Options

┌─────────────────────────────────┐ ┌─────────────────────────────────┐
│                                 │ │  ACARS Messages    │ Statistics │
│                                 │ │ ─────────────────  │ ────────── │
│          tar1090 Map            │ │ UAL123: POSRPT... │ Msgs: 1,234 │
│                                 │ │ DAL456: OOOI...   │ A/C:  45    │
│     [Aircraft positions         │ │ AAL789: FREE...   │ VDL2: 567   │
│      with live tracking]        │ │ SWA012: METAR...  │ HFDL: 23    │
│                                 │ │                   │             │
│                                 │ │                   │             │
└─────────────────────────────────┘ └─────────────────────────────────┘
        TV 1 (Left)                         TV 2 (Right)

Option B: Stacked (Vertical Mount)

┌─────────────────────────────────┐
│                                 │
│          tar1090 Map            │
│     [Aircraft positions]        │
│                                 │
└─────────────────────────────────┘
            TV 1 (Top)
            
┌─────────────────────────────────┐
│  ACARS Feed        │ Live Stats │
│  ───────────       │ ────────── │
│  Latest messages   │ Graphs     │
│  scrolling...      │ Counts     │
└─────────────────────────────────┘
          TV 2 (Bottom)

Option C: Single Large Display with Split

If using a single large 4K TV, you can use browser tabs or a custom dashboard:

1
2
# Install a tiling window manager or use browser-based dashboard
# Custom HTML dashboard combining multiple iframes:

Create ~/dashboard.html:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!DOCTYPE html>
<html>
<head>
    <title>Aviation Monitor</title>
    <style>
        body { margin: 0; padding: 0; overflow: hidden; }
        .container { display: flex; width: 100vw; height: 100vh; }
        .left { flex: 2; height: 100%; }
        .right { flex: 1; display: flex; flex-direction: column; }
        .top { flex: 1; }
        .bottom { flex: 1; }
        iframe { width: 100%; height: 100%; border: none; }
    </style>
</head>
<body>
    <div class="container">
        <div class="left">
            <iframe src="http://localhost/"></iframe>
        </div>
        <div class="right">
            <div class="top">
                <iframe src="http://localhost:8888/"></iframe>
            </div>
            <div class="bottom">
                <iframe src="http://localhost:8888/stats"></iframe>
            </div>
        </div>
    </div>
</body>
</html>

Systemd Service Files

readsb-native.service (if not using Docker)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[Unit]
Description=readsb ADS-B Decoder
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/readsb \
    --device-type=rtlsdr \
    --device=00000001 \
    --gain=autogain \
    --lat=YOUR_LAT \
    --lon=YOUR_LON \
    --net \
    --net-ri-port=30001 \
    --net-ro-port=30002 \
    --net-sbs-port=30003 \
    --net-beast-port=30005 \
    --write-json=/run/readsb \
    --json-location-accuracy=2
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

jaero.service

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[Unit]
Description=JAERO Satellite AERO Decoder
After=network.target graphical.target

[Service]
Type=simple
User=USERNAME
Environment=DISPLAY=:0
ExecStartPre=/usr/bin/rtl_biast -d 00000003 -b 1
ExecStart=/usr/local/bin/jaero
Restart=always
RestartSec=30

[Install]
WantedBy=graphical.target

dumphfdl.service

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
[Unit]
Description=HFDL Decoder
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/dumphfdl \
    --soapysdr driver=sdrplay \
    --sample-rate 250000 \
    --gain 40 \
    --output decoded:json:udp:address=127.0.0.1,port=5556 \
    --centerfreq 10000000 \
    8927 10081 11312 13312
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target

Network Feeds (Optional)

Share data with the community:

ServiceData TypesSignup URL
FlightAwareADS-Bflightaware.com/adsb
FlightRadar24ADS-Bflightradar24.com/share
ADS-B ExchangeADS-Badsbexchange.com/how-to-feed
Airframes.ioACARS, VDL2, HFDLairframes.io
Planespotters.netADS-Bplanespotters.net

Add feeders to docker-compose for automatic submission.


Performance Expectations

SourceRange/CoverageTypical Daily Volume
ADS-B 1090200-300 nm (line of sight)50,000-500,000 positions
ADS-B 978 UAT100-150 nm10,000-50,000 (US only)
VHF ACARS200-250 nm5,000-50,000 messages
VDL Mode 2200-250 nm1,000-10,000 messages
L-Band AEROHemisphere500-5,000 messages
HFDLGlobal100-2,000 messages

Troubleshooting

ProblemPossible CausesSolutions
No ADS-B aircraftAntenna, gain, device not foundCheck connections, verify device serial, adjust gain
No ACARS messagesWrong frequencies, interferenceVerify regional frequencies, add 1090 bandstop filter
Weak L-band signalsLNA not powered, misaimed antennaEnable bias-tee, re-aim at satellite
USB bandwidth errorsToo many SDRs on one controllerUse powered USB 3.0 hub, distribute across ports
Display not startingX11 config, permissionsCheck xrandr, verify user permissions
Docker containers failingResource limits, device accessCheck logs with docker logs <container>

Maintenance

Daily (automated):

  • Log rotation (configure logrotate)
  • Container health checks

Weekly:

  • Check disk space: df -h
  • Review message counts for anomalies
  • Verify all SDRs are functioning

Monthly:

  • Update Docker images: docker compose pull && docker compose up -d
  • System updates: apt update && apt upgrade
  • Check antenna connections and weatherproofing
  • Review and archive old logs

Expansion Ideas

  1. MLAT Feeding: Contribute to multilateration networks for non-ADS-B aircraft
  2. Historical Logging: Set up InfluxDB + Grafana for long-term statistics
  3. Alerting: Configure alerts for specific aircraft, callsigns, or message types
  4. Remote Access: Tailscale or WireGuard for secure remote monitoring
  5. Mobile Dashboard: Access tar1090 and acarshub from phone/tablet
  6. Integration: Feed data to Home Assistant for automation

Pirate Radio Hunting

Overview

Pirate radio stations are unlicensed broadcasters operating on shortwave frequencies. North American pirates primarily use frequencies around 6925 kHz USB, with activity typically on weekends and evenings. Hunting pirates is a fun application of wideband HF monitoring.

Primary Pirate Radio Frequencies

North American Pirate Frequencies:

FrequencyModeActivity LevelNotes
6925 kHzUSBPrimaryThe “main drag” for NA pirates
6930 kHzUSBHighCommon alternative
6935 kHzUSBMediumOverflow frequency
6940 kHzUSBMedium
6945 kHzUSBLow-Medium
6950 kHzUSBMedium
6955 kHzAM/USBMediumSome AM broadcasts
6960 kHzUSBLow-Medium
6965 kHzUSBLow
6970 kHzUSBLow
6975 kHzUSBLowUpper edge of activity
4185 kHzUSBLowOccasional activity
5150 kHzUSBLowAlternative band

European Pirate Frequencies:

FrequencyModeNotes
6205-6400 kHzAM48m band, weekends
6280 kHzAMActive frequency
6300 kHzAMActive frequency
6325 kHzAMCommon
6920-6975 kHzUSBSimilar to NA
15070 kHzAMSome daytime activity

Peak Activity Times

DayTime (Eastern)Activity Level
Friday2200-0200Medium-High
Saturday1800-0300Highest
Sunday1800-2400High
HolidaysEveningVery High
Weeknights2200-0000Low-Medium

Pirates often broadcast during:

  • Major holidays (Halloween, July 4th, New Year’s)
  • Winter weekends (better propagation)
  • After sundown to ~3 AM local time

Monitoring Strategy

Wideband Waterfall Scanning:

Set up SDR to cover 6900-6980 kHz with a waterfall display. Pirate signals appear as:

  • Steady carriers with audio sidebands (USB mode)
  • Typically 10-50 watts, so not extremely strong
  • Duration: 15 minutes to several hours
  • Often include music, commentary, station IDs

SDR++ Setup for Pirate Monitoring:

1. Set center frequency to 6940 kHz
2. Set bandwidth to 100-200 kHz
3. Set mode to USB with 2.4 kHz filter
4. Enable AGC
5. Set waterfall to show 5-10 minute history
6. Create VFOs on 6925, 6930, 6935, 6940 for quick switching

What to Listen For:

Signal TypeCharacteristics
MusicRock, metal, novelty songs, obscure genres
VoiceStation IDs, commentary, often humorous
SSTVSlow-scan TV images, sounds like warbling tones
DigitalMFSK, Olivia, occasionally used for “e-QSLs”

Logging and QSLs

Many pirates accept reception reports and send QSL cards/e-QSLs in response.

Where to Send Reports:

MethodAddressNotes
EmailAnnounced on airMost common
Mail DropBelfast, NY 14711Classic NA pirate maildrop
HF Underground Forumhfunderground.comPost reports, active community
Redditr/pirateradioGrowing community

What to Include in a Report:

- Date and time (UTC)
- Frequency
- SINPO rating (Signal, Interference, Noise, Propagation, Overall)
- Program details (songs played, announcements heard)
- Location
- Receiver/antenna used
- Email or mailing address for QSL

Automated Pirate Monitoring

Set up automated recording and scanning:

Scheduled Recording with SDR++:

Create a script to record the pirate band during peak hours:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/bin/bash
# record_pirates.sh
# Records 6900-6980 kHz every Friday/Saturday night

RECORD_DIR="/home/user/pirate_recordings"
DATE=$(date +%Y%m%d_%H%M)
FREQ=6940000
SAMPLE_RATE=192000
DURATION=14400  # 4 hours in seconds

mkdir -p $RECORD_DIR

# Use rtl_sdr or sdrplay API to record baseband
# Then process with csdr or similar

rtl_sdr -f $FREQ -s $SAMPLE_RATE -n $(($SAMPLE_RATE * $DURATION)) \
    $RECORD_DIR/pirates_$DATE.raw

Automatic Detection:

Use squelch and audio level detection to flag active signals:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/usr/bin/env python3
# Simple power detector for pirate frequencies
import numpy as np
from scipy.io import wavfile
import datetime

def detect_activity(audio_file, threshold_db=-40):
    rate, data = wavfile.read(audio_file)
    # Calculate RMS power in dB
    rms = np.sqrt(np.mean(data.astype(float)**2))
    db = 20 * np.log10(rms / 32768)
    
    if db > threshold_db:
        print(f"[{datetime.datetime.now()}] Activity detected: {db:.1f} dB")
        return True
    return False

Other Interesting HF Targets

While scanning for pirates, you’ll encounter other interesting signals:

Utility Stations:

FrequencyStationContent
4724 kHzUSCG NMNWeather broadcasts
5450 kHzRAF VolmetAviation weather
6754 kHzTrenton MilitaryCanadian Forces weather
8992 kHzUSAF GHFSHF Global (HFGCS)
11175 kHzUSAF GHFSHF Global, EAMs
10000 kHzWWVTime/frequency standard
15000 kHzWWVHTime/frequency standard

Numbers Stations:

Frequency RangeTypeNotes
4000-8000 kHzVariousEncrypted government broadcasts
5473 kHz“Pip”Russian time signal/channel marker
VariousCuban/RussianVoice, CW, digital

HF Beacons:

BandFrequency RangePurpose
28 MHz28.175-28.300 MHzPropagation beacons
14 MHz14.100 MHzNCDXF/IARU beacon network
21 MHz21.150 MHzBeacon network

HF Antenna Systems for Transmit

With a ham license, you’ll want an antenna system capable of both receive and transmit. This section covers HF antenna options that complement the monitoring station.

Antenna Options by Space Available

Limited Space (Apartment, Small Lot):

AntennaBandsSizeApproximate CostNotes
Chameleon CHA-MPAS 2.0160-6mVertical, 17 ft$420Portable, works anywhere
MFJ-162240-10mWindow mount$80Apartment-friendly
Par EndFedz EF-40/20/1040/20/10m66 ft wire$100Hang from tree/building
Wolf River Coils TIA80-10mVertical, 8 ft$250Balcony/patio friendly
Buddipole40-2mPortable$300Tripod mounted
Magnetic Loop40-15m3-4 ft diameter$200-800Indoor/outdoor, narrow BW

Moderate Space (Suburban Lot):

AntennaBandsSizeApproximate CostNotes
Off-Center Fed Dipole80-10m135 ft$150-300Multi-band, one feedline
Fan DipoleMulti-band135 ft max$100-200DIY-friendly
G5RV / ZS6BKW80-10m102 ft$100Classic multi-band
Hustler 6-BTV80-10mVertical, 24 ft$400No radials required
DX Commander80-10mVertical, 32 ft$200Multi-band vertical
End-Fed Half Wave80-10m130 ft$150One end at height, other near ground

Larger Space (Rural, Multiple Supports):

AntennaBandsSizeApproximate CostNotes
Full-size 80m Dipole80-40m130 ft$75Best performance for 80/40m
3-element Yagi20-10m20-30 ft boom$500-2000Directional, needs tower
SteppIR80-6m25-36 ft boom$2000-5000Motorized, frequency-agile
Wire Beam (Moxon)20m27 ft wide$50 DIYGood gain, easy to build
RhombicMulti-band150+ ft legs$100Extreme gain, needs space

Receive-Only vs. Transmit Antennas

You can separate receive and transmit antennas for optimal performance:

Transmit Antenna Requirements:

  • Matched impedance (low SWR)
  • Power handling
  • Efficiency (minimize losses)

Receive Antenna Advantages (Separate):

  • Low-noise designs (loops, Beverages)
  • Broad frequency coverage
  • Can be smaller/stealthier
  • No power handling concerns

Typical Dual-Antenna Setup:

┌─────────────────┐        ┌─────────────────┐
│   TX Antenna    │        │   RX Antenna    │
│  (Resonant,     │        │  (Wideband,     │
│   matched)      │        │   low noise)    │
└────────┬────────┘        └────────┬────────┘
         │                          │
         │                          │
    ┌────┴────┐               ┌─────┴─────┐
    │  Tuner  │               │    SDR    │
    │   or    │               │  (RSPdx)  │
    │ Direct  │               │           │
    └────┬────┘               └───────────┘
         │
    ┌────┴────┐
    │  Xcvr   │
    │(IC-7300)│
    └─────────┘

Antenna Switching and Protection

Automatic Antenna Switch:

When transmitting, protect the SDR receivers by switching them to a dummy load or disconnecting:

DeviceFunctionalityApproximate Cost
MFJ-1708BRF-sensed T/R switch$100
Array Solutions SplitterPower-handling splitter$200
DX Engineering RTR-1ARF-sensed w/ sequencer$180
DIY PIN Diode SwitchCustom solution$50

Sequencing (Important!):

If running an amplifier, proper sequencing prevents hot-switching and protects equipment:

TX Sequence:
1. Mute receiver / disconnect SDRs
2. Switch antenna to transmitter
3. Key amplifier (if used)
4. Key transmitter

RX Sequence (reverse):
1. Unkey transmitter
2. Unkey amplifier
3. Switch antenna back
4. Unmute receiver / reconnect SDRs

SDR Protection:

Protection MethodNotes
Receive-only antennaCompletely separate, always safe
RF-sensed disconnectAutomatic, adds latency
Manual switchSimple, operator discipline required
Limiter circuitProtects against nearby strong signals
PTT-triggered relayIntegrates with transceiver

Minimum Viable Ham Integration:

Components:
- Icom IC-7300 transceiver ($1,100)
- End-Fed Half Wave antenna ($150)
- 49:1 unun ($50)
- MFJ-1708B RF switch ($100)
- LDG IT-100 auto-tuner ($180) [optional, IC-7300 has internal]

Capabilities:
- Transmit 80-10m (100W)
- Receive via IC-7300 or SDR
- Automatic antenna switching on TX
- Separate SDR receive path

Enhanced Setup:

Additional Components:
- SDRplay RSPduo (dual tuner) ($280)
- Wellbrook ALA1530LNP RX loop ($400)
- Ameritron AL-811H amplifier ($800) [optional]
- Palstar AT2K tuner ($550) [for amp]

Capabilities:
- High-power transmit (600W with amp)
- Dedicated low-noise RX antenna
- Simultaneous HFDL + wideband monitoring
- No compromise between TX and RX performance

Integrated Display Layout with HF Monitoring

Three-Display Configuration

Adding HF monitoring suggests expanding to three displays or reconfiguring the two-TV layout:

┌─────────────────────────────────────────┐
│              TV 1 (Left)                │
│           ADS-B Map (tar1090)           │
│                                         │
│     [Aircraft positions, tracks,        │
│      range rings, live traffic]         │
│                                         │
└─────────────────────────────────────────┘

┌───────────────────┐ ┌───────────────────┐
│   TV 2 (Center)   │ │   TV 3 (Right)    │
│   ACARS Messages  │ │   HF Monitoring   │
│   & Statistics    │ │                   │
│                   │ │   SDR++ Waterfall │
│  [acarshub feed,  │ │   6-8 MHz band    │
│   VDL2, HFDL,     │ │                   │
│   satellite msgs] │ │   [Pirate freqs,  │
│                   │ │    utility stns,  │
│                   │ │    propagation]   │
└───────────────────┘ └───────────────────┘

Two-Display Layout (Split Screen)

If keeping two TVs, use picture-in-picture or tiled layout on TV 2:

┌─────────────────────────────────────────┐
│              TV 1 (Left)                │
│           ADS-B Map (tar1090)           │
│                                         │
│            [Full screen map]            │
│                                         │
└─────────────────────────────────────────┘

┌─────────────────────────────────────────┐
│              TV 2 (Right)               │
├────────────────────┬────────────────────┤
│   ACARS Messages   │   HF Waterfall     │
│   (acarshub)       │   (SDR++)          │
│                    │                    │
│   [Scrolling       │   [6-8 MHz         │
│    messages]       │    spectrum]       │
│                    │                    │
├────────────────────┴────────────────────┤
│          Statistics Bar                 │
│   [Msg counts, aircraft, band status]   │
└─────────────────────────────────────────┘

Tiled Display Script (Modified):

Update ~/start-displays.sh:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/bin/bash

# Wait for X to be ready
sleep 10

# Disable screen blanking
xset s off
xset -dpms
xset s noblank

# Hide cursor
unclutter -idle 3 &

# TV 1: tar1090 Map - Full Screen
chromium-browser \
    --new-window \
    --kiosk \
    --disable-infobars \
    --window-position=0,0 \
    --window-size=1920,1080 \
    "http://localhost/?zoom=8" &

sleep 3

# TV 2 Top-Left: ACARS Hub (half width, half height)
chromium-browser \
    --new-window \
    --app="http://localhost:8888" \
    --window-position=1920,0 \
    --window-size=960,600 &

sleep 2

# TV 2 Top-Right: SDR++ (requires X11, not Wayland)
# Start SDR++ in windowed mode
DISPLAY=:0 sdrpp --server &
sleep 3

# Position SDR++ window (using wmctrl)
wmctrl -r "SDR++" -e 0,2880,0,960,600

# TV 2 Bottom: Stats/OpenWebRX (full width, bottom portion)
chromium-browser \
    --new-window \
    --app="http://localhost:8888/stats" \
    --window-position=1920,600 \
    --window-size=1920,480 &

echo "Displays started"

OpenWebRX+ as Alternative HF Display

OpenWebRX+ provides a web-based SDR interface ideal for remote access and display:

1
2
3
4
5
# Install OpenWebRX+
sudo bash -c "$(wget -O - https://luarvique.github.io/ppa/install-owrx.sh)"

# Configure for RSPdx
sudo nano /etc/openwebrx/sdrplay.conf

Configuration for RSPdx:

1
2
3
4
5
6
7
[sdrplay]
device_type = sdrplay
antenna = Antenna A
rf_gain = 40
agc = true
sample_rate = 2000000
center_freq = 6940000

Access via http://localhost:8073 for waterfall display.


Overview

A well-planned antenna installation is critical for optimal performance. This section covers mounting locations, hardware, weatherproofing, and cable routing for all antenna types in the station.

Antenna Placement Priority

AntennaIdeal LocationMinimum HeightOrientationNotes
ADS-B (1090 MHz)Highest point, unobstructed15+ ft AGLVertical, omnidirectionalHeight is king for range
VHF AirbandHigh, unobstructed10+ ft AGLVertical, omnidirectionalCan be slightly lower than ADS-B
L-Band PatchClear southern sky (N. hemisphere)AnyAimed at satelliteMust see satellite, elevation matters
HF Loop/WireAway from noise sourcesGround level OKBroadside to desired directionKeep away from switching PSUs, LEDs

Site Survey Checklist

Before mounting, assess location:

□ Identify highest mounting point (roof peak, chimney, tower, eave)
□ Check line-of-sight to horizon in all directions (for ADS-B/VHF)
□ Locate Inmarsat satellite position (use app to find azimuth/elevation)
□ Identify cable routing path from antennas to equipment
□ Locate grounding point (existing ground rod or installation site)
□ Check local regulations/HOA restrictions
□ Assess wind loading and structural capacity of mount point
□ Plan for lightning protection

ADS-B and VHF Antenna Mounting

Recommended Mount Types:

Mount TypeBest ForApproximate CostNotes
Chimney mountExisting chimney$30-50Easy install, good height
Eave/fascia mountRoof edge$20-40Common choice, accessible
Tripod roof mountFlat roof$50-100Non-penetrating option
Wall bracketSide of house$20-30Lower height, but easy
Telescoping mastMaximum height$100-300Best performance, more complex
TV antenna mastRepurpose existing$0If already present

Mast and Hardware:

ItemSpecificationNotes
Mast pipe1.25" or 1.5" OD galvanized steel or aluminum5-10 ft typical
U-boltsStainless steel, sized for mast2-4 needed depending on mount
Hose clampsStainless steel, 1.5-2"For antenna-to-mast connection
Guy wiresGalvanized steel or stainlessFor masts over 10 ft
Thrust bearingIf using rotator (not needed here)N/A for omnidirectional

Mounting Diagram (Shared Mast):

                    ┌─────────────┐
                    │  ADS-B      │ ← Highest position
                    │  Antenna    │
                    └──────┬──────┘
                           │
                    ┌──────┴──────┐
                    │   1.5" Mast │
                    │             │
                    ├─────────────┤ ← 2-3 ft separation
                    │             │
                    │  VHF        │
                    │  Discone    │
                    │             │
                    └──────┬──────┘
                           │
                    ┌──────┴──────┐
                    │  Chimney or │
                    │  Roof Mount │
                    └─────────────┘
                           │
                    ═══════╧═══════  ← Roof line

Separation Guidelines:

  • Keep ADS-B antenna at least 2-3 ft above VHF antenna
  • Minimum 3 ft horizontal separation if side-by-side mounting
  • ADS-B antenna should be highest to maximize range
  • VHF discone can be slightly lower without significant impact

L-Band Patch Antenna Mounting

The L-band patch antenna for Inmarsat reception requires careful aiming at the geostationary satellite.

Finding Satellite:

For locations in the continental US, Inmarsat 4-F3 at 98°W is the primary target.

Use one of these tools to find azimuth and elevation for location:

ToolPlatformURL/Notes
Satellite PointeriOS/AndroidUses phone compass and camera
Dish Align ProiOS/AndroidIncludes Inmarsat satellites
SatellitePointer.comWebEnter coordinates, shows pointing
StellariumDesktopAdd satellite TLEs manually

Example Pointing Data (Major US Cities):

CitySatelliteAzimuthElevation
New YorkI4-F3 (98°W)234°36°
ChicagoI4-F3 (98°W)212°40°
DenverI4-F3 (98°W)188°45°
Los AngelesI4-F3 (98°W)152°47°
SeattleI4-F3 (98°W)167°34°
MiamiI4-F3 (98°W)258°50°
DallasI4-F3 (98°W)198°51°

Mounting Options:

Mount TypeProsConsCost
Camera tripodEasy adjustment, portableNot weatherproof, can move$25-50
Photographic ball head on bracketFine adjustment, sturdyMore complex setup$40-80
Fixed bracket with angle adjustmentWeatherproof, permanentHarder to re-aim$30-50
Dish mount repurposedSturdy, designed for satelliteMay be overkill$20-40
3D printed bracketCustom fit, cheapRequires printer, UV degradation$5-10

Recommended Setup (Permanent Outdoor Mount):

                        ┌───────────────┐
                        │   L-Band      │
                        │   Patch       │
                        │   Antenna     │
                        │   ┌─────┐     │
                        │   │ ))) │───────→ To Inmarsat 4-F3
                        │   │     │     │   (Azimuth/Elevation)
                        │   └─────┘     │
                        └───────┬───────┘
                                │
                        ┌───────┴───────┐
                        │  Ball Head or │
                        │  Tilt Bracket │
                        └───────┬───────┘
                                │
                        ┌───────┴───────┐
                        │    Wall or    │
                        │  Pole Bracket │
                        └───────────────┘

Aiming Procedure:

  1. Coarse Aim: Use a compass app to set the azimuth (magnetic bearing). Account for magnetic declination in your area.

  2. Set Elevation: Use an inclinometer app or physical inclinometer to set the tilt angle.

  3. Fine Tune with Signal:

    • Start JAERO or SDR++
    • Set frequency to 1545.6 MHz
    • Watch signal strength or constellation quality
    • Make small adjustments to maximize signal
  4. Lock Down: Once optimal, tighten all adjustment points and apply thread locker if desired.

Weatherproofing the L-Band Setup:

ComponentProtection Method
Antenna connectorSelf-amalgamating tape wrap
Coax connection at LNAWeatherproof enclosure or tape
LNA (if external)Small weatherproof box
Mounting hardwareStainless steel, anti-seize on threads
Cable entry to buildingDrip loop, weatherproof bushing

HF Antenna Considerations

For HFDL reception, the MLA-30+ active loop is the easiest option:

MLA-30+ Mounting:

  • Mount on a non-metallic mast (PVC, fiberglass) if possible
  • Keep 10+ ft away from metal structures
  • Height is less critical than for VHF; 6-10 ft is fine
  • Orient the loop broadside (flat face toward) the stations you want to receive
  • For general coverage, a vertical orientation works well

Long Wire Alternative:

If space permits, a random wire antenna performs better:

                Feed point
                    │
    ────────────────┼────────────────────────────────────
    │               │                                   │
    │          Balun/Matching                     End insulator
    │          transformer                        (tied to tree,
    │               │                              post, etc.)
    │          Coax to SDR
    │
 Ground rod
 or radials
  • 50-100 ft of wire, as high and clear as practical
  • Use a 9:1 balun or unun at the feed point
  • Ground the feedpoint to reduce noise

Cable Management

Recommended Cables by Run Length:

LengthADS-B/VHF (1090/130 MHz)L-Band (1545 MHz)HF
< 25 ftRG-8X, RG-6RG-6 Quad ShieldRG-8X
25-50 ftLMR-240, RG-8LMR-240RG-8
50-100 ftLMR-400LMR-400RG-8, LMR-240
> 100 ftLMR-600 or add preampNot recommendedLMR-400

Cable Loss Reference (dB per 100 ft):

Cable Type130 MHz1090 MHz1545 MHz
RG-582.67.89.5
RG-8X2.05.87.2
RG-6 QS1.85.46.8
LMR-2401.54.45.5
LMR-4000.92.73.4
LMR-6000.61.92.4

Connector Types:

Frequency RangeRecommended ConnectorNotes
HFPL-259/SO-239Adequate for HF, easy to install
VHF (Airband)PL-259 or N-typeN-type better but PL-259 OK
ADS-B (1090 MHz)N-type or SMAN-type preferred for outdoor
L-Band (1545 MHz)SMA or N-typeSMA common on RTL-SDR

Routing Best Practices:

  • Create a drip loop before cable enters building
  • Use weatherproof feed-through bushings
  • Avoid sharp bends (minimum bend radius = 10x cable diameter)
  • Secure cables every 2-3 ft on vertical runs
  • Use UV-resistant cable ties or stainless steel clamps outdoors
  • Label both ends of every cable

Lightning Protection

Ground System:

    Antennas
        │
        ├──── Lightning arrestor ────┐
        │     (at building entry)    │
        │                            │
    ════╧════════════════════════════╧════ Ground bus bar
                                     │
                                     │ #6 AWG or larger
                                     │ copper wire
                                     │
                                 ════╧═══
                                 │Ground│
                                 │ Rod  │ 8 ft copper
                                 │      │ clad steel
                                 ════════

Required Components:

ItemSpecificationApproximate Cost
Ground rod8 ft copper-clad steel$15
Ground clampBronze or copper$8
Ground wire#6 AWG bare copper$1.50/ft
Lightning arrestorsGas discharge, appropriate freq$30-50 each
Ground bus barCopper, multiple holes$20
Ground strapCopper braid$15

Arrestor Placement:

  • Install at the point where coax enters the building
  • One arrestor per coax line
  • All arrestors bonded to a common ground bus
  • Ground bus connected to ground rod with short, straight run

Antenna Installation Checklist

PRE-INSTALLATION:
□ All hardware and tools gathered
□ Cable lengths measured and cut
□ Connectors installed and tested
□ Weather forecast checked (no rain/wind)
□ Helper available for roof work (safety)

MOUNTING:
□ Mount securely attached to structure
□ Mast plumb (level in both axes)
□ All U-bolts and clamps tight
□ Antennas attached at correct heights
□ L-band antenna aimed at satellite

CABLING:
□ Drip loops formed at each entry point
□ Cables secured along entire run
□ All outdoor connections weatherproofed
□ Cables labeled at both ends
□ Lightning arrestors installed
□ Ground system connected and tested

POST-INSTALLATION:
□ All receivers tested and receiving
□ Signal levels documented (baseline)
□ L-band fine-tuned for best signal
□ Photos taken for documentation
□ Cleanup completed

JAERO Configuration for L-Band Satellite AERO

Overview

JAERO decodes C-channel AERO messages from Inmarsat satellites. These include ACARS-over-satellite, ADS-C position reports, and CPDLC (Controller-Pilot Data Link Communications).

Hardware Setup

Signal Chain:

L-Band Patch Antenna
        │
        │ (short coax, < 3 ft ideal)
        ▼
┌───────────────┐
│ Nooelec       │
│ SAWbird+ GOES │ ← LNA + SAW filter
│ (or similar)  │
└───────┬───────┘
        │
        │ Coax to indoor RTL-SDR
        ▼
┌───────────────┐
│ RTL-SDR V4    │ ← Bias-tee enabled to power LNA
│               │
└───────┬───────┘
        │ USB
        ▼
┌───────────────┐
│ Computer      │
│ running JAERO │
└───────────────┘

Enable Bias-Tee Power:

The RTL-SDR V4 has a software-controlled bias-tee that sends 4.5V DC up the coax to power the LNA.

1
2
3
4
5
6
7
8
# Install rtl-sdr utilities if not present
sudo apt install rtl-sdr

# Enable bias-tee on device with serial 00000003
rtl_biast -d 00000003 -b 1

# To disable (if needed)
rtl_biast -d 00000003 -b 0

Verify LNA is Powered:

  • Current draw should increase by ~50-70mA when bias-tee is enabled
  • Signal strength in SDR software should jump noticeably
  • If using SAWbird+ GOES, the small LED may illuminate

Installing JAERO

Option 1: AppImage (Recommended)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# Download latest release
cd ~
wget https://github.com/jontio/JAERO/releases/download/v1.0.4.13/JAERO-v1.0.4.13-x86_64.AppImage

# Make executable
chmod +x JAERO-v1.0.4.13-x86_64.AppImage

# Move to system location
sudo mv JAERO-v1.0.4.13-x86_64.AppImage /usr/local/bin/jaero

# Run
jaero

Option 2: Build from Source

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# Install dependencies
sudo apt install -y build-essential qt5-default qtmultimedia5-dev \
    libqt5svg5-dev libqt5serialport5-dev libcorrect-dev libogg-dev \
    libvorbis-dev libopus-dev

# Clone and build
cd ~
git clone https://github.com/jontio/JAERO.git
cd JAERO/JAERO
qmake
make -j$(nproc)

# Binary is at ./JAERO
sudo cp JAERO /usr/local/bin/jaero

JAERO with RTL-SDR Direct Connection

JAERO can connect directly to an RTL-SDR without needing a separate SDR application.

Launch with RTL-SDR Support:

1
2
# Start JAERO with RTL-SDR input
jaero --rtl

Configure RTL-SDR in JAERO:

  1. Go to SettingsRTL-SDR Settings
  2. Set Device Index to match L-band SDR (e.g., 2 if it’s the third RTL-SDR)
  3. Set Sample Rate to 2.4 MSPS (2,400,000)
  4. Set Gain: Start at 40, adjust as needed
  5. Enable Bias-Tee if RTL-SDR has one (V4 does)

JAERO with SDR++ or SDR# (Audio Piping Method)

Alternatively, use a general SDR application and pipe audio to JAERO.

Linux (PulseAudio):

1
2
3
4
5
# Create a virtual audio sink
pactl load-module module-null-sink sink_name=sdr_audio sink_properties=device.description=SDR_Audio

# In SDR++, set audio output to "SDR_Audio"
# In JAERO, set audio input to "Monitor of SDR_Audio"

Windows (Virtual Audio Cable):

  1. Install VB-Audio Virtual Cable (free)
  2. In SDR#, set audio output to “CABLE Input”
  3. In JAERO, set audio input to “CABLE Output”

JAERO Main Window Configuration

Frequency Settings:

SatelliteCenter FrequencyBandwidthNotes
I4-F3 (98°W)1545.600 MHz800 kHzAmericas primary
I3-F4 (54°W)1545.025 MHz600 kHzAtlantic Ocean West
I4-F2 (63.9°E)1545.600 MHz800 kHzEMEA
I4-F1 (143.5°E)1545.600 MHz800 kHzAsia-Pacific

Setting the Correct Frequency:

  1. In JAERO main window, enter the center frequency in the Frequency box
  2. The spectrum display should show multiple bumps (these are the AERO channels)
  3. Each “bump” is a data channel at 600/1200/10500 bps

JAERO Display Explanation:

┌─────────────────────────────────────────────────────────────────┐
│ JAERO v1.0.4                                          [─][□][×] │
├─────────────────────────────────────────────────────────────────┤
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │                                                             │ │
│ │     Spectrum Display                                        │ │
│ │     ═══════════════════════════════════════════════════     │ │
│ │         ▄   ▄▄   ▄   ▄▄▄   ▄▄   ▄   ▄▄▄   ▄▄                │ │
│ │     ▄▄▄███▄████▄███▄█████▄████▄███▄█████▄████▄▄▄            │ │
│ │     ────────────────────────────────────────────────        │ │
│ │           │         │              │                        │ │
│ │        600bps    1200bps       10500bps                     │ │
│ │        (C-ch)    (C-ch)        (C-ch)                       │ │
│ │                                                             │ │
│ └─────────────────────────────────────────────────────────────┘ │
│                                                                 │
│ Frequency: [1545600000] Hz    Sample Rate: [2400000]            │
│                                                                 │
│ ┌─────────────────────────┐  ┌──────────────────────────────┐   │
│ │    Constellation        │  │   Decoded Messages           │   │
│ │                         │  │                              │   │
│ │         • • •           │  │ 10:23:45 UAL123 POSRPT       │   │
│ │        • ••• •          │  │ Lat: 41.234 Lon: -74.567     │   │
│ │       •  •••  •         │  │ Alt: FL380 GS: 487kt         │   │
│ │        • ••• •          │  │                              │   │
│ │         • • •           │  │ 10:23:47 DAL456 CPDLC        │   │
│ │                         │  │ WILCO                        │   │
│ │   Clean = good signal   │  │                              │   │
│ │   Scattered = weak/bad  │  │ 10:23:52 AAL789 ADS-C        │   │
│ │                         │  │ Position report...           │   │
│ └─────────────────────────┘  └──────────────────────────────┘   │
│                                                                 │
│ Status: Decoding | Msgs: 1,247 | Eb/No: 12.3 dB                 │
└─────────────────────────────────────────────────────────────────┘

Fine-Tuning for Best Reception

Step 1: Check Spectrum Display

  • You should see distinct “humps” representing different baud rate channels
  • If the spectrum is flat or noisy, check antenna aim and LNA power

Step 2: Monitor Constellation Display

Constellation AppearanceSignal QualityAction
Tight, defined pointsExcellentNone needed
Slightly fuzzy pointsGoodMay decode fine
Scattered/diffuse pointsWeakRe-aim antenna, check LNA
Random scatterVery weak/noneTroubleshoot entire chain

Step 3: Adjust Gain

  • Too low: Weak constellation, few decodes
  • Too high: Overloaded, distorted constellation
  • Sweet spot: Clear constellation, consistent decodes

Step 4: Check Eb/No (Signal Quality Metric)

Eb/No ValueQualityExpected Decode Rate
> 10 dBExcellentNear 100%
7-10 dBGood90%+
4-7 dBMarginal50-90%
< 4 dBPoorSporadic

JAERO Settings Deep Dive

Settings → Options:

SettingRecommended ValueNotes
AFC (Auto Frequency Control)EnabledCompensates for SDR drift
EqualizationEnabledImproves decode on weak signals
GUI Update Rate10 HzBalance between responsiveness and CPU

Settings → Output:

Output TypeSettingUse Case
UDP JSON127.0.0.1:5557Feed to acarshub or logging
SBS (BaseStation)Port 30003Aircraft position integration
Log to FileEnabledLong-term message archive

Configure UDP Output for Integration:

Settings → Network → UDP Output
☑ Enable UDP Output
Address: 127.0.0.1
Port: 5557
Format: JSON

This allows JAERO messages to be ingested by acarshub or custom logging scripts.

Running JAERO Headless (Advanced)

For a server setup without a monitor connected to JAERO, use a virtual framebuffer:

1
2
3
4
5
6
7
# Install Xvfb
sudo apt install xvfb

# Run JAERO in virtual display
Xvfb :99 -screen 0 1024x768x24 &
export DISPLAY=:99
jaero --rtl &

Or use VNC for remote GUI access:

1
2
3
4
5
6
7
8
# Install TigerVNC
sudo apt install tigervnc-standalone-server

# Start VNC server
vncserver :1 -geometry 1280x720

# Connect via VNC client to <IP>:5901
# Run JAERO in that session

JAERO Troubleshooting

ProblemLikely CauseSolution
No spectrum visibleSDR not connected, wrong deviceCheck USB, verify device index
Flat spectrum, no humpsAntenna not aimed, LNA not poweredRe-aim, verify bias-tee
Weak/scattered constellationLow signal, high noiseImprove antenna aim, reduce cable loss
Decodes but position incorrectWrong satellite selectedVerify you’re aimed at correct Inmarsat
Audio crackling/distortionSample rate mismatch, CPU overloadMatch sample rates, close other apps
JAERO crashes on startMissing librariesReinstall dependencies or use AppImage

Message Types You’ll See

Message TypeDescriptionContent
ADS-CAutomatic position reportsLat, lon, altitude, ground speed, heading
CPDLCController-pilot data linkClearances, requests, responses
ACARSAirline operationalOOOI, weather, dispatch, freetext
AFNATS Facilities NotificationLogon/logoff to ATC

Example Decoded Messages:

═══════════════════════════════════════════════════════════════
AERO Message: ADS-C Position Report
Time: 2024-12-28 14:32:17 UTC
Aircraft: N12345 (UAL1234)
Registration: Boeing 787-9
─────────────────────────────────────────────────────────────
Position: 41.2345°N, 74.5678°W
Flight Level: FL380
Ground Speed: 487 kt
True Track: 267°
Vertical Rate: 0 fpm
═══════════════════════════════════════════════════════════════

═══════════════════════════════════════════════════════════════
AERO Message: CPDLC Uplink
Time: 2024-12-28 14:33:02 UTC
Aircraft: DAL567
─────────────────────────────────────────────────────────────
Message: CLIMB TO AND MAINTAIN FL400
Response: WILCO
═══════════════════════════════════════════════════════════════

Integration with Display System

To show JAERO messages on the TV dashboard:

Option A: JAERO UDP → acarshub

Configure acarshub to receive from JAERO:

1
2
3
# In acarshub docker-compose environment
- ENABLE_JAERO=true
- JAERO_UDP_PORT=5557

Option B: Custom Web Display

JAERO can log to a file that a simple web app displays:

1
2
3
4
5
# Enable file logging in JAERO
Settings → Logging → Log to File: ~/jaero_messages.log

# Simple tail-to-web with websocat or similar
tail -f ~/jaero_messages.log | websocat -s 8080

Option C: Direct JAERO Window on TV 2

For maximum detail, run JAERO’s own GUI on the second display:

1
2
# In start-displays.sh, add:
DISPLAY=:0.1 jaero --rtl &

This shows the full JAERO interface including constellation and spectrum on TV 2.



FAA Part 77 Height Limits

General Rules:

ConditionHeight Limit Without FAA Notification
More than 3 miles from airport200 ft AGL
Within 20,000 ft of airport (runway > 3,200 ft)100:1 slope from runway
Within 10,000 ft of airport (runway ≤ 3,200 ft)50:1 slope from runway
Antenna structure ≤ 20 ftNo notification required

How to Verify Exact Restrictions

Use the FAA’s free online tool to check specific address:

  1. Go to: https://oeaaa.faa.gov/oeaaa/external/gisTools/gisAction.jsp?action=showNoNoticeRequiredToolForm
  2. Enter exact coordinates (get from Google Maps)
  3. Enter proposed structure height
  4. The tool will tell you if FAA notification (Form 7460-1) is required

To get coordinates from Google Maps:

  1. Go to Google Maps and find address
  2. Right-click on property
  3. Click the coordinates that appear (e.g., 34.7XXX, -86.7XXX)
  4. They will be copied to clipboard

FAA Notification Process (If Required)

If tower exceeds the notification threshold:

  1. File FAA Form 7460-1 online at https://oeaaa.faa.gov
  2. Allow 45-60 days for aeronautical study
  3. FAA will issue a determination:
    • No Hazard: Proceed with construction
    • Conditional: May require marking/lighting
    • Hazard: Structure not approved at proposed height

Note: Filing Form 7460-1 is free and the FAA determination is advisory for amateur radio structures, but following the process is good practice and required by Part 97 if you exceed 200 ft AGL.


Antenna Tower Options

Requirements for This Station

The antenna farm for this monitoring station needs to support:

AntennaWeightWind LoadHeight Needed
ADS-B (1090 MHz)2-3 lbs< 1 sq ftAs high as possible
VHF Discone5-8 lbs2-3 sq ft30+ ft
L-Band Patch1-2 lbs< 0.5 sq ftClear view of satellite
HF Wire (EFHW)3-5 lbsMinimalOne end at 40-60 ft
HF Yagi (optional)30-100 lbs6-15 sq ft40-70 ft
Rotator15-25 lbsN/AAt mast top

Total Approximate Load: 60-150 lbs depending on HF antenna choice, 10-20 sq ft wind load

Tower Categories

These towers telescope down when not in use or during storms, and don’t require permanent installation if using the right base.

Top Picks:

ManufacturerModelHeightWind LoadTilt-OverPrice Range
US TowerTX-45555 ft8.4 sq ftYes (w/TRX base)$2,500-3,000
US TowerTX-47272 ft12 sq ftYes (w/TRX base)$3,500-4,000
Aluma TowerT-50HN50 ft18 sq ft @ 70 mphYes (tilt base)$2,800-3,200
Aluma TowerT-75HN75 ft18 sq ft @ 70 mphYes (tilt base)$3,800-4,200
Heights TowerHT-5050 ft12 sq ft @ 80 mphYes (FOK option)$2,200-2,800
TashjianT-5050 ft10 sq ftNo$1,800-2,200

US Tower TX-455 (55 ft) Highlights:

  • Hot-dipped galvanized steel
  • 21 ft sections with 4 ft overlap
  • 12.5" top section fits most rotators inside
  • Retracts to ~22 ft
  • TRX raising fixture allows one-person tilt-over installation
  • Fulton winch with automatic load-actuated brake

Aluma Tower T-50HN Highlights:

  • 6061-T6 aluminum construction (lightweight)
  • Includes tilt base for fold-over
  • “N” designation means fully nestable with rotator installed
  • Zinc-plated hand crank winch (electric optional)
  • Stainless steel cable and hardware
  • 8 ft mast included

2. Tilt-Over Guyed Towers

Fixed-height towers that hinge at the base to lay down for antenna work. Require guy wires but offer excellent stability.

ManufacturerModelHeightWind LoadGuy SetsPrice Range
Rohn25G + tilt base50 ft15+ sq ft1 set$800-1,200
Glen MartinM-1850A50 ft20 sq ft1 set$2,000-2,500
Heights TowerFold-Over Kit40-72 ftVaries0-1 sets$1,500-3,000

Rohn 25G with Tilt Base:

  • Industry-standard tower sections
  • Add Glen Martin TB-25 tilt base ($400-500)
  • Add Hazer tram system for antenna access without climbing
  • Galvanized steel, extremely durable
  • Sections are 10 ft each, easy to transport
  • Requires concrete base and guy anchors

3. Trailer-Mounted Portable Towers

Completely portable, no permanent installation. Ideal for temporary deployments, field day, or HOA-restricted properties.

TypeHeightPayloadMobilityPrice Range
Light Tower Trailer (used)25-30 ft50-100 lbsTowable$500-2,000
Aluma T2 on Trailer50-100 ftUp to 275 lbsTowable$8,000-15,000
Will-Burt Mast Trailer50-100 ft100-200 lbsTowable$5,000-10,000 (used)
DIY Tilt-Over Trailer30-50 ft50-150 lbsTowable$1,000-2,000

Light Tower Trailer (Best Budget Portable Option):

  • Used construction light towers available at auction
  • Already have trailer, tilt-over mechanism, and often generator/solar
  • 25-30 ft height when extended
  • Manual or hydraulic lift
  • Rotatable pivot point eliminates need for separate rotator
  • Search: IronPlanet, EquipmentFacts, GovPlanet for auctions
  • Typical cost: $500-1,500 for older units needing work

DIY Trailer Tower:

  • Build a trailer-mounted tilt-over using steel pipe or aluminum tubing
  • 40-50 ft achievable with proper engineering
  • Requires welding skills
  • Example: 4" Schedule 40 pipe nested inside 5" pipe, hinged at trailer bed
  • Add hand winch for raising/lowering

4. Push-Up Masts (Lightweight, Temporary)

For lighter antennas only (VHF, ADS-B, small HF wires).

ProductHeightPayloadNotesPrice
Spiderbeam 12m Pole40 ft2-3 lbsFiberglass, telescoping$180
Jackite 31 ft Pole31 ft1-2 lbsFiberglass, very light$100
MFJ-191033 ft5 lbsAluminum, guyed$130
DX Engineering MBVE-143 ft5 lbsFiberglass, guyed$250
Channel Master Telescoping25-40 ft10-20 lbsSteel, guyed$150-300

Best Use: ADS-B antenna, VHF airband antenna, end of an EFHW wire antenna. Not suitable for rotatable antennas or heavy loads.

Option A: Best Performance (Permanent Installation)

US Tower TX-455 (55 ft) with TRX-455 Tilt Base
├── Mast: 10 ft, 2" OD steel
├── Top: Rotator + HF Yagi (20m 3-element or tribander)
├── Side mount at 50 ft: ADS-B antenna
├── Side mount at 45 ft: VHF Discone
├── At base when tilted: Easy antenna access
└── Ground: EFHW feed point, wire runs to tree/post

Total Cost: ~$3,500-4,000 installed

Option B: Best Portability (No Permanent Installation)

Used Light Tower Trailer (25-30 ft)
├── Top: ADS-B antenna + VHF Discone
├── Side: L-Band patch (aimed)
└── Separate: Push-up mast (40 ft) for EFHW wire

+ Aluma T-50HN on MP-2 Direct Ground Mount
├── No concrete required
├── Tilt-over capability
├── Top: Rotator + HF antenna
└── Can be relocated

Total Cost: ~$4,500-5,500

Option C: Budget Build (Guyed Tilt-Over)

Rohn 25G (50 ft, 5 sections)
├── Glen Martin TB-25 Tilt Base
├── Glen Martin H-3 Hazer System
├── Single guy set at 45 ft
├── Mast: 10 ft, rotator at top
├── Side mounts for VHF/ADS-B
└── EFHW wire from 40 ft to tree

Total Cost: ~$1,500-2,000 (tower + base + hazer + guys)

Non-Permanent Base Options

If you want to avoid pouring concrete:

Base TypeTower CompatibilityNotesPrice
Aluma MP-2 Ground MountAluma towersDrive-in pipe, no concrete$200
Surface Mount PlateVariousBolts to existing concrete slab$100-300
Ballast BaseLight towersWeighted platform$300-500
Screw AnchorsGuy anchorsNo digging required$50-100 each
Trailer MountCrank-up towersCompletely portable$500-2,000

Aluma MP-2 Mounting Pole:

  • 2" diameter steel pipe driven into ground
  • Tower slides over pipe and pins in place
  • No concrete required
  • Supports full tower load ratings
  • Can be removed and relocated

Wind Loading and Storm Preparedness

With a crank-up or tilt-over tower, you can lower the tower during severe weather:

ConfigurationWind RatingAction Required
Tower extended, no guys70 mphLower below 50 mph forecast
Tower extended, guyed90+ mphCan remain up in most storms
Tower retracted120+ mphSafe in hurricanes
Tower tilted overN/ACompletely safe

Recommendation: For Madison, AL (occasional severe thunderstorms, tornadoes), a crank-up tower that can be quickly lowered is ideal. The Aluma and US Tower products can be cranked down in under 15 minutes.

Permit and HOA Considerations

Madison, AL Building Permits:

  • Check with Madison City Building Department: (256) 772-5659
  • Towers under 35-50 ft may not require a permit (verify locally)
  • Towers over 50 ft typically require structural engineering review

HOA Restrictions:

  • If property is in an HOA, check CC&Rs for antenna restrictions
  • FCC PRB-1 preempts local regulations that prohibit amateur radio antennas entirely
  • OTARD Rule protects over-the-air reception devices (ADS-B, satellite)
  • A portable/trailer-mounted tower may avoid permanent structure restrictions

Amateur Radio Parity Act:

  • Requires HOAs to reasonably accommodate amateur radio antennas
  • Does not guarantee unlimited height or specific antenna types
  • Negotiate in good faith; document all communications

Resources