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: about 1 month 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 (2 months ago)
- Default Branch: main
- Last Pushed: 2025-08-28T19:39:14.000Z (about 1 month ago)
- Last Synced: 2025-08-29T01:34:44.142Z (about 1 month ago)
- Topics: diamond-d3000, discone-antenna, gnu-radio, raspberry-pi, rtl-sdr, satellite, signal-processing, tle
- Language: Python
- Homepage:
- Size: 6.6 MB
- Stars: 0
- 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 auto/tracker.py
```