Receive GOES-16 and GOES-17 Images with a Raspberry Pi and RTL-SDR dongle
Also see the original Pieter Noordhuis's guide
- Raspberry Pi Model B (or B+) with a MicroSD Card $35-40
- An RTL-SDR dongle:
- RTL-SDR.COM V3 ~$25 or
- NooElec NESDR SmarTee ~$25 or
- NooElec NESDR SmarTee XTR ~$40
- LNA and SAW filter for around 1.69GHz
- A 1.6 - 1.9 GHz parabolic grid antenna
- ZDAGP1900-20-15----1850-1990MHz 20dBi ~$100 or
- More dBi Options
- Or use a Modified 2.4 GHz WiFi grid antenna ~$60
- Adapter (depending on the antenna terminal):
- N-Male to SMA Male $5-10
- SMA Male to Male $5-10
[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
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
Grab the latest librtlsdr source, compile it, and install the shared libraries/includes.
# download, compile, and install librtlsdr git clone https://github.com/steve-m/librtlsdr.git cd librtlsdr mkdir build cd build cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DINSTALL_UDEV_RULES=ON .. 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
lsusbcommand. You should see
ID 0bda:2838 Realtek Semiconductor Corp. RTL2838or something of the like listed there. If not, try the previous steps.
dmesgand check for errors such as
error -71related 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.
git clone https://github.com/pietern/goestools.git cd goestools git submodule init git submodule update --recursive mkdir build cd build cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr .. # this will take a while on a raspberry pi sudo make -j2 install
cat <<EOF > ~/goesrecv.conf [demodulator] mode = "hrit" source = "rtlsdr" [rtlsdr] frequency = 1694100000 sample_rate = 2400000 gain = 5 bias_tee = false [costas] max_deviation = 200e3 [decoder.packet_publisher] bind = "tcp://0.0.0.0:5004" send_buffer = 1048576 [monitor] statsd_address = "udp4://localhost:8125" EOF
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
If you're using RTL-SDR.com 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 agsattrack.com.
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 https://www.dishpointer.com/ 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 https://www.dishpointer.com/ 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
vit(avg) stat shows the average viterbi error rate over 1 second interval (if running with
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.
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.
goesrecv and play around with the config parameters.
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.confparameters. Try adjusting the
sample_rate. For the NooElec XTR or other E4000 tuners, you might need to set your gain to
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://127.0.0.1:5004
goesproc receives enough packets, it will start writing images and text to the locations described in
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!
Good evening everyone. I have a problem running the command line: goesrecv -v -i 1 -c ~/goesrecv.conf.
When executing in the terminal it returns the following error: terminate called after throwing an instance of 'std::invalid_argument'
what(): Error: line 6: no equal?
Have any of your colleagues already gotten this error or do you know how to fix it?
Thank you all.