WSPR with a Raspberry Pi

8 minute read

We have been looking at setting up an event aerial at the Scout Hut, and the trouble with aerials is that propagation varies so dramatically. WSJT-X has a mode called wspr (weak signal propagation reporter), you can read more about it and see reports on the wsprnet website.

The WSPR software is designed for probing potential radio propagation paths using low-power beacon-like transmissions. WSPR signals convey a callsign, Maidenhead grid locator, and power level using a compressed data format with strong forward error correction and narrow-band 4-FSK modulation. The protocol is effective at signal-to-noise ratios as low as –28 dB in a 2500 Hz bandwidth. Receiving stations with internet access may automatically upload reception reports to a central database.

WSPR is also a way to qualify aerial performance, you can observe the performance through propagation changes and in theory compare two antenna systems by alternating the feed. You can run WSJT-X using a regular computer and HF rig controlled via CAT in the normal way, but this ties up a lot of resources. SOTABeams have a lot on WSPR and antenna testing in support of their dedicated hardware, but you can run WSPR on a raspberry pi single board computer using wsprrypi.

WSPR on a Raspberry Pi

I used Raspbian Lite, you can compile wsprry with that, but you do have to install git first using sudo-apt-get install git. Basically follow the author’s installation text and you are good to go. You can also sudo apt-get install screen to be able to detach from the ssh terminal screen leaving wspr running.

You can just about hear the modulation, it is about a 6Hz shift at times, so easier to hear if you tune the beat note low, so that the 6Hz is a greater proportion of the tone. You can of course use WSJT-X and a normal rig, but because this is a weak signal mode it is possible to use a Raspberry Pi to generate the signal directly, outputting a square wave on one of the GPIO pins.

That wants filtering otherwise it’s a very antisocial thing to do to put a squarewave onto the air. I used G3RJV’s sheet from GQRP and selected the 80m filter. I simulated this, it response is about -26dB at 7.1MHz, which is the second harmonic of the WSJT-X 80m centre frequency 3.5686MHz. To give a little bit more power and some protection from ESD onto the Pi’s GPIO I used a 2N3904 transistor with zero bias to amplify and buffer the signal.

The Pi with the filter board, before the transistor was added

Testing Toroids

I did wonder if I was asking for trouble buying my T37-2 toroids on ebay, which has a serious problem with counterfeit or simply wrongly listed electronic parts. Ebay is hardly an ISO9001 quality assured supplier with a traceable supply chain, you go to ebay because it’s cheap, not because it’s quality assured. I tested one by winding 29 turns on the 27turn 3uH part. Resonating it with 10nF peaked at 873k, implying 3.3uH, too much. with 28 turns that came down to 899k so 3.13uH so the specified 27 turns was best. Thank you spratreader for supplying the real deal.

Filter performance

At this low frequency it is easy to see the effects of the filter in a before and after:

the squarewave before the filter, and the output of filter terminated in 50 ohms at the scope input

Some of the ripple on the input is the effect of the filter reflecting back the rejected harmonics of the squarewave to the source. This ringing isn’t present1 when the filter is disconnected.

The Pi with the filter board, before the transistor was added

I simulated the filter in LTspice

