DJ5CW / SO5CW - QRSS and WSPR monitor with a Raspberry Pi 4 and a QCX

(work in progress - do not hesitate to send me a mail if you need more details on anything)

Hardware of the SO5CW QRSS/WSPR monitor in KO01MW

The hardware setup consists of:

Everything was fit into a plastic enclosure, on a mounting plate with hex spacers. Two 90° angle USB adapters were needed to make the sound card fit in, the QCX's original BNC antenna port was not used, instead a piece of RG174 was connected to the PCB which leads to a case mounted SO-239 connector.

The enclosure happened to have a built-in RJ45 F-F adapter, which is (ab)used to serve for the 5V (RPi) and 12V (QCX) power supply wires. The RPi communicates via WIFI.

Antenna

The grabber is using a simple quarter wave vertical antenna with a common mode choke at the feed point and one elevated radial pointing N/W. It is located relatively close to the house, so the eastern directions may be attenuated.

Software setup

The QCX was set up to remember its last settings (i.e. frequency) on power-up.

The Raspberry Pi is running Raspbian Buster, in a minimal installation without a graphical user interface.

At the remote location the internet connection is realized by 4G (see SO5CW remote setup). Since I am behind the NAT of the mobile carrier, I cannot directly connect the remote setup. Instead, it connects to my own OpenVPN instance hosted on a server in Germany. As a fall-back, a ssh reverse tunnel exists.

In order to allow several processes to record audio at the same time (needed for QRSS + WSPR), it is necessary to run the PulseAudio audio server. It is strongly recommended to run PulseAudio on a per-user basis. In my case, it is launched in a common systemd job which also starts QrssPiG.

QrssPiG is a fully featured and highly configurable QRSS grabber that produces beautiful spectral plots. It compiles from the sources without any problems and it was easy to configure.

WSPR is decoded and uploaded to WSPRnet by a fork of K9AN's standalone decoder by VK3TPM, described in his blog post from 2016. It contains the original K9AN decoder with a couple of fixes by DK2RO, and some scripts originally by DJ0ABR that handle automatic audio recording and uploading to WSPRnet

Modifications to k9an-wsprd / Misc. changes

I only made a few changes to Peter's scripts, like adding the -w flag to k9an-wsprd (wide band mode) and obviously changing my callsign and locator.

Due to my QCX's RX being centered on ~700 Hz for QRSS (10139.9 kHz), WSPR signals are around 900 Hz. wsprd however expects the signals to be centered around 1500 Hz - which is hard coded into wsprd.c. Changing 1500 Hz to 900 Hz and recompiling did the trick.

Also, recording audio for WSPR with arecord (which I used instead of Peter's method with rec) failed in the cron-job unless I added export XDG_RUNTIME_DIR=/run/user/1001 to the record script.

Adding WSPR decodes to QrssPiG output

Additionally to uploading the WSPR spots to WSPRnet, I wanted to generate a display similar to that of AJ4VD's FSKview, whith an overlay of WSPR spots over the spectrum display.

This was achieved with a Perl (annotate-qrss.pl) script which reads the ALL_WSPR.TXT file and adds text to the output image with the help of ImageMagick.

24h view

The script annotate-qrss.pl also generates a picture of the last 24 hours, where each 10 minute frame is reduced to 10 pixel width, and 144 frames (= 24h) are concatenated to one picture. This allows for a very nice visual observation of propagation and active stations over the last 24h.

The 30m 24h QRSS view can be found here. If you move your mouse over the spectrum you'll find that each 10 minute slice is linked, so you can have a look at the details.

Misc notes

I created two "RAM disks", one for recording the WSPR sound segments, one for the grabs, in order to reduce wear and tear of the Raspberry Pi's flash memory. The following lines were added to my /etc/fstab:

tmpfs /home/fabian/wsprcan/wav tmpfs nodev,nosuid,size=10M 0 0
tmpfs /home/fabian/grabs/ tmpfs nodev,nosuid,size=50M 0 0