Bareback LF/MF/HF/VHF WSPR transmitter using a Raspberry Pi
C Makefile
Pull request Compare This branch is 41 commits ahead of threeme3:master.
Latest commit 509d796 Feb 15, 2015 @8cH9azbsFifZ Update README
Failed to load latest commit information.
AUTHORS add calls May 30, 2013
BUGS add reference to threeme3 Apr 9, 2013
COPYING GPL Apr 9, 2013
ChangeLog what has been done? May 30, 2013
INSTALL reposi Apr 9, 2013
Makefile wip Apr 14, 2013
README Update README Feb 15, 2015
THANKS added names May 30, 2013
wiring.png added wiring with filter May 20, 2013
wiring.sch added wiring with filter May 20, 2013
wiring.txt added text file with filter values May 30, 2013
wiring.xlsx added text file with filter values May 30, 2013
wspr.c daemon commented away :) Apr 14, 2013


 Raspberry Pi Bareback LF/MF/HF/VHF WSPR Transmitter

 Makes a very simple WSPR beacon from your RasberryPi by connecting GPIO
 port to Antanna (and LPF), operates on LF, MF, HF and VHF bands from
 0 to 250 MHz.
 In order to transmit legally, a HAM Radio License is REQUIRED for running
 this experiment. 

How to Use
0) Install Raspbian (12)
1) Follow the instructions given in INSTALL to build and install the software
2) Connect bandpassfilter and antenna (cf. below)
3) Calibrate (cf. below)

Filter and Antenna
  Connect a low pass filter (9) to the PINs (2,11) 7 and 9 as described in 
  wiring.png.  The expected power output is 10mW (+10dBm) in a 50 Ohm load. 
  This looks neglible, but when connected to a simple dipole antenna this may 
  result in reception reports ranging up to several thousands of kilometers. 
  DO NOT expose GPIO4 to voltages or currents that are above the specified
  Absolute Maximum limits. GPIO4 outputs a digital clock in 3V3 logic, with a
  maximum current of 16mA. As there is no current protection available and
  a DC component of 1.6V, DO NOT short-circuit or place a resistive (dummy) load
  straight on the GPIO4 pin, as it may draw too much current. Instead, use a
  decoupling capacitor to remove DC component when connecting the output
  dummy loads, transformers, antennas, etc. DO NOT expose GPIO4 to electro-
  static voltages or voltages exceeding the 0 to 3.3V logic range; connecting an 
  antenna directly to GPIO4 may damage your RPi due to transient voltages such as 
  lightning or static buildup as well as RF from other transmitters operating into 
  nearby antennas. Therefore it is RECOMMENDED to add some form of isolation, e.g. 
  by using a RF transformer, a simple buffer/driver/PA stage, two schottky small 
  signal diodes back to back.

Power Supply
  As the Raspberry Pi does not attenuate ripple and noise components from the
  5V USB power supply, it is RECOMMENDED to use a regulated supply that has
  sufficient ripple supression. Supply ripple might be seen as mixing products
  products centered around the transmit carrier typically at 100/120Hz.

Software Description
  This software is using system time to determine the start of a WSPR
  transmissions, so keep the system time synchronised within 1sec precision,
  i.e. use NTP network time synchronisation or set time manually with date
  command. A WSPR broadcast starts on even minute and takes 2 minutes for WSPR-2
  or starts at :00,:15,:30,:45 and takes 15 minutes for WSPR-15. It contains
  a callsign, 4-digit Maidenhead square locator and transmission power.
  Reception reports can be viewed on Weak Signal Propagation Reporter Network (10).

  sudo ./wspr <[prefix/]callsign[/suffix]> <locator> <power in dBm> [<frequency in Hz> ...]
        e.g.: sudo ./wspr PA/K1JT JO21 10 7040074 0 0 10140174 0 0
        where 0 frequency represents a interval for which TX is disabled,
        wspr-2 or wspr-15 mode selection based on specified frequency.

WSPR Frequencies (1)
  WSPR is used on the following frequencies (local restriction may apply):
     LF   137400 - 137600
          137600 - 137625 (WSPR-15)
     MF   475600 - 475800
          475800 - 475825 (WSPR-15)
    160m  1838000 - 1838200
          1838200 - 1838225 (WSPR-15)
     80m  3594000 - 3594200
     60m  5288600 - 5288800
     40m  7040000 - 7040200
     30m  10140100 - 10140300
     20m  14097000 - 14097200
     17m  18106000 - 18106200
     15m  21096000 - 21096200
     12m  24926000 - 24926200
     10m  28126000 - 28126200
      6m  50294400 - 50294600
      4m  70092400 - 70092600
      2m  144490400 -144490600

  Frequency calibration is REQUIRED to ensure that the WSPR-2 transmission occurs
  within the 200 Hz narrow band. The reference crystal on your RPi might have
  an frequency error (which in addition is temp. dependent -1.3Hz/degC @10MHz).
  To calibrate, the frequency might be manually corrected on the command line
  or by changing the F_XTAL value in the code. 

  A practical way to calibrate is to tune the transmitter on the same frequency 
  of a medium wave AM broadcast station or a CW transmitter at hand; keep tuning 
  with USB or LSB until zero beat (the constant audio tone disappears when the 
  transmitter is exactly on the same frequency as the broadcast station), and 
  determine the frequency difference with the broadcast station. This is the 
  frequency error that can be applied for correction while tuning on a WSPR 

  Then you can do the math for the offset from your terminal using shell. If
  the offset is -1100 Hz and you want to tune to 10140200, then:
  ./wspr K1JT JO21da 10 $((10140200-1100))

  NB: Do not overclock your RPi as it may make the clock unreliable due to a 
  dynamic clocking feature.

Check reception
  wget -O - 2>&1 |grep -i $CALLSIGN && echo $CALLSIGN found on 

Reference documentation
  [1] WSPR Frequencies:
  [8] Raspberry Pi Foundation:
  [9] Dobbs, G., G3RJV: A Complete Do-It-Yourself Kit... with just a few simple calculations.
  [10] WSPRnet: Weak Signal Propagation Reporter Network.
  [11] Raspi Pinout:
  [12] Raspbian
  Code Quality
This is experimental code.