TinyGS SDR Ground Station

TinyGS TinyGS logo

TinyGS is an open network of Ground Stations distributed around the world to receive and operate LoRa satellites, weather probes and other flying objects, using cheap and versatile modules.

Currently, the project is based on ESP32 boards and it is compatible with sx126x and sx127x LoRa modules.

In this tutorial, you will build your own SDR based ground station and connect it to the tinyGS network, expanding the network.

Ground Station Setup

The archeicture is heavly inspired from the SatNOGS project; any linux PC attached to a SDR and RF frontend can act as a ground station.

Hardware

Assuming you do not already have a running ground station. All you need is a linux PC (a raspberry pi is a good choice) along with a SDR of your choice a cheap rtl sdr will suffice and finally a antenna tunned to the band of your choice.

Connection Diagram

LoRa satellites primarily operate across sub-GHz ISM (Industrial, Scientific, and Medical) bands.

  • 70-Centimeter Band (430–440 MHz)
  • MetSat Band (401–403 MHz):
  • 33-Centimeter Band (902–928 MHz)
  • ISM Band Some sutiable antennas are the QFH, Egg beater, Turnstile; read more about them in the SatNOGs antennas section.

Software

On your linux PC make sure to install

  • Python 3.9–3.13 and pip.
  • SoapySDR with the driver module for your SDR (this project uses the system python3-soapysdr bindings, not a pip package). On Debian/Ubuntu:

    sudo apt install python3-soapysdr soapysdr-tools
    # plus the module for your device, e.g.:
    sudo apt install soapysdr0.8-module-rtlsdr    # RTL-SDR
    #  soapysdr0.8-module-hackrf  soapysdr0.8-module-airspy  ...
    

    If your SDR is an RTL-SDR, the kernel rtlsdr driver and rtl-sdr userspace tools are handy for sanity checks but not required:

    sudo apt install rtl-sdr
    

    Note: Because SoapySDR isn’t on PyPI, the venv needs to see the system bindings:

    • either create the venv with python -m venv --system-site-packages .venv, or
    • add the system dist-packages to the venv via a .pth file (.venv/lib/python3.13/site-packages/soapysdr.pth containing /usr/lib/python3/dist-packages).
  • Optional but highly recommended: a 0.5–0.4 s spectrum/decoder sanity tool, rtl_test (ships with rtl-sdr) or gqrx for a live waterfall.

TinyGS Python Library

TinyGS-SDR is a UNOFFICIAL REIMPLEMENTATION of the ESP32 TinyGS firmware source code at github.com/G4lile0/tinyGS (commit at time of analysis). The library handles MQTT-TLS connection to mqtt.tinygs.com allowing it to receive satellite assignments and publish packets to the server.

Install it from PyPI:


python -m venv .venv && source .venv/bin/activate
pip install tinygs            # the station library + softlora decoder
pip install 'tinygs[sdr]'     # the RTL-SDR Python backend

The tinygs package pulls in the softlora dependency, a complete Python implementation of the LoRa physical layer (PHY) decoder (source).

Get TinyGS credentials (Telegram bot)

Credentials come from the TinyGS Telegram bot, not from the website:

  1. Open Telegram and message @TinyGS_bot (the official TinyGS bot).
  2. Send /mqtt to the bot.
  3. The bot replies with your MQTT username and password for mqtt.tinygs.com. Keep both, they are your TINYGS_USER / TINYGS_PASSWORD.

Sanity Check before going live

With the SDR plugged in, confirm SoapySDR sees it:

SoapySDRUtil --find          # lists every attached device
SoapySDRUtil --probe="driver=rtlsdr"   # (adjust driver) — shows gains, ranges

Register Station with CLI

Run

tinygs-create

to create your station, you will be prompted to enter the following:

  1. MQTT username — from the TinyGS Telegram bot /mqtt
  2. MQTT password — same place; hidden as you type
  3. Device MAC — 12 hex chars (e.g. AABB11223344); becomes the MQTT client id (cli.py:118) use ip link on linux to get your mac adress
  4. Station name — shown on portal + used in MQTT topics (e.g. my_sdr_station)
  5. Latitude / Longitude / Altitude — required for pass geometry & map
  6. Auto-Tune weblogin URL on connect? — answer Y
  7. RTL-SDR settings — sample rate (250000), gain (30), device index (0), chunk size (65536); blanks use defaults

Check your station

Once you run the create command you should receive a welcome message from tinygs telegram bot, if you request a weblogin link you can see your dashboard

TinyGS Dashboard

By defualt the station is set to offline until you set it to run. In order to receive satellite assignments and observations, you need to do 2 things

  1. Run tinygs-run, which activates the station
  2. Enable auto tune from dashboard. Click on your station> operate > enable auto tune. the number next to enable is the frequency your station is tuned too.
TinyGS Dashboard



Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • LoRa Synchronization Analysis
  • LoRa ELM Estimator
  • SatNOGs Ground Station
  • Building a SatNOGs Ground Station in Egypt
  • End of My GSoC journey GNU Radio FM Receiver