Saturday 26 January 2013

Raspberry Whispers

After success with the "human readable" QRSS modes of FSK Morse and (my version of) "Hellschreiber", as seen here received by Steen Erik, la5goa up in arctic Norway,

I decided to add WSPR to my RPi Beacon's repertoire, to make it truly "multi-mode". I don't mean porting the WSPR code onto RPi (though doubtless this can be done - a Linux version is available). I mean cooking up my own WSPR signals in Python and transmitting them from inside the beacon previously described.

For anybody that doesn't know, WSPR is a true digital radio mode (in the sense that it is intended to be read by machines, rather than humans), developed by Joe Taylor, k1jt. I have enjoyed sending WSPR signals from my PIC-based multi-mode beacon - so I know the steps required. However, things have changed since the first time I trod the lonely path - so here's a description of how to do it today.

When I first played with generating WSPR signals, back in the summer of 2010, the secret was to use the command line version of k1jt's "WSPR" program. However, typing "WSPR" into a DOS command line these days just brings up the standard WSPR GUI. Fortunately, there's an alternative path...

The program "WSPRcode.exe" exists specifically to generate the WSPR message, which encodes the transmitting station's call sign, locator and power (in dBm). The locator is four symbols in the Maidenhead System which - for my home - is "IO83". The power is given in dBm (i.e. dB relative to 1 mW) and - as I'm producing around 200mW, I entered "23", making my message "m0xpd IO83 23".

Simply appending this string as an argument for the WSPRcode executable does the job...

The channel symbols describe which of the four frequencies which constitute the WSPR signal must be transmitted in each sequential interval. The WSPR "standard" tells us these frequencies must 1.4648Hz apart and that each interval lasts a little over 682 milliseconds. Also, a WSPR message must start 1 second into an even minute (that's to say the 0th, 2nd, 4th ... minute of the hour) in order to be received and understood.

It is clear that not only good timing - but accurate synchronisation to ABSOLUTE time is required.

Most WSPR transmissions come from computers, which keep good time (and may even be synchronised to time servers on the internet). Simple little beacons (like my PIC-based system) need to be started at precisely the top of the hour and keep good time thereafter. My PIC beacon hacked the timing framework developed by Gene Marcus, w3pm, who even included features required to synchronise to a GPS-derived timecode (though I haven't used that option recently).

In the case of the new Raspberry Pi beacon, timing remains the critical aspect of WSPR operation. Fortunately, unlike most PIC or AVR/Arduino alternatives, the RPi usually lives hooked up to the 'net, so absolute time is readily accessible. 

Here's the simple additional lines needed in my Python beacon code to transmit WSPR...

 'WSPR_Message' is the vector of channel symbols (obtained from WSPRcode.exe, above). WSPR_freq is the desired transmission frequency and WSPR_df is the frequency spacing between the channels ( = 1.4648 Hz). My code has a main timing loop which waits for the start of each minute and calls either FSK-CW, Hellschreiber or (now) WSPR routines at the appropriate point in a 10-minute cycle, by setting the "Proceed" variable to non-zero value. Proceed = 1 initiates a WSPR transmission.

I tried the Raspberry-flavoured WSPR signal on the 30m band and was immediately spotted by the University of Twente's 'Experimentele TelecommunicatieGroep Drienerlo', pi4tht and by Jorgen, oz7it.

Here are the reports of these spots from the WSPRnet reporting system...

WSPRnet also has a map report...

Here's a snapshot of the map taken as I write, showing the last 24 hours of spots (the thickness of the line between me and a receiving station indicates the number of times that station reported receiving my signal - so it's a measure of the quality of the link to that receiver). The map includes the Raspberry Pi's best "dx" (distance) to date - the 2552 kilometers to Alexander, ua3arc's receiver in Moscow.

Please let me know if you detect a whiff of raspberry on 30 or 40 metres over the next few days

...-.- de m0xpd


  1. Sounds like a great project. Unfortunately, I don't understand how you "transmit" the signal. Any info on RF power, antenna, TX system etc much appreciated.


    1. Thanks for your comment, Stefan.
      The original transmitter system is described in this post . It produces between 0.1 and 0.6 Watts and I'm using a "g5rv" antenna.

  2. Several of us who saw the article on HackADay have a question about the low pass filter requirement. Will the use of a standard 1.8-30MHz TVI LPF be sufficient, or do we really need a band-pass filter for each band we intend on transmitting on?

    1. I prefer an LPF specific to the band I'm using. These little QRP PAs sometimes are pushed pretty hard and their output isn't as pure as one might like - in which case a band-specific LPF catches the low-order harmonics. Its not as if they are either difficult or expensive to make - the only issue is the chore of switching between them when you QSY (in which case you could consider something like this, which switches automatically).

  3. Hi. Having looked around the forums, you appear to be an expert on Wspr and the RPI.
    i had mine "almost" working and it would now appear that I have damaged the GPIO port. Don't know how, but these things happen!
    Is it possible to assign a different GPIO pin to be the GPCLK output? If so how?
    I am a "senior" radio ham from the old days and definitely not a geek, so please reply in simple terms.
    Alternatively, must I give up and use the RPI for something else.

    1. Les
      Sorry - any "expertise" I may have certainly is not associated with the RPi!

      I do not know if it is possible to re-assign the clock (I guess you refer to pin 7)to another pin. In truth, I would assume it is not possible. However, you should pose this question to real experts - perhaps at the RPi forum.

      Having said that, WSPR seems to me to be so slow that I would have expected you could set up a clock equivalent under software control on another GPIO line and write some code that achieves your goal through "bit banging" (use that phrase in a search engine if you need explanation).

      Good luck and sorry to have been of so very little help.

  4. I've just followed the same process based upon George Smart's code ( on the Arduino using your AD9850 DDS shield. Just looking at the Si351A shield bought from Kanga and contemplating doing the same again...

    73 de Andy