Omnidirectional Station How To
This How-To is written to get you quickly receiving satellite data with an Omnidirectional antenna (an antenna that does not move).
- 1 Prerequisites/Background
- 2 Setting up the Raspberry Pi
- 3 Software Configuration
- 4 Testing the station
- 5 Next Steps
I'm assuming that you are a bit familiar with amateur radio, or linux in general, or you already have a Raspberry Pi.
First off, I'd like to set some expectations around a SatNOGS station with an omnidirectional antenna. Yes, you will be able to hear satellites, Morse code beacons, maybe even some voice contacts on a FM transponder. But for CubeSats with 1 watt transmitters at 9600 baud, it's going to be really difficult to actually decode any data with an omni antenna. You'll definitely see squiggly lines on the waterfall plot, but demodulating the signal and extracting satellite telemetry is going to be pretty difficult.
The only way to get more signal is a better antenna. And a better antenna with more gain is going to be more directional, which means you will need a way to point that antenna at the satellite, and this How-To just got a lot more complicated. So we're not going there.
A better preamp helps a bit, see the LNA section below.
This is a list of the hardware for indoor/testing purposes:
- Raspberry Pi
- Power supply + cable (see note below)
- Up to 16 GB Micro SD card
- Ethernet cable
- RTL SDR Blog v3 dongle
- Various short lengths of coax
- Preamp/LNA - Or not if your coax is short, see LNA section below
- Omnidirectional antenna - just a dual mag-mount on a cookie sheet will work OK for stronger satellites
Setting up the Raspberry Pi
I chose the Raspberry Pi 3 Model B for my station. SatNOGS is known to work on the RPi 3B, 3B+ and 4 models.
Downloading/Writing the SD image
The SatNOGS team has done a great job creating a Raspbian image with all the required software. The latest download is given in the Download section.
Installing Image on Linux
- Unzip the downloaded file:
- Figure out which device is the SD card. SD cards are usually start with mmcblk.
- Write the image. This will take a while. Make sure you don't overwrite your host OS:
sudo dd if=<latest_image_date>-Raspbian-SatNOGS-lite.img of=/dev/mmcblk0
Installing Image on Linux/Windows/MacOS (using Rasperry Pi Imager)
This section describes the installation of installing the previously downloaded image to an SD card using the cross-platform Raspberry Pi Imager. guides explains the process using this tool in more detail.
- Download the latest version of Pi Imager
- Connect an SD card reader with the SD card inside
- Open Raspberry Pi Imager and choose the previously downloaded image from "Choose OS > Use custom > artifacts.zip"
- Review your selections and click Write button to begin writing data to the SD card.
Thinking I could save a few bucks, I used a no-name generic 2.4 amp "tablet" USB power supply I got as a freebie, and a micro-USB cable I use for charging my phone. What a mistake! The Micro-USB cable wire gauge was too small, so there was too much voltage drop on the cable, so the Raspberry Pi reported power problems every time it was doing anything.
Power problems are indicated by either a lightning bolt in the upper right of the monitor, or the red power LED flashes on the board itself. If The Raspberry Pi processor itself is pretty forgiving of power droops because it runs at 3.3 volts. But the 5v USB ports are directly tied to input power, so undervoltage conditions will cause problems for USB devices, such as the RTL SDR dongle.
Creating a SatNOGS Network account
There are several different websites to be aware of and sign in to. As of 12/2018, most of our websites use a unified login provided by Auth0, so when you create an account on one of these sites it will work across the others as well:
- Required: Network: for registering your station and adding data to the network.
- Recommended: Forums: for asking questions.
- Optional: Database: Only if you want to add satellites/modes. Not necessary for receiving satellite data.
Registering the station
Log in to your Network account, and click the "+ Add Ground Station" button, or click here Fill out the short form, and your station will be added to the database. For "Antenna", pick something that encompasses the frequency range of your antenna. For wideband reception, use VHF Discone 26-1200 MHz.
The important info you'll need later on is the Station ID number, lat/lon/altitiude. I would also use a Minimum Horizon of 30 degrees or so, this will keep your station from allowing low-elevation passes to be scheduled. Make sure to keep the "Testing" flag checked, as this lets people know that your station isn't quite ready for real use.
To help your fellow operators please consider placing the following information into the "Description" field for your station: Antenna gain and location, preamp info (if any), SDR device, some kind of contact info perhaps irc/matrix or community forum username or email address.
Booting and Configuring Raspbian
After you have the image burned onto a Micro-SD card, boot it! I would recommend hooking up a keyboard and HDMI monitor, you can watch the boot process. If it doesn't boot at all, double check that you wrote the SatNOGS Raspbian image correctly.
After a successful boot, log in with username pi and password raspberry
- Change your password! passwd
- Run sudo raspi-config to set up the base OS. Tab switches between the options and select.
- 4 Localisation Options: I1 Change Locale: en_US.UTF-8 UTF-8
- 4 Localisation Options: I2 Change Timezone: None of the above: UTC
- 4 Localisation Options: I3 Change Keyboard Layout:
- 7 Advanced Options: A1 Expand Filesystem
This will expand the ~2GB Micro-SD card partition to fill the entire SD card.
The Raspberry Pi needs to reboot to expand the filesystem, so do this now. It might take a while. 'sudo reboot
Disabling WiFi and Bluetooth
To disable WiFi and Bluetooth, edit the /boot/config.txt file, and add the following lines at the bottom:
# Disable WiFi and Bluetooth dtoverlay=pi3-disable-wifi dtoverlay=pi3-disable-bt
Then reboot again. To make sure that it worked, run ifconfig and make sure that wlan0 isn't listed. I'm not sure how to tell if bluetooth is turned off.
Note: Newer versions of Raspbian may require the following lines instead of the above.
# Disable WiFi and Bluetooth dtoverlay=disable-wifi dtoverlay=disable-bt
I like to install this additional software with sudo apt install bmon ...
- bmon - a graphical network usage analyzer.
- vnstat - keeps track of your bandwidth usage
- vim - the world's best text editor ;)
- irssi - a terminal IRC client, for chatting on the #satnogs IRC channel
If you can't tell by now, I'm always a big fan of rebooting. It certainly doesn't take that long... sudo reboot
Configuring the satnogs-client
Once you have the base Raspbian Strech OS installed, updated, and looking good, you can configure SatNOGS. Plug in your RTL SDR if you haven't already.
First thing to do is update the satnogs-setup program. Run sudo satnogs-setup. This will probably take a while, then Update, which will also take a while. Per usual, after the update I like to reboot the raspberry pi just to make sure everything was updated and is actually running the new code.
Then the actual configuration of the station:
- Run sudo satnogs-setup again.
- Use the up/down and TAB keys to navigate, and Enter to select an option.
- Basic Configuration:
- SATNOGS_API_TOKEN: After logging in to network.satnogs.org, this is in the upper right under "API Key" [no longer exsists? Add direct link]
- SATNOGS_SOAPY_RX_DEVICE: driver=rtlsdr
- SATNOGS_RX_SAMP_RATE: 2.048e6
- SATNOGS_RX_GAIN: Refer "Setting the gain" section below.
- SATNOGS_STATION_ELEV: station elevation in meters
- SATNOGS_STATION_ID: The ID number of your station.
- SATNOGS_STATION_LAT and LON: Latitude and Longitude in decimal degrees
Then back to the main menu and Apply to save the configuration. Ansible will run and update the system. If you want to quit, just keep pressing cancel to exit.
Setting the gain
The next step is to set the gain on the RTL SDR. The aim here (in the majority of cases) is to set the gain of your station to maximise sensitivity (best noise figure), but without limiting the available dynamic range of your station due to your local noise floor. This can be achieved in a fairly simple manner, by watching the level of the receivers noise floor as you slowly increase the receiver gain. At some point the noise floor will start to rise - at this point increasing the gain any further will of no use - you will only increase the noise level, and eat into your receiver's available dynamic range (for a RTLSDR, theoretically only 48 dB).
There may be situations where strong local interferers may require the use of a lower gain setting to avoid intermodulation products appearing in the passband, though these cases would be better solved with a suitable bandpass filter somewhere in the receive chain.
First, it is good to know the available gain range of your SDR. This can be accomplished by running
SoapySDRUtil --probe, which provides a considerable amount of information about the connected SDR:
pi@satnogs:~ $ SoapySDRUtil --probe ###################################################### ## Soapy SDR -- the SDR abstraction library ###################################################### Probe device Found Rafael Micro R820T tuner [INFO] [UHD] linux; GNU C++ version 8.2.0; Boost_106700; UHD_184.108.40.206-3 Found Rafael Micro R820T tuner ---------------------------------------------------- -- Device identification ---------------------------------------------------- driver=RTLSDR hardware=RTLSDR origin=https://github.com/pothosware/SoapyRTLSDR rtl=0 ---------------------------------------------------- -- Peripheral summary ---------------------------------------------------- Channels: 1 Rx, 0 Tx Timestamps: NO Other Settings: * Direct Sampling - RTL-SDR Direct Sampling Mode [key=direct_samp, default=0, type=string, options=(0, 1, 2)] * Offset Tune - RTL-SDR Offset Tuning Mode [key=offset_tune, default=false, type=bool] * I/Q Swap - RTL-SDR I/Q Swap Mode [key=iq_swap, default=false, type=bool] ---------------------------------------------------- -- RX Channel 0 ---------------------------------------------------- Full-duplex: YES Supports AGC: YES Stream formats: CS8, CS16, CF32 Native format: CS8 [full-scale=128] Stream args: * Buffer Size - Number of bytes per buffer, multiples of 512 only. [key=bufflen, units=bytes, default=262144, type=int] * Ring buffers - Number of buffers in the ring. [key=buffers, units=buffers, default=15, type=int] * Async buffers - Number of async usb buffers (advanced). [key=asyncBuffs, units=buffers, default=0, type=int] Antennas: RX Full gain range: [0, 49.6] dB TUNER gain range: [0, 49.6] dB Full freq range: [23.999, 1764] MHz RF freq range: [24, 1764] MHz CORR freq range: [-0.001, 0.001] MHz Sample rates: 0.25, 1.024, 1.536, 1.792, 1.92, 2.048, 2.16, 2.56, 2.88, 3.2 MSps
The above output is for a RTLSDR, and we can see that there is information on the 'Full gain range', and 'TUNER' gain. The Full gain setting is an 'abstracted' gain range, which in this case just directly links to the 'TUNER' gain, as that is the only gain setting presented by the RTLSDR driver. Other SDRs (e.g. AirSpy) may present more gain controls. Anyway, we can see that the gain range is 0 through 49.6 dB. It's quite possible that there are only discrete gain steps within this range (and this is very true for the RTLSDR), but SoapySDR will hide that from us and automatically use the nearest valid setting.
Next up, we want a way of seeing a live spectrum from the SDR. This might be difficult, especially if you're just gone and mounted a RTLSDR in a metal box up a pole! Well, SoapySDR comes to the rescue again with SoapySDR Server - this allows us to serve up the SDR on the network, and access it with a client.
Note: SoapySDR Server is not currently installed by default. It can be installed by running the commands:
$ sudo apt-get install soapyremote-server
By default, SoapySDR Server may be configured to startup on boot. We probably don't want this, so run the following commands to ensure it is stopped, and will not startup on boot:
$ sudo systemctl stop soapyremote-server $ sudo systemctl disable soapyremote-server
(These commands may result in errors indicating that the server wasn't running and/or enabled. This is OK!
On the RPi, you can manually start SoapySDR Server by running:
SoapySDRServer --bind="0.0.0.0:55132" Leave this running.
Note: If you need to use the Bias-T option of an RTLSDR, you will need to activate this manually prior to running SoapySDRServer. This can be accomplished by compiling the rtl_biast utility, and running it with
./rtl_biast -b 1 . (NOTE: This advice may be outdated - need to confirm how to set the RTLSDRs bias on more recent SoapySDR versions)
Open up CubicSDR on another computer, on the same network as your SatNOGS station. It will pop up a window asking you to select a SDR device. With any luck, it will have auto-detected your SoapySDR Server, and it will show up in the 'Local Net' list. If not, you will need to select 'Remote', click 'Add', and then enter the IP address of your station. You should then have a SDR showing up in the list.
You should now be able to click 'Start', and end up with a waterfall display. If the waterfall appears to glitch, or show a 'lumpy' pattern near the centre of the display, then this indicates packet loss between the SatNOGS station and your client. Try and connect via a direct LAN connection if possible. In the settings menu of CubicSDR, disable "Automatic Gain" if it is set. This will allow manual control over the gain settings via sliders that will show up at the top left of the window.
The above Figure shows the CubicSDR window, with the spectrum area, frequency selection, and gain settings annotated. Set the frequency to something suitable for your station. For example, if you are setting up a 70cm station, set a frequency of 437 MHz (437000000 Hz). For a 2m station, try 146 MHz. Drag the gain slider so that the gain (visible at the bottom of the slider) is set to zero. Then, slowly drag it up until you see the noise floor start to rise. The gain at which this occurs is the gain you should set in SATNOGS_RF_GAIN.
To set the gain in satnogs go back to the RPI and stop the soapy remote server with ctrl-c. Run satnogs-setup, open the 'Advanced' menu, then the Radio settings. Set the gain in the SATNOGS_RF_GAIN variable.
Some SDRs may present more than one gain slider. In these situations, you will need to configure SatNOGS with each gain set individually. Refer here for more information on how to do this.
As an example, the following figure shows the noise floor observed on a station with a RTLSDR and a ~25dB masthead preamplifier, as gain levels on the RTLSDR are increased:
We can see that between 0 db and 20 dB of gain there is essentially no change in the noise floor - this indicates the receive system is limited by the noise figure of the RTLSDR. As the gain increases through 30 dB, the noise floor starts to lift, indicating that we are now most likely limited by either the noise figure of the preamplifier, or the local noise environment. Any increase in gain past this point just results in reduction of the available receiver dynamic range.
CubicSDR DOES NOT autorange its waterfall, in contrast, SatNOGS DOES autorange its waterfall. When you adjust the gain in CubicSDR the waterfall background will dramatically change, but when you adjust the gain in SatNOGS the waterfall background will not change color. See the web page documenting autoranging waterfalls:
Important Note: While CubicSDR is connected to the SDR, your SatNOGS ground station cannot run observations! Make sure to close CubicSDR when you have finished setting the gain.
Basic hardware configuration is Antenna > Short coax > LNA > Coax > RTL SDR -> Raspberry Pi.
The way to measure the performance of an antenna is using a figure of merit called the Antenna gain-to-noise-temperature (G/T). It's a positive unitless number, higher the better.
G/T is comprised of antenna gain (in dB) on the top, and the system noise temperature (in Kelvins) on the bottom. There's a lot of somewhat-hard math involved, but here's the bottom line: to make your system perform better, you either need to increase the antenna gain or decrease the system noise temp. Wikipedia
Increasing the antenna gain is difficult, only because we decided on an omnidirectional antenna as the basis for this How-To. Omnidirectional antennas top out at maybe 4-6 dBi gain or so, and that's just from pushing the radiation pattern up to the sky away from the ground. Any more gain than that and it's not an omni antenna; it's got a direction that the antenna needs to be pointed in. And we want to stay away from pointing antennas for now.
Reducing the system temperature is the the way forward then. The RTL-SDR dongle has a noise figure of 6dB or so, depending on frequency, which is pretty horrible. But it turns out that the system noise temperature is largely determined by the first device in the receive chain. Since we can't change the antenna, adding a low-noise amplifier helps quite a bit. See this youtube video from Adam 9A4QV on how a LNA helps. (Also check out his other videos about the RTL SDR dongle, and SDR in general)
More info on SDR noise figures:
More info on noise and preamps:
- System noise from wikipedia, pretty high-level
- Where to put an LNA, from rtl-sdr.com
- SPF5189 LNA measurements
Adding a LNA can also add its own set of problems, in that it may amplify strong local signals which may overload your SDR. When adding a LNA, you will likely need to back off the gain on your SDR to avoid this. It's also possible that the strong local signals may cause distortion to occur in the LNA itself, in which case you should consider the use of a filter between the LNA and the antenna. Some example products:
- If you are experiencing issues with FM broadcast stations, a FM band-stop filter may help.
- MiniKits masthead preamps include fairly low-loss bandpass filters for their target bands (2m, 70cm).
All filters will have some inherent loss, which adds to the system noise figure (or temperature, as discussed above), but this is a compromise that may need to be made to avoid distortion issues.
Finally, using a LNA near the antenna means that we can accept some losses from a long coaxial cable run between the LNA and the receiver, allowing us to situate the antenna away from sources of local noise that may impact overall performance.
As briefly discussed above, it's the first device in the receive chain which dominates the overall system noise temperature (or noise figure). In brief, as long as the losses in the coaxial cable are less than the gain of the LNA, your overall system noise figure won't degrade too much. As an example a 20m run of RG58 has a loss of ~10dB at 434 MHz. Using a LNA with a gain of 20dB and a noise figure of 1dB, the overall system noise figure is still only ~1.4 dB, and acceptable degradation.
For testing on the bench, pretty much any antenna will do, however set your expectations accordingly:
- A vertical antenna (e.g. the telescopic whips that come with many RTLSDRs) will not receive high-elevation passes well, as they have a 'null' in their antenna pattern directly overhead. When a satellite is at a lower elevation it is further away, and so will be weaker.
- A dipole antenna (be it a straight, or a v-dipole) will have similar issues, though where the null is located will depend on how you orient the dipole. Either way, there will be some portions of a satellite pass with poor performance.
- If your antenna is located inside, near to your house mains wiring, or near other electrical devices, it may end up being swamped by lots of local electrical noise and end up being 'deaf' - in this situation a LNA will only make the situation worse.
Refer to the Antennas page for more information on antennas which are well suited to satellite observations.
Testing the station
Now that you have the hardware and software up and running, go ahead and schedule some passes. Navigate to your station page, and click on the Schedule button on the right side of some promising passes. The green and red bars beneath the satellite name is a quick visual indication of the number of Good and Bad passes on the network. Unfortunately, this data is not time-stamped at all, so a satellite that had a lot of Good observations a long time ago, but recently died, would still show as Green.
Recommended Satellite Transmitters for Station Performance Benchmarking
A few known-good satellite transmitters to test with with (as of November 2020) are:
- For a station operating on the VHF Band:
- NOAA 15, 18, 19- The APT transmitters (very strong signals - considered to be the 'hello world' of satellite observations)
- ISS - If operating, the APRS transmitter is very strong, but may only transmit intermittently throughout a pass.
- CAS4A / CAS4B - Continuous CW and GMSK transmitters - a good example of a 'weaker' cube-sat signal.
- Max Valier Sat - Another weaker CW signal.
- For a station operating on the UHF band:
- FalconSat3 - The FSK downlink transmits continuously, and is an excellent benchmark for overall station performance. A high performing station may receive upwards of 600 data packets in a single pass.
- SpooQy-1 - Regular GMSK packets.
- OPS-SAT - Regular GMSK packets, fairly strong.
- ARMADILLO - A higher data rate signal, requiring a fairly good SNR to be able to decode the (hillarious) 19.2kbps GFSK packets.
- LUSAT - CW Signal Generator in space. Continuous, strong signal.
Rating an Observation
After each observation, you should rate it. More information here, but the bottom line is rate the observation:
- Good if the satellite is seen in the waterfall at all. Different modulations appear differently in the waterfall, but will appear
- Bad if the satellite is not seen.
Observations which do not produce any artefacts (Waterfall, audio, data packets) will automatically be considered as failed, and will eventually be deleted.
For a more detailed guide on testing, see Operation
Calibrating frequency offset (PPM)
If your observations result in signals which appear to be 'off centre' of the waterfall, then you may need to set a frequency offset correction. Guides on how to determine this correction via a few different methods are available here: Adjusting the SatNOGS Client#Frequency Offset Calibration
Mitigating Local Noise
If you are finding the signal-to-noise of your observation seems a bit low, or you aren't seeing any signals from the known-good satellites listed above, then your station may be limited by local electrical noise. A more comprehensive guide on how to identify sources of noise is being developed, but as a starting point:
- Turn on/off nearby electrical devices while an observation is running (or while looking at a waterfall using CubicSDR as described further above).
- Common sources of electrical noise include:
- LED lightbulbs or floodlights
- USB Chargers (or really any switch-mode power supply)
- Power-over-Ethernet systems
- Unshielded ethernet cables (or even shielded cables)
- HDMI and DVI cables, and computer monitors.
Now that you've got this station working on the bench, what's next?
- Buy/Build an antenna suited to satellite observations. Check out the Antennas page for ideas.
- Mount your antenna away from obstructions, and ideally away from sources of electrical noise like ethernet cables, LED lights, and other electronic equipment.
- Situate your SDR and Raspberry Pi (or other computer) as far away as practical from your antenna. If you absolutely must mount it on the mast beneath the antenna and use a metal box, and run a separate DC power supply instead of using PoE (which can produce considerable amount of RF noise)
Building a Box
- No-Rotator setup (Note the warning at the top of this page)