Hi, my name is Dan and my ham radio callsign is M0WUT.
I am developing an automated Raspberry Pi Zero based transceiver for the WSPR amateur mode.
What is WSPR?
WSPR stands for Weak Signal Propogation Reporter (full details WSJT Home Page) developed by Joe Taylor, K1JT.
In short, amateur stations transmit data packets containing their callsign, their location and how much power they are transmitting with. Once received, these can be decoded by a computer who uploads them to a central database Database | WSPRnet This can then be used to see whether conditions are good for working certain places on certain bands or not. It is also used as it is very bandwidth efficient (approximately 5Hz bandwidth) as well as time division multiplexed and due to the large amount of error correction built into the code, it allows contacts to be made using very low power.
The map below shows all stations received by my friend George M1GEO in a 24 hour period. Nearly all these stations were running <5W output power. George has a very good article explaining the coding side of the WSPR protocol and using an Arduino to generate the tones from a frequency synthesiser board off eBay which can be found here: https://www.george-smart.co.uk/arduino/arduino_wspr/
The WSPR protocol encodes your callsign, power and location in 162 'bits'. For full information on how this is done, this document by Andy Talbot, G4JNT is the best example I found http://www.g4jnt.com/wspr_coding_process.pdf I will also be sharing my Arduino code to perform the encoding in a later part of this project. I write 'bits' as it is not strictly 1 bit in the binary sense, it can take the value 0-3. This is due to the WSPR transmission uses 4-FSK. FSK stands for Frequency Shift Keying and works by sending a carrier at a single frequency and then the information is carried by the frequency the carrier is at. The 4 indicates that there are 4 possible frequencies for the carrier, hence my use of 'bits' above as the use of 4 tones allow a value between 0-3 to be sent at any instant in time. The WSPR tone spacing is 375/256 Hz or 1.465 Hz so the entire bandwidth is roughly 3 times that (4 tones -> 3 lots of spacing or about 4.5Hz.) The WSPR system is based around 2 minute windows (starting on the even minutes) where a station will decide (randomly but you can alter the probability you will transmit with a TX (transmit) percentage slider) whether to receive or transmit for that window. If transmitting, it will begin to send the 162 tones (which have the minimal time period of (1/seperation frequency = 256/375s or 683ms) This takes 0.683*162 = 110 seconds (roughly) and then will wait the remaining 10 seconds in the window before starting again. The main transmission method is by connecting the output of your computer soundcard into the microphone input of the radio so is treated the same way as if the user were whistling into the radio at the right frequency. This is called AFSK or Audio Frequency Shift Keying as the changing frequency is happening at audio frequencies then being mixed with an oscillator to produce the output at the right frequency. The alternative (as used in WSPRpi) is not to bother with this mixing process and just have an oscillator running at the RF frequency and directly changed the output frequency of that. This is called FSK and has the advantages of not requiring a modulator to combine the audio and LO signal which means a simpler circuit and no mixing products. Any harmonics of the audio signal will also get mixed with any (and all!) of the harmonics from the local oscillator producing a large number of output frequencies, not just the single carrier that is desired.
In receive, the radio will convert the received WSPR signal down to audio frequencies which are then fed into the soundcard of a computer. Once a two minute receive window is complete, the software will decode any WSPR signal that were received and upload them to the WSPR database, allowing maps like the one above to be produced. By only transmitting 20% (this is adjustable but 20% is the standard) of the time this allows even more users to use the same frequencies as different stations will transmit at different times.
WSPR GUI receiving Austria (OE6YWF) and Italy (IZ6BYY and IZ0IWD) on the 20 metre (14MHz) amateur band.
The problem with this is that this setup gets rather messy with all of the cable required:
CAT/PTT is the system by which the computer tells the radio to start or stop transmitting.
It also requires my radio and my computer to be on the whole time. This consumes power and ties up resources. Also I haven't found a nice way to swap quickly between WSPR and normal operating (voice or Morse Code) without at least unplugging something and plugging in something elsewhich is a faff and I sometime forget. (For ham radio people: It may be possible on the K3, it's fairly new to me but it certainly couldn't be done on my old FT840)
WPSR is also a useful thing to take on a DXpedition (a radio trip to an unusual country or island which is rarely operated from) as it allows other people to see if they can hear your WSPR station to give them an idea whether it is possible for them to contact you and vice versa, it allows the operators on the trip to see if there is good propagation to a certain place.
The (sort of) Solution
Some people have produced standalone WSPR beacons which are transmit only, but these are normally expensive for what they are (if you look at George's website mentioned above he does it with an Arduino, a £7 board of eBay and about £2 of components and for little extra functionality the nicely enclosed units are £40 up), you have to tell them when to start transmitting as they have no way of knowing the time, have limited band options (either supplied with a single filter or bulky external ones) and don't offer good options for useful features such as automatic band changes or a useful way to see the results (particularly if on a trip and there is no Internet connection!) OK, the last point is impossible without a receiver as you rely on other people uploading to their received stations to the database so you can see who has received your signal. This makes them useless for you, as the operator of the rare station, without Internet.
The (Actual) Solution!
The solution I have gone with is a Pi Zero, adding Ethernet and a sound card via the GPIO (I want small size and no messy cables), and adding a PIC32 (Arduino only has 32 bit precision floating point numbers which is not accurate enough) with a Silicon Labs Si5351 synthesiser IC. This little chip cost 60p and is capable of generating 3 independent clock signal up to 100MHz. This plus an amplifer for the transmit side, some switchable filters to allow different bands to be used and a simple receiver should allow this to be possible and entirely self contained. A nice feature I added was a GPS receiver (I am most of the way through this project by now so this is currently working) to allow the unit to know when the two minutes transmit /receive windows were starting, to automatically know the location and to allow the frequency to be corrected using the 1pps output from the GPS receiver. The system knowing the actual time means that it can be set to automatically switch bands at certain times of day and the Ethernet socket is important even with the Pi Zero W having Wifi as the Pi will host a web server showing all of the received stations and the configuration for the WSPRpi so it (should!) be entirely driverless and need no extra software to run. If the trip is somewhere remote and there is no Internet, often a wired LAN is set up to allow the operators' logs to be synchronised but often there is no wireless network which is why the Ethernet connection is still important. I have named this project WSPRpi. The intended plan (a reasonable amount of which has already been built) is below.
The first part (adding Ethernet and a sound card) is online on element14 here: Adding Ethernet and Sound Card to Rpi Zero (WSPRpi part 1)
Thanks for reading. Any feedback would be appreciated in the comments or on Twitter @m0wut
Thanks and 73 (amateur radio speak for best wishes)