https://github.com/xarantolus/groundstation
My self-built ground station for receiving satellite signals
https://github.com/xarantolus/groundstation
diamond-d3000 discone-antenna gnu-radio raspberry-pi rtl-sdr satellite signal-processing tle
Last synced: 20 days ago
JSON representation
My self-built ground station for receiving satellite signals
- Host: GitHub
- URL: https://github.com/xarantolus/groundstation
- Owner: xarantolus
- Created: 2025-07-26T21:19:32.000Z (10 months ago)
- Default Branch: main
- Last Pushed: 2026-05-08T20:12:31.000Z (26 days ago)
- Last Synced: 2026-05-08T22:23:45.490Z (26 days ago)
- Topics: diamond-d3000, discone-antenna, gnu-radio, raspberry-pi, rtl-sdr, satellite, signal-processing, tle
- Language: Python
- Homepage:
- Size: 9.48 MB
- Stars: 2
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Ground Station
This repository contains code and documentation for my custom satellite ground station. I use it to receive amateur satellite signals and weather satellites, like the following image from the NOAA 19 satellite:

### Hardware Components
My ground station uses a [Diamond D-3000 Discone 25-3000 MHz N](https://www.wimo.com/de/d-3000n) antenna, which means that I don't need a rotor.

For digitizing the signal, an [RTL-SDR Blog v4](https://www.ebay.de/itm/276000566513) and [its LNA](https://www.ebay.de/itm/283455455676) (powered via Bias-Tee) are used, connected to the antenna via a "LMR400 UF UltraFlex Equivalent" cable.
The groundstation software of this repo runs on a Raspberry Pi 5 Model B Rev 1.0, with 4 GB of RAM. The SDR is plugged into the Pi on a USB3 port.
### Software Setup
Here is an approximate description on how to make this software work.
#### Permanent OS Settings
Basically follow the instructions [for the RTL-SDR Blog V4 here](https://www.rtl-sdr.com/V4/), which also recommends disabling certain drivers. Basically, run the following command and reboot:
```
echo 'blacklist dvb_usb_rtl28xxu' | sudo tee --append /etc/modprobe.d/blacklist-dvb_usb_rtl28xxu.conf
```
Additionally, if the Raspberry Pi is connected via WIFI, set it to auto-reconnect forever:
```
nmcli connection show # find network
nmcli connection modify connection.autoconnect-retries 0 # <- forever
```
And it can also make sense to add these crontab entries (`sudo crontab -e`):
```
# Remove outdated recordings
@reboot rm -rf /tmp/recorder*
0 2 * * * find /tmp -maxdepth 1 -type d -name 'recorder*' -amin +1440 -exec rm -rf {} \;
# Reboot at night if we lost connection to the NAS
30 2 * * * if ! ping -c 5 > /dev/null 2>&1; then /sbin/reboot; fi
# Clear podman containers / build cache - also useful for normal user
0 0 * * * podman system prune -f --filter "until=336h"
0 0 * * * podman builder prune -f --filter "until=336h"
```
#### Installation
Some dependencies need to be installed for this all to work:
```
sudo apt update && sudo apt upgrade -y && sudo apt-get install -y podman zstd python3 python3-pip rtl-sdr
```
Next, build the containers for the device:
```
sudo ./setup.sh
```
Also, on the target device (Raspberry Pi), create this directory for GNU Radio:
```
mkdir -p /root/.config/gnuradio/prefs
```
#### Configuration
Configure a `.env` file to include the following values and put it into the root of this repository:
```
# Find out how to get one at https://www.n2yo.com/api/
N2YO_API_KEY=
# Location/coordinates
# e.g. for Berlin the values would be "52.518213" for lat, and "13.400230" for lon
LOCATION_LAT=
LOCATION_LON=
# Altitude above sea level in meters, e.g. "43"
# Can use e.g. https://vividmaps.com/elevation-finder/
LOCATION_ALT=
```
#### Running the software
In the main repo directory, run this to actually run the groundstation:
```
sudo python -m auto.main
```