Skip to content

Instantly share code, notes, and snippets.

Last active February 21, 2024 06:42
Star You must be signed in to star a gist
Save lxe/c1756ca659c3b78414149a3ea723eae2 to your computer and use it in GitHub Desktop.
Receive GOES-16 and GOES-17 Images with a Raspberry Pi and RTL-SDR dongle

Receive GOES-16 and GOES-17 Images with a Raspberry Pi and RTL-SDR dongle

Also see the original Pieter Noordhuis's guide


You need:

  1. Raspberry Pi Model B (or B+) with a MicroSD Card $35-40
  2. An RTL-SDR dongle:
  3. LNA and SAW filter for around 1.69GHz
  4. A 1.6 - 1.9 GHz parabolic grid antenna
  5. Adapter (depending on the antenna terminal):
  6. Cable(s)

Total: ~$185


[Antenna] --- [Adapter] --- [(input) SAWBird+ (output)] --- RTL-SDR (with Bias Tee)] --- [Raspberry Pi]


Prep your Raspberry Pi and install necessary drivers and software.

0. Get your Raspberry Pi ready

  • Download Raspbian Lite Image and Etcher
  • Use Etcher to write the image to the SD card.
  • Mount the SD card as a volume on your machine.
  • Follow this procedure to configure WiFi and SSH.
  • Plug the card into your Raspberry Pi and turn it on.
  • Find the IP address of the Raspberry Pi using your gateway/router administrative interface.

Now you can SSH into your Raspberry PI as pi with a default password raspberry.

1. Get everything up to date

From now on all commands should be run on the Raspberry Pi.

sudo apt update
sudo apt dist-upgrade

# reboot the device
sudo reboot

2. Install dependencies

# get the packages necessary to build and run goestools
sudo apt install git build-essential cmake libusb-1.0 libopencv-dev libproj-dev

3. Install librtlsdr

Grab the latest librtlsdr source, compile it, and install the shared libraries/includes.

# download, compile, and install librtlsdr
git clone
cd librtlsdr
mkdir build
cd build
sudo make -j2 install

# load udev rules and blacklist the DVB driver shipped with the OS
sudo cp ../rtl-sdr.rules /etc/udev/rules.d/
sudo ldconfig
echo 'blacklist dvb_usb_rtl28xxu' | sudo tee --append /etc/modprobe.d/blacklist-dvb_usb_rtl28xxu.conf

# reboot the device
sudo reboot

4. Test your the RTL-SDR dongle


You should see something like this:

Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

If it hangs, just press crtl-c to exit. It doesn't have to finish.

If there are errors, or if the device is not recognized:

  • Reinstall the driver from Step 3
  • Ensure the dongle is secured in the USB port
  • Remove all USB hubs and plug in into the Pi directly
  • Make sure you power your Raspberry Pi with at least a 2.5A power supply
  • Check the device using lsusb command. You should see ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 or something of the like listed there. If not, try the previous steps.
  • Run dmesg and check for errors such as error -71 related to the USB device. This may mean that your RTL-SDR receiver might be broken. This happened to me, so I ordered another one, which ran fine.

5. Install goestools

git clone
cd goestools
git submodule init
git submodule update --recursive
mkdir build
cd build

# this will take a while on a raspberry pi
sudo make -j2 install 

6. Create goesrecv.conf config

cat <<EOF > ~/goesrecv.conf
mode = "hrit"
source = "rtlsdr"

frequency = 1694100000
sample_rate = 2400000
gain = 5
bias_tee = false

max_deviation = 200e3

bind = "tcp://"
send_buffer = 1048576

statsd_address = "udp4://localhost:8125"

If you're using a NooElec SmarTee dongle with an always-on bias tee, or if you're powering your SAWBird through the micro USB port, set bias_tee = false under [rtlsdr].

If you're using dongle, set bias_tee = true to power the SAWBird board.

7. Roughly point your antenna at the satellite

Find where the GOES-16 or GOES-17 satellites are in the sky at your location using

Note the azimuth and elevation.

Use an actual real compass to point your dish at the azimuth. I've been using the iPhone phone compass, which has a 20-30 degree error, rendering it practically useless.

You can also use which will draw a line on the aerial map where to point your dish -- I found that to be more helpful than the compass.

Adjust your dish angle according to the elevation. Use your smartphone level app, or just eyeball it.

IMPORTANT: Polarization Skew

You should also adjust the skew of your dish roughly according to what says under "LNB Skew". For GOES-17 I had to point the antenna's left long edge (if facing the same direction as the dish) up at 45 degree angle.

8. Run goesrecv and perform fine antenna adjustments

goesrecv -v -i 1 -c ~/goesrecv.conf

This will show output every second that looks something like this:

2018-09-15T21:52:03Z [monitor] gain:  8.44, freq: -2121.4, omega: 2.589, vit(avg):  2400, rs(sum):  0, packets: 0, drops:  55

The vit(avg) stat shows the average viterbi error rate over 1 second interval (if running with -i 1).

