Receive GOES-16 and GOES-17 Images with a Raspberry Pi and RTL-SDR dongle
Also see the original Pieter Noordhuis's guide
Hardware
You need:
- 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
- Cable(s)
- SMA Male to Male $5-10
Total: ~$185
Assembly:
[Antenna] --- [Adapter] --- [(input) SAWBird+ (output)] --- RTL-SDR (with Bias Tee)] --- [Raspberry Pi]
Software
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 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
rtl_test
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 seeID 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 aserror -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 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
6. Create goesrecv.conf
config
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 [rtlsdr]
.
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
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 thegain
andsample_rate
. For the NooElec XTR or other E4000 tuners, you might need to set your gain to10
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://127.0.0.1:5004
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!
To ppl who came here from web search.
If you are building your own feed element or repairing some odd parabolic antenna:
The parabolic antenna's focal point is the same for any freq. You can measure the one you got and compute the focal point. You will use it later. You need to put the antenna phase center into the focal point. If you decided to build a dipole - the phase center is where there is a gap between dipole legs. If you are building something else like a horn antenna - you probably know what you are doing anyway.
You don't have to have wide brass/copper metal bands as well. The bigger the cross-section the more broadband your feed element will become. You might just solder extension copper wires like 12AWG to the brass band you got with your antenna.
Do that first and then cut the excess to make the legs the same.
The dipole gap does matter at this frequency, you need to have a dipole ~ 88.5mm end to end, including the gap.
You need to be precise by measuring, but also don't fret too much, as you will not be able to make the antenna resonant on precisely 1694MHz. This dipole will be broadband. It's not the resonance you are aiming for it's an impedance match. If you have an antenna analyzer for microwaves - it will help. At the moment of writing, you can buy them off Amazon ~$100 (nanoVNA v2)
Make legs of the dipole L/4 i.e. ~44mm. It's the matching network to 50Ohm impedance coax cable. You need to adjust them to be precisely L/4 length. Note they are soldered to the braid. Keep the solder blob small and precise otherwise, you might ruin the L/4 length. This matching network is needed to compensate for all the imperfection of your cut, solder, measuring, details of the surrounding like capacitative coupling to the trees and antenna mast. The antenna would work without it, but if you add it - it forces more power into the coax inner conductor and less power on the outer layer of the coax braid.
if you are curious - https://en.wikipedia.org/wiki/Quarter-wave_impedance_transformer
Also, note the "secondary reflector", in this grid antenna design it's not a reflector in the sense - another parabolic reflector - it's a "reflector" as in two-element Yagi. https://www.electronics-notes.com/articles/antennas-propagation/yagi-uda-antenna-aerial/theory.php
The original antenna designer used it to adjust antenna impedance back to 50. That is why it's placed in different locations in different antenna manufacturers and also has different shapes. Why 50? - https://www.microwaves101.com/encyclopedias/why-fifty-ohms
As soon as you started messing with the dipole you got - you ruin that balance. If you have the vector analyzer you can measure it and decide if you need extra capacitance or extra inductance. In practice, though, it's all the same - you will be bending and moving this metal piece on the boom until you find the local minimum at the frequency of interest.
It changes your dipole impedance that is why different people have to move it around and bend different ways. If you have nanoVNA you can observe how it changes reflected power (SWR) if you don't - you will have to look at vit(avg) in goestools/goesrecv output and bend/move it until you find the minimum.
The dipole does need to be in the paraboloid dish focus, so you will either need to add a spacer (or 3d print a new radome/enclosure) moving it out of focus is not the end of the world, your signal will drop slightly.
So all the little errors - wrong dipole measurements, wrong cuts, uneven legs, wrong solder job, wrong matching, lossy coax, bent out of shape paraboloid dish, wrong pointing, wrong skew, trees and structure obstructing the view, and finally the wrong focus - they all add up. If you start with a strong signal you have quite a budget for these errors. If you start with a weak one - you might not get enough to decode after all.
The grills of the dish also act as the polarization filter. You need to make dipole parallel to them. Some people do not bother and take a slight penalty of the higher noise floor. After all, you aiming to get a signal "good enough" to be parsable and not to make some ideal antenna.
There is no way to do everything precisely with the crude instruments you are likely to have, so you will end up trying and retrying anyway.