Schematic and frequency response. The value is the figure after the open round bracket (, all the other stuff is to run a Monte Carlo simulation of what component spread does to the response, which is turned off by making value tolerance 0

80m trials and tribulations

I have never been active on the lower HF bands and it came as a great surprise just how hard it was to get a signal out. Power is about 16dBm, so the signal is weak to start off with, and first I tried a monoband hamstick antenna working against the radiator pipes. I was able to hear and decode my own signal, but it was not reported. Wsprrypi defaults to the old 80m centre frequency, I only had success being heard on the new frequency of 3.5686 MHz. Others seem to do OK with the old frequency, however.

Next was to take the Pi down to the IoAARC shack, where there is a half-size G5RV. I tried feeding the signal straight into the G5RV, and while the signal was audible at G5FM, it was not decodable. Mike M6FCT did make a fair comment that I had no ATU on the G5RV, so any mismatch was not going to help.

Finally at home I strung some wire between two trees about 6m above the ground as an end-fed antenna using a 9:1 unun, with a corrugated iron shed as a counterpoise and I started getting signal reports, from Germany. I used a homebrew ATU to match the SWR to less than 1:1.2. Using an ultrasonic tape measure against the house wall I gave myself a feel for how long 10m was, and so I reeled out a guess of 40m for the EFHW and elevated the middle 20m where the current node should be in an EFHW.

I got the idea from M6MQB on one of the IoAARC nets, he used his EFHW as an inverted vee and said it worked very well - again the current node is the part set at height.

WSPRnet reports

Success - Reports

I am a very weak signal, filtering WSPRnet on G stations most people are running 0.2 to 5W. Some of my problem in getting the signal out is this rig lacks grunt. I need to rebuild it a little, perhaps take a leaf out of the QRPlabs U3 PA. I used the bifilar output transformer of this mod with the 2N3904, I will move to using QRPLabs’ PA with the BS170 when I get some ordered, and that is a proven design, driven by the 3.3V Si 5351A module rather than a Pi. I was tempted by the U3 kit, which would be more use in an unattended location without a LAN, but the Raspberry Pi suits my use case a lot better, being remotely controllable over the LAN via SSH. I need to construct a few more filter modules and rebuild the board to keep the PA and Raspberry Pi together but make the low-pass filter modules plug-interchangeable. QRPlabs has a nice relay switched LPF bank, but in the end I am always going to have to manually tune the ATU when changing band, so manually pluggable LPFs are good enough for me. OTOH I am tempted to source the LPF parts and boards from QRPlabs since I had to parallel up some parts to approximate the 1.2n capacitor values when I built mine for 80m.

Timestamp Call MHz SNR Grid Pwr Reporter RGrid km
 2019-05-04 19:32    G7LEE    3.568617    -28    IO81    0.01    DL/PA0EHG    JO32sq    735 
 2019-05-04 19:30    G7LEE    3.568625    -27    IO81    0.01    DL/PA0EHG    JO32sq    735 
 2019-05-04 19:28    G7LEE    3.568625    -29    IO81    0.01    DL/PA0EHG    JO32sq    735 
 2019-05-04 19:26    G7LEE    3.568624    -27    IO81    0.01    DL/PA0EHG    JO32sq    735 
 2019-05-04 19:22    G7LEE    3.568624    -26    IO81    0.01    DL/PA0EHG    JO32sq    735 
 2019-05-04 19:20    G7LEE    3.568624    -24    IO81    0.01    DL/PA0EHG    JO32sq    735 
 2019-05-04 19:18    G7LEE    3.568624    -26    IO81    0.01    DL/PA0EHG    JO32sq    735 
 2019-05-04 19:16    G7LEE    3.568624    -26    IO81    0.01    DL/PA0EHG    JO32sq    735 
 2019-05-04 19:14    G7LEE    3.568624    -25    IO81    0.01    DL/PA0EHG    JO32sq    735 
 2019-05-04 19:10    G7LEE    3.568623    -24    IO81    0.01    DL/PA0EHG    JO32sq    735 
 2019-05-04 19:08    G7LEE    3.568623    -25    IO81    0.01    DL/PA0EHG    JO32sq    735 
 2019-05-04 19:06    G7LEE    3.568623    -29    IO81    0.01    DL/PA0EHG    JO32sq    735 
 2019-05-04 18:56    G7LEE    3.568623    -28    IO81    0.01    DL/PA0EHG    JO32sq    735 
 2019-05-04 18:54    G7LEE    3.568622    -28    IO81    0.01    DL/PA0EHG    JO32sq    735 
 2019-05-04 18:46    G7LEE    3.568636    -28    IO81    0.01    DL/PA0EHG    JO32sq    735 
 2019-05-04 18:44    G7LEE    3.568689    -26    IO81    0.01    DL/PA0EHG    JO32sq    735 
 2019-05-04 18:42    G7LEE    3.568594    -22    IO81    0.01    DL/PA0EHG    JO32sq    735 
 2019-05-04 18:40    G7LEE    3.568621    -27    IO81    0.01    DL/PA0EHG    JO32sq    735 
 2019-05-04 18:26    G7LEE    3.568554    -28    IO81    0.01    DL/PA0EHG    JO32sq    735 
 2019-05-04 18:12    G7LEE    3.568648    -23    IO81    0.01    DL/PA0EHG    JO32sq    735 
 2019-05-04 18:10    G7LEE    3.568648    -21    IO81    0.01    DL/PA0EHG    JO32sq    735 
 2019-05-04 17:58    G7LEE    3.568549    -24    IO81    0.01    DL/PA0EHG    JO32sq    735 

If you look at a typical bunch of 80m WSPR spots of G stations

WSPRnet spots

you can see that my low SNR of less than -20dB is characteristic of very QRP stations on this band. I am critically dependent on DL/PA0EHG who clearly takes radio very seriously - another weak station G0IFI is heard by more stations, so I probably still have work to do, it seems I need PA0EHG’s superior receive performance to make it onto WSPRnet.

Update - it turns out it was not particularly that I was a weak signal which was the problem, I was on the wrong frequency so out of the passband of most receivers because I had not added 1500Hz to the dial frequency. More tips and tricks in the next post

Richard G7LEE

  1. more accurately the ringing isn’t so pronounced or clearly harmonically related without the filter. Some overshoot is visible without the filter, but the signal is displayed using a 10:1 10pf scope probe grounded to the ground plane, Some artifacts are always to be seen using a probe as opposed to a 50ohm coax cable terminated at the scope where fast edges are present.