Tags: Amateur Radio, Arduino, Homebrew, WSPR
When I first put together the Classie WSPR transceiver my primary concern was the transmit/receive circuitry. I only concerned myself with the controller in so far as confirming it was putting out the correct waveform with the proper timing. But once I had the transceiver on the air for a while it was time to start working on improvements to the controller.
The Updated Classie WSPR Controller
The schematic for the updated controller is shown below but most of the changes are in the software (available in the GitHub repository).
Some of the improvements that’ve been made include:
VOX Controlled Transmit/Receive Timing – The original controller had no provision for aligning the WSPR transmit/receive cycle with real time. Correct timing was achieved by resetting the controller at the top of an even numbered minute. After that, all timing was done in software and depended on the controller crystal’s accuracy.
The updated controller software uses a software voice-operated switch (VOX) based on the Goertzel tone detection algorithm to put transmit and receive timing under control of the WSPR software.
Calibration Mode – The controller still uses an Si5351 to generate the transmitted signal and receiver local oscillator. The accuracy of these signals depends directly on the accuracy of the Si5351 crystal. To compensate for any innacuracies, NT7S’s Si5351 library (which I use in the controller software) has a provision to specify a correction factor that’s applied to the crystal frequency.
With the updated controller software, if you reset the Arduino with pin 2 grounded the transceiver will go into receive mode at a specified calibration frequency. Used in conjunction with a known reference frequency, you can calculate the required correction factor for use in the software.
For example, using WWV’s 10 MHz signal as the reference with the calibration frequency set to 9985 kHz, WWV’s carrier is beat down to around 15 kHz, plus/minus some error. Using Spectrum Lab or similar software to measure the actual beat frequency, the calibration factor can be calculated as:
fexpected = expected frequency
fmeasured = measured frequency
fcal = calibration frequency
Integrated Sound Card – The original Classie WSPR transceiver was designed for use with a separate sound card. Since the USB port was used to power the controller, this meant there were two cables connecting the PC to the controller (USB and audio). To minimize the number of cables I included a PCM2904 audio codec in the controller. This allows for operation with only a single USB connection between the controller and PC.
Setting Things Up
Like the original, the WSPR message, transmit frequency, and receive local oscillator frequency are hardcoded in the controller software. Keeping with this motif, the calibration frequency and correction factor are hardcoded as well. All of these values need to be updated as appropriate and the resulting binary loaded into the controller. To make this easier, these values have been moved to a separate include file.
Proper operation of the VOX requires the difference between the receive local oscillator and WSPR band center to be less than approximately 19 kHz. The VOX bandwidth is set to 196 Hz to match the width of the WSPR band and ideally the WSPR software transmitted tone will fall at or near the center of that bandwidth. If for some reason the VOX appears to be operating intermittently, try varying the transmitted frequency from within the WSPR software to move the transmitted tone more toward the center of the VOX bandwidth.
Connections between the controller and the rest of the Classie WSPR transceiver haven’t changed. Once they’ve been made just plug the controller into the PC via USB. The PCM2904 requires no special drives and should be recognized with no difficulty.
The WSPR software is configured as described in the original post. To enable the VOX select the Setup->Station Parameters menu item and on the displayed form change the PTT method to VOX. You can set the transmit percentage on the WSPR main form.
I’ve been using the updated controller for a few weeks now and haven’t run into any problems. In the future I may add a serial connection to set the various constants and transmit message but that hasn’t been a priority because once they’re set there’s no need to change them.
Finally, while the original transceiver was designed for WSPR operation I’ve since realized there’s no reason other modes compatible with class E operation (e.g., RTTY) couldn’t be added, which may be the next area for improvement.