Work Home lab & side projects

A home ground station that pulls images from GOES-16

I built a weather-satellite receiver around a dish and a headless Raspberry Pi 5. It records the GOES-16 broadcast, decodes full-disk and regional images, and transfers finished images to my desktop.

GOES-16 full-disk image (my own decode)
GOES-16 full-disk image (my own decode) Photo: Neal Spangler

Results

3GOES-16 image sectors decoded
~9 dBsignal-to-noise ratio while decoding
15 minrtl_sdr recording cap I had to work around

The problem

I was trying to receive GOES-16 or GOES-18 imagery at 1694.1 MHz. The signal was weak, and the decoders needed careful configuration. I built goestools, rewrote config files and tuned gain for hours without an image. The dish was aimed at GOES-17.

What I did

  • A receive chain of dish, SAWbird+ GOES filter and amplifier, and an RTL-SDR dongle, feeding a headless Raspberry Pi 5 that I run from a Compute Module 5 desktop.
  • A Python tuner that rewrites the decoder's config, listens for 10 seconds per setting, and scores gain and frequency by the Viterbi error rate, first by brute force, then with Optuna.
  • A SatDump pipeline: rtl_sdr records open-ended chunks, since fixed lengths kept stopping early, and a second loop decodes each chunk plus the EMWIN text bulletins.
  • A transfer script that moves only finished images to the desktop over key-based SSH, where a sorter files each product into its own folder for comparing over time.

Photos

Nooelec GOES parabolic grid reflector antenna with its feed arm, shown against a white background
Nooelec manufacturer product photo of the grid reflector used for this project. This is a stock image, not my installation.

View full size image

Full-disk color image of Earth from GOES-16 showing the Americas under swirling clouds
My best full-disk decode from this setup, February 2025.

View full size image

GOES-16 receive pipeline The dish and a SAWbird+ filter and amplifier feed an RTL-SDR tuned to 1694.1 MHz. A headless Raspberry Pi 5 records the raw signal, SatDump decodes it into images and text bulletins, and the files move to a Compute Module 5 desktop that sorts and shows them. A Python tuner sets the receiver's gain and frequency. Dish + LNA SAWbird+ filter RTL-SDR 1694.1 MHz Pi 5 records raw IQ SatDump decodes images CM5 desktop sorts and shows Python tuner sets gain and frequency over SSH, finished files only From a dish to the desktop
From the dish to the desktop: record, decode, transfer, sort.

What I took from it

I spent two weeks tuning a dish aimed at GOES-17, which had been in storage since 2023. Checking which satellite was still broadcasting would have saved that troubleshooting time.

Privacy