A Classie WSPR Transceiver
Update: An updated version of the controller used with the Classie WSPR transceiver is presented here.
Because of my location, amateur radio operations are limited to low power and disadvantaged antennas. Therefore, the WSPR (Weak Signal Propagation Reporter) protocol immediately caught my eye when I first ran across it. My primary interest is building, so I put together a stand-alone beacon using an Arduino and AD9850 DDS module and ran it for a while on 30 meters but got tired of having to manually switch the antenna every time I wanted to go from transmit to receive. Eventually I decided what I really needed was a low-power transceiver I could dedicate to WSPR operations.
My requirements were straightforward. The transmitter could operate directly at the operating frequency, just like my beacon. To avoid the complexity of a superhet I decided a direction conversion receiver would be adequate. This opened the possibility of interference from the other sideband but the WSPR band is so small I figured the chance of it was small. I was prepared to implement this as a transmit/receive pair and switch between them as appropriate. Then I ran across VE3MKC’s Classie transceiver.
What Is A Classie?
The Classie is a Pixie-style CW transceiver using MOSFETs. On transmit it operates in Class E, which provides high efficiency and a reasonable amount of QRP power. On receive the same transistor acts as a switching mixer for direct conversion of the incoming signal from RF to audio. The audio is amplified to drive headphones, an external speaker, or to be fed to a computer for further processing.
With a few modifications, this circuit is ideal to work as a WSPR transceiver.
The Updated Circuit
The updated circuit with components for the 30m WSPR band is shown below. For WSPR operation a few changes were needed.
A Computer Controlled VFO – Like other Pixie designs, the Classie operates at a single crystal controlled frequency. However, WSPR transmit uses a 4-ary FSK modulation with a bit length of approximately .68 sec and frequency shifts of approximately 1.46 Hz. On receive the decoding software expects a tone somewhere in the range from 1400 – 1600 Hz.
I replaced the crystal oscillator with an NT7S Si5351 breakout board controlled by an 3.3V Arduino Pro Mini. The output is buffered by a 5V CMOS NOR gate (one gate of a 74HC02) to provide a signal sufficient to drive the output MOSFET into Class E operation. With the components shown and a 12V power supply it puts approximately 1W into a 50 ohm load.
Software Controlled Transmit/Receive Switching – The Classie switches between transmit and receive by applying/removing power to the final transistor via a PNP transistor switch. WSPR operation requires that transmit/receive cycles begin within 1 second of the top of even numbered minutes. Because the switching times are so precise they’re done using a BS170 MOSFET controlled by the same Arduino software that controls the VFO. A second NOR gate is used as a level shifter to ensure adequate drive for switching.
Finally, while not strictly required, I replaced the original Classie audio amplifier with that from the BITX transceiver to increase the audio levels a bit.
The prototype was built using stripboard and is shown below.
Setting Up The Transceiver
Basic control software for the transceiver is available from the GitHub repository. The message, transmit frequency, receiver local oscillator frequency, and transmit percentage are hard coded so they need to be updated in the source code as appropriate. Transmit and receiver local oscillator frequency are in Hz. The transmit percentage is an integer between 0 (full receive) and 100 (full transmit). The message is generated using the WSPRCode program and stored as an array of unsigned bytes.
The receiver can be operated in the conventional direct conversion style by setting the receive local oscillator frequency 1500 Hz below the center of the WSPR operating band but a better option is to use the WSPR software’s I-Q mode.
The I-Q mode is normally intended for use with software-defined receivers (SDRs) like the SoftRock. Tuning the clock generator’s receive frequency below the WSPR band and adjusting the WSPR Fiq frequency to compensate effectively creates a low IF superhet, avoiding the hum and noise normally associated with direct conversion receivers. To do this, from within the WSPR software select the Setup : IQ Mode menu item. On the displayed form, check Enable IQ Mode and set the Fiq frequency as needed.
For example, as I mentioned above the prototype transceiver was built for the 30m band and the receive local oscillator frequency set to 10.125 MHz. On 30m the receiver frequency is normally set to 10.1387 MHz (1500 Hz below the WSPR band center) so the Fiq frequency is set to (10.1387 MHz – 10.125 MHz) = 13700 Hz, as show below.
To set up the receiver, program the Si5351 to produce a signal at the receive local oscillator frequency. Disconnect the keying line from the Arduino and connect the transceiver audio to the line/microphone input of the computer running the WSPR software. Adjust the audio levels as necessary.
To set up the transmitter, program the Si5351 to produce a signal at the desired WSPR operating frequency. Connect the output to a 50 ohm dummy load. Adjust the 10K bias potentiometer so there’s no voltage on the gate of the BS170 and pull the keying line low. Slowly increase the bias until the output power levels off. If the BS170 gets warm back off on the bias. Class E amplifiers are very efficient so the BS170 should handle the expected 1W output with no problem.
Transmit time synchronization is performed manually by resetting the Arduino at the appropriate moment after startup. Just hold the Arduino’s reset button and release it at the top of an even numbered minute.
So How Does It Work?
Actually, it works really well. The figure below shows the WSPR software at my location after it’s been running for a while. The Si5351 is plenty stable enough to function as a WSPR local oscillator and using the I-Q mode in the WSPR software to move the band of interest away from the DC null resulted in a very quiet receiver. In fact, the audio quality is so good I may put a few of these together minus the transmit function just to use as monitor receivers.
Because the transmit timing in the control software depends on the accuracy of the Arduino crystal I wouldn’t depend upon it for long term operation. At some point I plan to update it to allow for control from the WSPR software or GPS timing. In either case, I’ll post an update when it’s ready.