{"id":2777,"date":"2017-09-30T17:00:39","date_gmt":"2017-09-30T22:00:39","guid":{"rendered":"http:\/\/protofusion.org\/wordpress\/?p=2777"},"modified":"2025-11-13T22:05:23","modified_gmt":"2025-11-14T03:05:23","slug":"tracking-balloons-with-wspr","status":"publish","type":"post","link":"http:\/\/protofusion.org\/wordpress\/2017\/09\/tracking-balloons-with-wspr\/","title":{"rendered":"Tracking Balloons with WSPR"},"content":{"rendered":"<h2>What is WSPR?<\/h2>\n<p>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:<\/p>\n<ul>\n<li>Callsign of sender<\/li>\n<li>4-digit grid locator for indicating transmitter location<\/li>\n<li>Transmit power in dBm<\/li>\n<\/ul>\n<p>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.<\/p>\n<p><!--more--><\/p>\n<p><a href=\"http:\/\/protofusion.org\/wordpress\/wp-content\/uploads\/2017\/09\/wsprmap.png\" data-rel=\"lightbox-image-0\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-2790\" src=\"http:\/\/protofusion.org\/wordpress\/wp-content\/uploads\/2017\/09\/wsprmap-600x316.png\" alt=\"\" width=\"550\" height=\"290\" srcset=\"http:\/\/protofusion.org\/wordpress\/wp-content\/uploads\/2017\/09\/wsprmap-600x316.png 600w, http:\/\/protofusion.org\/wordpress\/wp-content\/uploads\/2017\/09\/wsprmap-300x158.png 300w, http:\/\/protofusion.org\/wordpress\/wp-content\/uploads\/2017\/09\/wsprmap-768x404.png 768w, http:\/\/protofusion.org\/wordpress\/wp-content\/uploads\/2017\/09\/wsprmap.png 781w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><\/p>\n<p>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&#8217;s robustness.<\/p>\n<p>WSPR includes a few other features that help it decode\u00a0reliably 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.<\/p>\n<h2><a href=\"http:\/\/protofusion.org\/wordpress\/wp-content\/uploads\/2017\/09\/wspr-rx-badharmonics.png\" data-rel=\"lightbox-image-1\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-2784\" src=\"http:\/\/protofusion.org\/wordpress\/wp-content\/uploads\/2017\/09\/wspr-rx-badharmonics-600x455.png\" alt=\"\" width=\"550\" height=\"417\" srcset=\"http:\/\/protofusion.org\/wordpress\/wp-content\/uploads\/2017\/09\/wspr-rx-badharmonics-600x455.png 600w, http:\/\/protofusion.org\/wordpress\/wp-content\/uploads\/2017\/09\/wspr-rx-badharmonics-300x227.png 300w, http:\/\/protofusion.org\/wordpress\/wp-content\/uploads\/2017\/09\/wspr-rx-badharmonics.png 674w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><\/h2>\n<h2>Why use it for balloon tracking?<\/h2>\n<p>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.<\/p>\n<p>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.<\/p>\n<p>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.<\/p>\n<p><a href=\"http:\/\/protofusion.org\/wordpress\/wp-content\/uploads\/2017\/09\/codeshot.png\" data-rel=\"lightbox-image-2\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-2786\" src=\"http:\/\/protofusion.org\/wordpress\/wp-content\/uploads\/2017\/09\/codeshot-600x281.png\" alt=\"\" width=\"550\" height=\"258\" srcset=\"http:\/\/protofusion.org\/wordpress\/wp-content\/uploads\/2017\/09\/codeshot-600x281.png 600w, http:\/\/protofusion.org\/wordpress\/wp-content\/uploads\/2017\/09\/codeshot-300x140.png 300w, http:\/\/protofusion.org\/wordpress\/wp-content\/uploads\/2017\/09\/codeshot-768x359.png 768w, http:\/\/protofusion.org\/wordpress\/wp-content\/uploads\/2017\/09\/codeshot.png 823w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><\/p>\n<h2>(mis)Using WSPR fields to encode data<\/h2>\n<p>We can work around two of these issues with a slight hack on the WSPR network. WSPR packets that have callsigns with &#8216;0&#8217; or &#8216;Q&#8217; 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.<\/p>\n<p>Typically trackers will transmit a &#8220;standard&#8221; WSPR packet that shows up correctly on the WSPRnet map, followed by an &#8220;invalid&#8221; &#8216;0&#8217;-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.<\/p>\n<p>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!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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<span class=\"ellipsis\">&hellip;<\/span><\/p>\n<div class=\"read-more\"><a href=\"http:\/\/protofusion.org\/wordpress\/2017\/09\/tracking-balloons-with-wspr\/\">Read more &#8250;<\/a><\/div>\n<p><!-- end of .read-more --><\/p>\n","protected":false},"author":1,"featured_media":2779,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_kadence_starter_templates_imported_post":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[136,35],"tags":[285,284,137,6,185,286,264,283],"class_list":["post-2777","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-hab","category-projects","tag-encoding","tag-hf","tag-high-altitude-balloon","tag-open-source","tag-open-source-hardware","tag-rf","tag-stm32f0","tag-wspr"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"http:\/\/protofusion.org\/wordpress\/wp-content\/uploads\/2017\/09\/img_1568.jpg","jetpack_shortlink":"https:\/\/wp.me\/pNjAs-IN","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/protofusion.org\/wordpress\/wp-json\/wp\/v2\/posts\/2777","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/protofusion.org\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/protofusion.org\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/protofusion.org\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/protofusion.org\/wordpress\/wp-json\/wp\/v2\/comments?post=2777"}],"version-history":[{"count":12,"href":"http:\/\/protofusion.org\/wordpress\/wp-json\/wp\/v2\/posts\/2777\/revisions"}],"predecessor-version":[{"id":3558,"href":"http:\/\/protofusion.org\/wordpress\/wp-json\/wp\/v2\/posts\/2777\/revisions\/3558"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/protofusion.org\/wordpress\/wp-json\/wp\/v2\/media\/2779"}],"wp:attachment":[{"href":"http:\/\/protofusion.org\/wordpress\/wp-json\/wp\/v2\/media?parent=2777"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/protofusion.org\/wordpress\/wp-json\/wp\/v2\/categories?post=2777"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/protofusion.org\/wordpress\/wp-json\/wp\/v2\/tags?post=2777"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}