Tracking Balloons with WSPR

What is WSPR?

WSPR is a low data rate digital protocol intended for measuring RF propagation, typically on LF and HF bands and at very low powers (often 1W to as little as 20mW). WSPR messages are digital packets that contain just a few pieces of data:

  • Callsign of sender
  • 4-digit grid locator for indicating transmitter location
  • Transmit power in dBm

This data allows a listener to know how far away transmissions originated and with how much power the transmission was made, giving a fairly realistic and real-time measurement of RF propagation.

On the physical layer, WSPR consists of a 4FSK modulated signal with a separation of 1.4648Hz between tones. This frequency shift is so small that it is nearly imperceptible to the human ear. Bits are transmitted at 1.4648 baud (which is crazy slow!) and messages take just shy of 2 minutes to transmit, which contributes to the protocol’s robustness.

WSPR includes a few other features that help it decode reliably even at very low SNR. Each WSPR message must be transmitted on an even minute, +/- a couple seconds, so receivers know when to expect the beginning of a message. Each message includes forward error correction (FEC) so that receivers can correct any bit errors that do occur during transmission. Messages are also combined with a 162-bit pseudo-random sequence sync vector to aid in receiver synchronization to the bit stream.

Why use it for balloon tracking?

WSPR provides a great transport for data when balloon tracking, as distances of 1000km+ are easily spanned with merely 20mW of power or less. WSPR receivers are located around the globe, and are continuously listening for WSPR transmissions which they relay to the Internet, providing an easy-to-use backbone for balloon data.

The hardware required to transmit WSPR is also very simple. Most transmitters are very simple, and consist of a single I2C programmable oscillator with a simple low-pass filter. The oscillator is re-programmed to different frequencies on the I2C bus for each bit transmitted. Even though this method is several orders of magnitude too slow for conventional modulation schemes, the extremely slow baud rate of WSPR allows this technique to work very well.

While all this sounds perfect for balloons, there are some practical limitations: you can only transmit very limited data, and transmissions are super slow. Packets only include 4-digit grid locators, which only localizes you down to a 70mi x 100mi square. There is no provision for any additional data such as battery voltage, altitude, temperature, etc.

(mis)Using WSPR fields to encode data

We can work around two of these issues with a slight hack on the WSPR network. WSPR packets that have callsigns with ‘0’ or ‘Q’ are considered invalid packets (since no allocated callsign starts with these characters). However, WSPR receivers still process and upload these packets to WSPRnet, and they can be used for balloon telemetry.

Typically trackers will transmit a “standard” WSPR packet that shows up correctly on the WSPRnet map, followed by an “invalid” ‘0’-packet that encodes some additional telemetry. This packet typically encodes battery voltage, temperature, altitude, and 2 additional characters of maidenhead grid locator into a single WSPR packet.


Check back for a follow-up post where I walk through how this data is encoded in my WSPR tracker. All of my code will be open-source and available for reuse!


Ethan is a computer engineer and open source hardware/software developer from Michigan. He enjoys AVR and linux development, photography, mountain biking, and drinking significant amounts of home-roasted coffee. Find out more at

Tagged with: , , , , , , ,
Posted in HAB, Projects

Leave a Reply

Your email address will not be published. Required fields are marked *