If there's no signal, the vit value should be over 2000. When signal is stronger it should decrease.

This should help you point the antenna correctly. Slightly rotate the dish right or left and note whether the vit errors are increasing or decreasing.

Once you're at the local error minimum, perform the same process to find the minimum error rate while slightly adjusting the vertical angle.

When the vit errors are at their lowest, you've pointed the antenna. Double check the antenna position again with a compass to make sure you're pointed at the intended satellite.

If you can't pinpoint the signal even after precicely adjusting the antenna, flip the dish 90 degrees and try again.

9. Restart goesrecv and play around with the config parameters.

If your vit errors are under 400, and you're observing no packet drops, you're all set!

If the average errors are at around 1500-1800, try the following:

  • Terminate and restart goesrecv. This should allow it to readjust the gain and frequency offset to get a better read on the signal.

  • Cool the Raspberry Pi and the RTL-SDR dongle. I've noticed that temperature might significantly affect reception quality.

  • Play around with goesrecv.conf parameters. Try adjusting the gain and sample_rate. For the NooElec XTR or other E4000 tuners, you might need to set your gain to 10 or below.

Once you decreased the error rates, but your vit is still over 400, try making very slight adjustments to the antenna again.

10. Process packets into images

While goesrecv is running, in a separate session, run:

goesproc -c /usr/share/goestools/goesproc-goesr.conf -m packet  --subscribe tcp://

Once goesproc receives enough packets, it will start writing images and text to the locations described in /usr/share/goestools/goesproc-goesr.conf.

Writing: ./goes16/m2/ch13/2018-09-15/GOES16_M2_CH13_20180915T231750Z.jpg
Writing: ./goes16/m2/ch13_enhanced/2018-09-15/GOES16_M2_CH13_enhanced_20180915T231750Z.jpg
Writing: ./goes16/m2/ch02/2018-09-15/GOES16_M2_CH02_20180915T231750Z.jpg
Writing: ./goes16/m2/fc/2018-09-15/GOES16_M2_FC_20180915T231750Z.jpg
Writing: ./goes16/m1/ch07/2018-09-15/GOES16_M1_CH07_20180915T231820Z.jpg

11. TODO: Automatically restart goesrecv, store images on S3, send metrics to statsd and Grafana, and make videos!

Stay tuned!

Copy link

Looking at Issues tab of PieterN's github repo: #142 reports the same issue I was having, regarding compiling under Ubuntu 22.04, which is based on Debian Bullseye. PieterN's system requires an old version of PROJ, a library involved with translation of mapping coordinates, that came standard with Debian Buster (PiOS Buster, Ubuntu before 20.xx). The PROJ version that comes with Bullseye is not backward compatible with the old version, so compiling under Bullseye will fail without modification of the make files.

On the other hand, building the system under an older version of Debian (which I did under Ubuntu 18.xx) compiles with no difficulty. Currently receiving images with vit(avg) under 400, 0 dropped packets.

Copy link

nmoon88 commented Feb 2, 2023

A critical step is missing, generating the goesproc configuration file. Without knowing about this everything else is useless and currently I have goesrecv working along with my modified dish aligned perfectly but don't have a way to decode the packets of data because I am lost when it comes to creating a configuration file for goesproc. Basically what I want to do is decode all products from GOES-16 and place them into individual folders based upon the product type. Currently I can't find anything on creating goesproc configuration files to do this

Copy link

I have tried multple Pis, SD cards, from SSH and directly and 32/64 bit versions of Raspian. Built the SD card using Raspberry Pi Imager. My install hangs and totally locks up the pi when it hits Scanning dependancies of target goesproc. It won't get past 92% I have pi 3b+. Any thoughts?

Copy link

captdonm commented Aug 5, 2023

When i get to :
2. Install dependencies

get the packages necessary to build and run goestools

sudo apt install git build-essential cmake libusb-1.0 libopencv-dev libproj-dev
I recieve the error:
E: Unable to locate package libusb-1.0
E: Couldn't find any package by glob 'libusb-1.0

Kinda stuck! using a Raspberry Pi 4b *GB with Raspberry Pi OS Lite (64-bit)

Copy link

w8cpt commented Aug 8, 2023

So I just spent 5 hours trying to get a signal on GOES-16 . Im in Michign zip code 48063. I tried the dish horizontal like the instutions say. I put it at a 45 degree angle. I flipped the reflector over...nothing got me any lower than 2203!!!!!!!!!!!! I'm at my wits end! Any help? UGH!

Copy link

W1ZFB commented Aug 8, 2023 via email

Copy link

captdonm commented Aug 8, 2023 via email

Copy link

Uploading inbound7419745982117484343.jpg…

Copy link

Ok so I now am receiving images on my Pi. I had to increase the gain to 30! I set up SyncThing and I'm pretty sure it correct but it's not putting images on my laptop in the specified folder! Here's the Pi after I started syncthing does and anyone know why it's not working?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment