top of page
WSPR-RX V3 Documentation page

Tel. 123-456-7890

Fax. 123-456-7890

500 Terry Francois Street, 
San Francisco, CA 94158


Quick Guide

Source code

Link to Sourcecode on GitHub

WSPR-RX Hardware Version 3 is a fixed frequency receiver with the following characteristics:

  1. Built for one fixed frequency for one of the radio amateur bands .

  2. Is designed to be "plug-and-play" with zero settings.

  3. Powered from a USB port from a computer or using a USB charger.

  4. Intended to be used with a computer running WSPR reception software like WSJT-X.


  • Frequency: Dependent on model.   
    10m  model=  28.124,600MHz   
    12m  model=  24.924,600MHz    
    15m  model=  21.094,600MHz  
    17m  model=  18.104,600MHz   
    20m  model=  14.095,600MHz    
    30m  model=  10.138,700MHz     
    40m  model=    7.038,600MHz    
    80m  model=    3.568,600MHz 
    160m model=   1.836,600MHz 

  • Sensitivity:
    -117dBm or better (3dB SN/N in 500Hz Bandwith)

  • Size:

  • Power usage:

  • Weight:

Theory of operation:

The WSPR-RX V2 is a direct conversion double side band receiver that receives on one fixed frequency on a Ham band.

When connected to computer that runs a WSPR software it will form a system for trouble free WSPR reception on a single band.

Internally it uses a PLL controlled local oscillator (LO) that can be tuned to any frequency from 8kHz to 150MHz.

The LO is controlled from an Arduino that determines the frequency at start up.

The LO is feeding a mixer that mixes the incoming radio frequency (RF)  from the antenna with the LO.

The output is a low frequency (LF) output that is amplified and low pass filtered by the LF amplifier.

The LF signal is output on the 3.5mm audio connector.

The RF signal is filtered out using a double tuned band pass filter that select the signals of interest.

This band pass filter is factory tuned to the WSPR frequency.

The band pass filter can only be tuned over a narrow range and there are therefore different models sold that has different band pass filters fitted.



To operate the WSPR-RX V2 do the following:

Connect it to a computer:

  1. Connect the "Audio Out" from the receiver to a line-in or microphone input on a computer using an appropriate audio cable.

  2. Connect an HF antenna to the SMA connector marked "Antenna Input".

  3. Connect a 5V power source to the micro USB connector.



​Configure the computer software

  1. Start the appropriate WSPR receive software on the computer, e.g on a Windows based PC you may use the software "WSJT-X".

  2. Configure the software to use the correct soundcard and adjust the volume using the windows sound mixer adjustment. 

  3. Select the appropriate Ham band and if you intend to send your report to the WSPR network make sure to enter you Ham radio call sign and position in the settings as well.

  4. Tick the "Upload spots" option.

  5. Done!

The receiver is designed to be maintenance free and "plug-and-play" so there are no settings or adjustments that needs to be done on it.

Once the computer program have ben properly set there is nothing to adjust.

The receiver will always be on frequency and should hopefully give many years of trouble free operation.


The Receiver Frequency is calibrated and trimmed at delivery but if the user wants to re-calibrate or change the LO frequency, the following procedures can be used.

Calibrating the reference oscillator.

The reference oscillator is a 25MHz or 26MHz Crystal.

The reference oscillator can not be adjusted but its frequency can be determined and if off it can be compensated for in software

The calibration procedure outlined below will determine its exact frequency and store it in the Arduino EEPROM.

Once the reference oscillator exact frequency is known then the LO frequency will be correct.

A frequency counter is needed for measurements and a USB to Serial converter is needed to issue commands to the Arduino.


  1. Open the receiver by removing the top screws and the back screws on the USB side.
    lift the lid and back plate off. 

  2. Connect a Serial to USB converter (sometimes called an FTDI converter)
    The FTDI Converter can also power the board, in that case make sure it feeds 3,3V an not 5V as that will damage the receiver. This is because the FTDI adapter bypasses the built in voltage regulator on the receiver. If you are unsure what voltage is used, then plug in the adapter to the computers USB bus but not to the receiver. Use  a voltage meter to measure the voltage between the pins marked GND and VCC. It needs to be between 3.0 and 3.4V


  3. Use a terminal software to communicate with the Arduino Micro controller in the receiver. You may use a terminal software or use the Arduino IDE.
    I use a nice freeware Windows software called "Terminal". link here.
    I you use the Arduino development software open it's "Serial Monitor"from the "Tools" menu.

  4. Set the baud rate to 57600 and 8N1.

  5. Set CR+LF to be sent when enter is pressed.
    In the "Terminal" Software tick the Cr+LF option, see picture.

    In the Arduino Serial Monitor you can set this in the meny at the lower right of the Serial Monitor dialog, see picture.


  6. Press the reset button on the Arduino and check that you can see startup message properly. 
    Here is an example output from a terminal software when the WSPR-RX boots:
    Zachtek HF WSPR-RX Hardware version 2, Software version: 1.01Initializing..
    Receive frequency set to is set to 14095600Hz
    Type HELP for information on commands
    If you don not see the startup message then trouble shoot your serial connection.

  7. Type HELP and press enter.
    If no help text is displayed then trouble shoot you serial transmission, especially the LF-CR setting setting described in step 5

  8. Connect a frequency counter  to test point 3 (TP3) and measure the frequency of the local oscillator.

  9. Issue the command CALOUT.
    The Local Oscillator will change it's frequency to around 10MHz.


  10. Read the exact frequency on the counter, if it is low then increase the reference frequency, if it is high - lower the reference frequency.
    Use the commands INCREF and DECREF  to do this.
    You may start by changing it by 100 Hertz or so e.g. INCREF 100.
    When you get close to 10MHz use smaller changes to get on the exact frequency
    Continue to increase or decrease the reference frequency until the LO frequency is exactly 10MHz. It should be possible to get to within 1Hz.

  11. Set the LO back to it's WSPR frequency using the SETBAND command. E.g if your receiver is a 20m version issue the command SETBAND 20.

  12. Save the reference frequency in EEPROM with the SAVE command.

  13. Reset the Arduino.

  14. Verify that the Startup messages are correct.

  15. Measure the LO and verify that it is on frequency.

  16. Done! 

3.3V FTDI.jpg
Calibrate Ref

Changing the firmware.

With a serial adapter the Arduino can also be reprogrammed from the Arduino IDE.
This can be useful in a number of situations, for instance if you want to set the receiver to a different frequency than the predefined WSPR frequencies.

Changing the receive frequency from the predefined band frequencies.

If one wants to change the receive frequency it can be done using the following procedure:

  1. Connect a Serial to USB converter as outlined earlier and connect to a PC or Mac that has the Arduino IDE installed.

  2. Download the latest firmware from Github and open it in the IDE. 

  3. In the Arduino IDE, set the correct serial port using the menu "Tools, Port:"

  4. Set the board type using the  "Tools" menu and submenu "Board:"and choose the board "Arduino Pro or Pro Mini"

  5. Use the "Tools" menu, submenu "Processor:" and set it to ATmega328P (3.3V, 8MHz)

  6. Edit the source code and enter your desired frequency. The frequency is set by one of several #define statement in the beginning of the code.

    #define RXFREQ17m   18104600ULL //17m 18.104,600MHz
    #define RXFREQ20m   14095600ULL //20m 14.095,600MHz
    #define RXFREQ30m   10138700ULL //30m 10.138,700MHz
    #define RXFREQ40m    7038600ULL //40m 7.038,600MHz
    #define RXFREQ80m    3568600ULL //80m 3.568,600MHz
    #define RXFREQ160m   1836600ULL //160m 1.836,600MHz
    #define RXFREQ630m    474200ULL //630m 474.200kHz
    #define RXFREQ2190m   136000ULL //2190m 136.000kHz

    Which one of these defines that are being used is determined by what band you choose with the SETBAND command 
    If for example  you have the 20m version of the receiver you will change the RXFREQ20m define.
    The Frequency is entered in Hertz, e.g if you want to use 14.100MHz you would write it as 14100000.The ULL at the end means "Unsigned Long Long" and helps the compiler to avoid lowering the precision of the stored value.
    The local oscillator will use this exact frequency and as the receiver is a direct conversion type it will receive both the lower and upper side-band on this frequency. In case of WSPR reception set it 1500Hz lower than the WSPR transmit frequency. 

  7. Recompile and upload the modified source code to the on-board Arduino.

  8. Check the boot messages in the Serial monitor and make sure the new frequency is used.

  9. Optionally measure the LO frequency with a frequency counter on test point 3 as outlined in the Calibrate the reference oscillator paragraph.

  10. If you moved the frequency far you might need to adjust the  bandpass filters. 
    The bandpass filter has a bandwidth of 4% of the receive frequency so as a rule of thumb if you moved the receive frequency more than 2% you will have to readjust the bandpass filters.
    Continuing with the 14,1Mhz as an example 2% of 14,1MHz is 282kHz.

Adjusting  the bandpass filters.

  1. Power the receiver with an external 5V power source.

  2. Input a signal with a signalgenerator that is 1500Hz above the LO frequency and around -80dBm in amplitude.

  3. Measure the LF signal on test point 4 (TP4) with an oscilloscope-
    The frequency should be around 1500Hz. The amplitude of the LF signal will be in the tens or hundreds of  mV peak-to-peak in amplitude depending on how far off the receiver bandpass is.

  4. Adjust L2 and L3 for maximum signal on test point TP4.

  5. Done!

Alternatively you might use an VNLA and adjust L2 and L3 for 50 input at the desired frequency. 

bottom of page