Skip to content
Mark Jessop edited this page May 27, 2024 · 15 revisions

Project Horus's Telemetry Demodulator Library

Horus Binary Modem FFT

Above: Spectrogram of the Horus Binary 4-FSK modem signal.

Authors

Written by:

What is it?

This repository contains:

  • libhorus - A C library containing a high performance 2/4-FSK-demodulator (originally developed as part of the Codec2 project by David Rowe), along with Golay and LDPC forward-error correction algorithms.
  • horus_demod - A command-line version of the FSK demodulator.
  • horusdemodlib - A Python library which wraps libhorus, and provides additional functions to decode telemetry into formats suitable for uploading to the Habhub tracker and other services.

In particular, this library provides a decoder for the 'Horus Binary' telemetry system, which is the primary tracking system used in Project Horus's High-Altitude Balloon launches.

The modem in this library can also decode the standard UKHAS RTTY telemetry used on many other high-altitude balloon flights.

Why use it?

A HAB telemetry payload transmitting Horus Binary format telemetry can provide position updates approximately every 3 seconds. Using just 10mW transmit power on the 434 MHz ISM/LIPD/70cm band, this modem can offer ~7dB improved demodulation performance compared to RTTY running at the same baud rate. There is some further information on the modem performance available here.

This means potentially longer decoding range, both in the air, and on the ground. The modem uses rate Golay(23,12) forward-error correction, so you'll have far less issues with failed packet decodes.

The ye-olde RTTY transmitters used by many high-altitude balloon flights encode telemetry as ASCII text. This is very wasteful compared to just sending data as raw binary types. RTTY also uses RS232 framing, which means even more overhead. Horus Binary uses a binary packet format, which gets the basic tracking data across in just 22 bytes. Information on the packet and framing format is available here.

The current Horus Binary modem uses ~1kHz of bandwidth, so can be received using conventional single-sideband receivers, just like you would do with a RTTY payload. Software-Defined Radio receivers can also be used.

How do I receive it?

So, you want to receive telemetry from someone's high-altitude balloon flight, or set up to receive telemetry from your own payload?

First up, you will need some kind of receiver for whatever frequency the telemetry is being transmitted on. Usually this is within the 434 MHz ISM/LIPD/70cm band, but could be different. You need a receiver capable of receiving Single-Sideband, in particular the 'upper' sideband ('USB' - no, not that USB). This could be a conventional amateur radio transceiver (think IC-7000, IC-706, FT-817, the list goes on and on...), or a scanner (Icom IC-R10, Yupiteru MVT-7100, etc...).

You can also use software-defined radio receivers, such as the ubiquitous RTL-SDR (amongst others), along with software such as SDR-Console, SDR#, or GQRX.

Windows / Linux / OSX

It's easiest to demodulate telemetry using Horus-GUI. Use this setup guide.

Raspberry Pi 'Headless' Setup

It's also possible to make a 'headless' (no screen) receiver using a RTL-SDR and a Raspberry Pi (or some other small Linux machine). Follow this guide.

Commonly Used Frequencies

Horus Binary transmissions are usually found on the 70cm amateur radio band. Some commonly used frequencies are as follows:

  • Australia: 434.200 MHz USB (with secondary payloads on 434.210 MHz)
  • Europe
  • Western Europe: 434.714 MHz USB
  • Poland: 437.600 MHz USB
  • USA (California): 431.050 MHz USB

You can also often find the frequency of flights by looking at the payload information detail on https://amateur.sondehub.org/

General Modem Info

There is also some general information about running the modem from the command-line available here.

How do I transmit it?

A worked example of generating and transmitting Horus Binary telemetry on Arduino, using the RadioLib library, is available here: https://github.com/projecthorus/horusbinary_radiolib

Currently the most common platform for Horus Binary telemetry transmission is the Vaisala RS41 radiosonde. Using radiosonde_auto_rx we track and recover these radiosonde and reprogram them with open source firmware, which generates the Horus Binary modulation. These radiosondes are launched in many places around the world, so go hunting and get your own free balloon tracker!

I can recommend the following firmware to flash onto these radiosondes:

  • RS41ng - Highly featured, supports lots of external sensor options, and can also transmit other modes.
  • RS41HUP_V2 - More cut-down firmware, uses a bit less power than RS41ng.

Roel Kroes has also written firmware for a custom balloon payload using the RadioLib method, available here: https://github.com/RoelKroes/HorusBinary_Tracker

If you are going to fly your own payload using Horus Binary, you must get a payload ID allocated for your use. This can be done by submitting an issue or a pull request to this repository, or e-mailing me at vk5qi (at) rfhead.net - NOTE: I will no longer be assigning Horus v1 IDs. Please switch to using firmware that supports the Horus Binary v2 format, e.g. RS41ng

Do not use the testing (4FSKTEST-V2) payload ID on an actual launch!

Payloads will automatically appear on the SondeHub-Amateur tracker with no configuration required.

For further information on configuring the RS41ng firmware for Horus Binary transmissions, refer here.

Contacts