A Little WSPR Beacon (Aren’t They All Little?)

I first tried WSPR out in 2009, with a Signalink USB interface attached to my FT-817 and PC. For anyone interested in QRP and QRPp, the process of being able to decode a signal that is up to about 34dB below the noise level is quite fascinating. Morse code, sent by way of CW, engages and tickles my brain in ways that other modes don’t. WSPR though (and other weak signal modes), has it handily beat in terms of it’s sheer ability to extract data from a signal that the human ear cannot even detect. A few years later, in 2018, I assembled an Ultimate 3S QRSS/WSPR beacon transmitter from QRP Labs for a ham friend. This project opened me to the appeal of a standalone WSPR beacon that, unlike my earlier foray into WSPR, didn’t require tying up my main station gear. The addition of a GPS unit, as well as setting the timing of the transmissions, could also automatically insert the Maidenhead grid locator – no need to manually program that, making it ideal for travel.

Fast forward to the current day. I’ve recently become a bit more active on the bands, and decided that I wanted to “stop the rot” of my CW skills, which were slightly degrading due to lack of use. I signed up for an online CW course with the CW Academy, offered by CW Ops. I just completed their intermediate course, and enjoyed it immensely. The Intermediate course is designed to take ops from 10-20 wpm. I was already comfortably having conversational QSO’s at about 16-18 wpm. At CW Academy, the emphasis is on head-copying, so that you can converse without needing to write anything down other than the occasional piece of essential info (name, rig, etc.) This, they explain, is an important skill, if you are to increase your speed. I, along with most of the other students, found it surprisingly challenging to listen to short stories in code, and extract meaning from them without writing anything down. It helped that we had a fantastic advisor, in the form of Randy N1SP. Practice sessions in between our online Zoom sessions could be challenging, but the prospect of classes led by Randy were a great incentive. He made learning fun.

Along with my renewed interest in CW came interest in weak signal modes generally, as well as a slight stirring in the desire to build radio things again. Over the last 3 years, I’ve been putting time and effort into working on my camper van, which took energy and money away from amateur radio. Well, I’m gradually angling towards selling the campervan, which will free up some mojo for other pursuits. Anyone want to buy a 1993 Airstream B190, with 67K miles, 200w of solar on the roof, and a 2″ lift?

Back to radio. The Autumn 2022 issue of SPRAT contained an article by Paul VK3HN, detailing the WSPR beacon he had built using modified open source code from Harry at ZachTek and, of course, the JTEncode and Si5351 libraries from Jason NT7S (Jason’s libraries pop up everywhere). If you don’t have access to SPRAT, and even if you do, Paul describes his beacon on his blog here.

As long as you know how to upload a program to an Arduino, or flash firmware to a microprocessor (same thing), the barrier to entry to building a WSPR beacon is now quite low – even lower if you don’t build a PA stage, and take the ~10mW output from the Si5351 clock output directly to the LPF and the antenna. Here’s what I built –

The output is taken from the CLK 0 output of the Si5351 and feeds directly into the PA stage that Hans Summers uses in the QRP Labs Ultimate 3S QRSS/WSPR transmitter. I’ve built both the Ultimate 3S and QCX rigs, and liked the class E PA’s he used in both designs. Simple in design – and I also like the fact that, because the BS170 is a MOSFET that doesn’t suffer from thermal runaway, you can simply parallel them up for greater power, without the need for balancing. Details of how to wind the bifilar transformer can be found in the assembly manual for the Ultimate 3S on the QRP Labs website.

In his beacon, Paul runs the Si5351 at it’s default of 2mW output, and follows it with a W7ZOI-designed 2 stage PA from the pages of EMRFD . Due, I suppose, to sheer laziness, I wanted to keep the PA stage as simple as possible, so opted for higher output from the Si5351, and a single MOSFET, with very few supporting components, for the PA. Paul mentioned that in the earlier days of the Si5351 being available to experimenters, he heard some talk of higher phase noise and jitter from the Si5351 at higher output levels. Perhaps running it at a lower output level, and making up for that later, is a worthy strategy? To run the Si5351 at it’s maximum power of about 10mW out into 50 ohms, I found the following line in Paul’s modified code –

si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0);

and inserted the following line after it –

si5351.drive_strength(SI5351_CLK0, SI5351_DRIVE_8MA);

This sets the chip to produce the maximum power at the CLK0 output.

The very first iteration of this project used a passive patch antenna, as I didn’t realize that the GPS module supported active antennas. The patch antenna, with it’s very short piece of coax, was quite difficult to implement in the diecast enclosure I had chosen for the project. I mounted it on top of the lid, with the main board mounted on the inside of the lid, and the coax passing through a hole in the top. When I took the lid off to work on the circuit, the antenna was shielded from satellites by the lid, which was inconvenient. Once I discovered that the GPS module supported active antennas, I installed one. I have no photos of the implementation with the passive antenna.

Here’s a view of the next version of the board, with the clock generator and Nano boards unplugged, to allow viewing of the wiring underneath. As usual, I have used Rex’s wonderful MePADS and MeSQUARES for the Manhattan pads, and strips of header to plug the Si5351 board, Nano, and LPF boards into. Operating on a different band just requires changing the output filter, and reprogramming the Nano via it’s ICSP header –

The first version of this build used a single 78L05 voltage regulator, bolted straight onto the board for heatsinking. I had forgotten how very hot these 1 amp regulators get. The IC itself got very hot, as did much of the ground plane on the board to which it was bolted. Although not my best idea, it turned out to be dwarfed by a particularly poorly thought-out aspect of the layout –

It’s perhaps not immediately obvious from the above photo, but might become more apparent from this image –

That is the BS170 PA transistor mounted directly underneath the frequency synthesizer board. The problem, is that the PA transistor gets very warm. Warm air rises – and what is directly above? Yes indeed – the most frequency sensitive part of the whole circuit. What a fool, an oaf, a bumpkin, a buffoon, and a rube! When laying out the build, I was mainly concerned with fitting everything in, and not having a long wire between the output of the Si5351 and the PA. I’m not sure why, as a short length of RG-174 would have worked just fine. Nevertheless, slightly disheartened at my mistake, I forged on, and proceeded to attempt to calibrate the unit using Jason NT7S’ calibration script. I’ll spare you the long, dull version, and just say that I couldn’t get Jason’s script to work. My suspicions lay with either the cheap Nano board, or the cheap Si5351 board that I had bought from Amazon. Not pictured here, the first Si5351 board I tried was a direct clone of the Adafruit board, with a purple board instead of the Adafruit blue color, and without the Adafruit branding on it. I ditched Jason’s script, and went for a rough calibration by beating the output of the board against WWV, and making adjustments to the correction factor, until I was within a Hz or two of zero-beat.

I then uploaded VK3HN’s script to the Nano. The unit was indeed WSPR’ing but, despite the fact that I had calibrated it fairly accurately, quite a few of the WSPR transmissions were out of band by anything up to 100Hz. This didn’t seem right, so I tried calibrating the board again, only to find that each time I calibrated the board, I came up with a significantly different correction factor. Replacing it with a genuine Adafruit board solved the problems. Suddenly, Jason’s calibration routine worked beautifully, and the board began producing consistent, repeatable frequencies. All subsequent WSPR transmissions were in-band. The Si5351 board that I had purchased from HiLetgo was only about $3 less than the genuine article from Adafruit. In retrospect, it was not worth the trouble, just to save a few bucks. Lesson learned. In contrast, their Nano boards are significantly cheaper than the “real” thing, and seem to work just fine.

My first foray into WSPR with this mini concoction was on 10M. Drift figures were nearly all -4’s, and I wasn’t getting anywhere near as many spots as I would have expected to get. Because nearly all the drift figures were -4’s, that indicated to me that many spots were very possibly being missed, due to a drift figure of higher than -4. Placing the board in a diecast enclosure with the top on helped. I was then getting more spots, but still all with drift figures of -3 and -4, with more -4’s than -3’s. I went down to 20M, where the drift figures were a little better, but still not good enough. From cold, the first few transmissions produced no spots. After an initial warm-up period of about 30 minutes, I was getting more -3’s, and even a few -2’s. Still not good enough.

One obvious change would be to relocate the PA to the opposite side of the board, away from the clock generator board. If I did that, it would be in another build completely so, for the time being, I concentrated on other ways to bring the drift down. Here’s what I did –

  1. Mounted the 78L05 regulator on the side of the diecast enclosure, to which it was bolted. I also added a 78L08 regulator, thinking that it wouldn’t hurt to spread the heat generation between two devices, even though these parts are designed to run very warm.
  2. Added a 1N4001 diode in series with the 12V DC input. As well as providing reverse polarity protection, the forward voltage drop of about 0.7V should help to spread the heat dissipation from the regulators out just a little more.
  3. Secured the clock generator board with 2 nylon screws and a threaded nylon spacer. I had been waiting for the parts to arrive from Adafruit, so hadn’t done this earlier. (This kit of nylon screws and spacers should last a while!)
  4. Although not a modification, one thing I did differently this time before testing out the beacon, was to screw down the top of the enclosure tightly, instead of just placing the top on.

After these changes, the difference was dramatic. No spots were picked up on the first transmission. On the second transmission (on a 50% transmission duty cycle), several spots were received, all with drifts of -4. Things improved with every cycle until, after about 45 minutes, all spots were -1’s and 0’s, with the very occasional -2. Much better, and very encouraging.

After 45 minutes to an hour for warmup, drift figures are -1’s and 0’s, with the occasional -2, which comes from the same station. With more improvements planned, this is an encouraging result. My goal is to have these same drift figures on 10M.

Some more shots of the board with the regulator removed, and replaced with 2 regulators in series (a 78L08 and 78L05), both bolted to the side of the enclosure. The enclosure is a bigger mass of metal that provides more effective dissipation of heat from the devices –

Here’s a view of the board with the Si5351 breakout board and Nano board unplugged, to show the wiring underneath –

Although you can’t see them, there are 4 stick-on clear vinyl bumpers/feet on the bottom. My local Ace Hardware has a good selection of these.

Looking dead sexy in it’s diecast enclosure from Tayda –

In attempt to further improve the drift figures, I made a heatsink from a piece of brass strip, and epoxied the BS170 PA transistor to it with JB Weld. A clamp held the mighty little MOSFET in place while the epoxy set –

A pair of round-nose pliers were used to bend the leads. The leads on some of these parts are quite delicate, so I prefer to coax them round the bend, rather than foisting an abrupt 90 degree angle on them –

I am unsure of the dielectric properties of JB Weld so, to avoid any problems, made sure to keep the area around the leads free of epoxy –

I think this heatsink looks mighty spiffy. Brass is such an attractive alloy –

A close-up of the heatsink –

Unfortunately, with the heatsink fitted, the drift figures were worse. After about a 90 minute warm-up period, I was getting drift figures of mainly -2’s and -1’s. Removing the heatsink got me back to drift figures of mainly -1’s and 0’s, with the occasional 2, after warm-up. After 2 hours, the drift figures are equally split between -1’s and 0’s. All of the figures I have quoted are from 20M operation, by the way. A quite satisfactory result, I think, from a frequency generator board that is not temperature compensated.

I was already fairly satisfied with this result, but then things became better. The heat from the PA transistor was rising, and heating up the Si5351 board, forming a sort of crystal oven. Because of this, it occurred to me that if I were to adjust the bias on that BS170, it would affect the amount of heat the transistor gave off, and might also affect the drift figures reported by wsprnet.org. The transistor was currently providing about 200mW to the antenna. Although, by adjusting the bias, I could have coaxed some more power out of it – perhaps as much as 250mW, I didn’t want the transistor to run much hotter than it was already running. Likewise, I didn’t really want to run much less than 200mW. Fiddling around with the bias trimpot, I ended up with it in almost the same place as it was before. The transistor was probably putting out a mW or two more, but not much more. However, the difference in the drift was dramatic. Check out this wonderful result (still on 20M), achieved after a warm-up period of around 40 minutes or so –

These fantastic drift figures almost made me giddy! The only other thing I had changed, was to swap out the 4 oxide black panhead 4-40 machine screws on the sides of the diecast enclosure, for regular stainless steel machine screws. Perhaps they have slightly different thermal properties, but I think the main factor responsible for the improvement in drift, was the very slight change in the bias setting. I had haphazardly settled on a near-perfect bias setting, and created a very effective crystal oven! I did have a couple of other ideas I was going to try, namely placing foam over the Si5351 board, to insulate the Si5351 and crystal from air currents, and looking for a TCXO to replace the crystal in the Adafruit board. However, at this point, I don’t think it’s necessary. Running the beacon for another 6 hours, the results were much the same, though a single -2 and +4 drift figure did pop up. I think the +4 was an anomaly, probably caused by drift in the other station. This is a better result than I had hoped for. I’m ecstatic!

On 10M, it takes 3 hours to fully settle down, after which, drift figures are mainly -2’s and -1’s, with a few -3’s, the occasional 0, and the very occasional -4. However, I do notice that after running it all night, drift figures in the morning are a little worse, with a lot of -3’s and a few more 4’s. This suggests to me that the ambient temperature of the room might be playing a part.

Incidentally, changing bands only involves changing the band in the code, which requires simple changes to two lines in the sketch, plugging in a different LPF, and uploading the new sketch via the ICSP header on the Nano board in the WSPR beacon. As far as initial setup goes, before you upload Paul’s modified code, you will need to insert your callsign, and the power level in dBM. Mine puts out about 200mW, which is 23dBm. You can input your grid locator if you want, but the unit will calculate that from the GPS, once it has gotten a fix. Although I haven’t tested it yet, I assume that if the unit moves into a different grid square, it will report the new locator. (EDIT – Paul informs me that, although it would be easily possible to insert code that calculates the grid locator, his modified code doesn’t do that. I assumed it did, based on the fact that although I input my locator as CM87, wsprnet reports it as CM87ut. However, they are probably doing that based on their knowledge of my location. Looks as if I have something else to work on!)

In the future, I may experiment with an Si5351 board that has a TCXO, in order to improve the drift figures on the higher HF bands. In the meantime though, I am deliriously happy with the performance on 20M (and presumably below). This project was inspired by VK3HN’s SPRAT article, and the realization that “throwing together” a few boards, and constructing a simple PA and LPF should be easy, and wouldn’t constitute a full-blown project. I have become somewhat shy of such lengthy endeavors these days. I wasn’t expecting it to turn into a cased-up and very serviceable WSPR beacon though. I tend to let it run in the evenings and overnight, when I’m not operating. That way, in the morning, I can check wsprnet to get an idea of what propagation is like. As many others have said, it’s a handy propagation tool. If you don’t want to build one, you can buy a ready-made WSPR beacon from Harry at Zachtek.

At the risk of posting too many pictures, here are a few more –

A cigar box from the local tobacconist, and some packing foam, makes a good storage box for my growing collection of QRP-Labs LPF’s and BPF’s. Only the LPF’s are used in this project. The BPF’s, in the front row, are for receivers (though they could be used in the early stages of transmitters, where only very low signal levels are involved) –

Definitely a successful project. Thank you Harry Zachrisson of ZachTek, Paul VK3HN, and Jason NT7S –

One last gloat. Look at these great drift figures. Pretty good for an Si5351 board without a TCXO! To date, this 200mW powerhouse has been spotted all over Europe, North, South, and Central America, Hawaii, Taiwan, Hong Kong, Australia, New Zealand, and several island clusters and nations in the middle of vast oceans. Exciting stuff!

Oh, and one last thing. Paul included an LCD display in his transmitter, which shows some extra useful information. The code will support it, and his blog shows how to connect the display. I think there is just enough space to fit a display into my unit. I didn’t chance it however, as I seem to have the thermal balance inside the case just right (for 20M and below, at least) and I don’t want to upset anything. My desire for a display isn’t strong enough to want to make any more changes. I’m fine with this, as I think of it as a set and forget kind of beacon. In the evenings, I plug it in, and forget about it until morning.


14 thoughts on “A Little WSPR Beacon (Aren’t They All Little?)

    1. Phil – I appreciate that – thank you. Paul VK3HN inspired me to build this little transmitter, so if I can pass that along and inspire someone else, it’s a good thing. 73!

  1. Dave,

    Finding and reading this was a pleasant surpise! Thanks for trying my beacon script and for making it your own, with your single-FET PA and your attention to detail. Efforts like this illustrate how we inspire and build on each other’s interests and projects, which is exactly what I was doing, by drawing heavily on Harry’s kindly open-sourced beacon code, and of course, Jason’s brilliant libraries providing the foundation.

    To keep it simple the grid square is hard coded. I omitted a block of code that translates GPS lat and long values to grid square, however, that code can easily be found and added if anyone is interested. I originally had it working nicely, but as I do not own a mobile camper/RV and my beacon sits on the very fixed shack desk, I didn’t miss it.

    I am sure I will come back to your write-up and picture gallery from time to time when I feel like a dash of homebrew inspiration.

    73 Paul VK3HN.

    1. Thank you for the inspiration Paul. ‘Tis funny how reading just the right thing, at the right time, and presented in a certain way, can suddenly fill us with the urge to do something ourselves. You are right – we all feed off each other in this lustrous little melting pot we call amateur radio.

      I assumed that the code calculates the grid square, due to the fact that, although I entered my grid square as CM87, wsprnet.org is reporting it as CM87ut. However, I am now guessing that the wsprnet site turned it into a 6-figure locator based on their knowledge of my location. Interesting. I will edit my post accordingly. Well, it looks as if I have something to work on when I feel so moved!

      Now, to go and pore over one of the many wonderful trail-friendly rigs on your blog…………


  2. Dave:

    Thanks so much for yet another beautiful writeup and project description. You’re an inspiration for many of us. Like you, I’ve been thinking about my languishing CW skills and also about WSPRing. You’re piece may once again push me over the edge,

    Jim K1KJW

    P.S. Camper looks beautiful but I already suffer from a boat addiction.

    PO Box 180 Charlotte, VT 05445 james.hyde@tufts.edu

    1. Jim – I have never owned a boat, but I hear they can be more expensive and troublesome than RV’s. Probably best to stick to one pricey hobby at a time. The good thing about these pursuits is that they make radio seem cheap by comparison!

      Thanks for the kind words.


  3. Hello Dave – great to see that you are still tinkering !
    It’s amazing how our paths keep crossing – I have also just (Feb 2023) completed a CW Academy Intermediate course. My advisor was Jenna N4JEH. Made a huge improvement and great fun. I still have a way to go. I might do Advanced or may retake Intermediate – will decide after a few more weeks of live QSOs.
    Your campervan looks great. I also have a 1990’s campervan (!) – not as impressive as yours, but now becoming a money pit to keep on the road. Really ought to get rid of it but it’s too much fun . . .
    Let’s see if we can get a CW QSO on 10m sometime
    Steve, G4GXL

    1. What a coincidence Steve, that we both completed the same CW Academy course at the same time. I was sad to finish, as I looked forward to the online sessions with my classmates. Yes, campervans/RV’s aren’t cheap. Europeans are a bit smarter than us Americans though, as your vehicles tend to be smaller, and better on gas consumption. I won’t tell you the mileage I get from mine, as it’s frightening. Let’s just say that it weighs something like 7-8,000 lbs, and has a 7.5L engine. Plus, the engine is 30 year-old technology. I’m quite attached to it, and reluctant to sell, but I’m not using it as much as I used to. Plus – more money for radio gear!

      A 10M QSO sounds great. I’ll set you up as an alert on HamAlert and keep an eye out for you. Even with current conditions, a QSO between us would be an achievement, with QRP and my very modest antenna. However, if it’s going to happen, this is the time.

      73 for now,

  4. Hi Dave it is great to soo one of your works of art again.

    Have a look at the new progrock on the qrplabs site they are tiny and have a TCXO as well.

      1. I meant it as a replacement for the Adafruit module in your project. Sorry I was not clear enough.

  5. Aaah sorry Chris. I should have realized that. I did think about the QRP Labs board with the TCXO. I don’t want to use it in this particular project because (and this is a silly reason) the pinout configuration is different from the Adafruit board, and it would most likely mess up the reasonably orderly looks of my little beacon! You see, I’m not a true experimenter. I’m a person held hostage by a desire for a reasonable amount of order. I blame my father (sorry Dad!)

    If I build another one though, I may well try using that board. Thanks for the suggestion!


    1. Of course your OCD condition re neatness :).

      There is a TCXO add on board (very tiny) that QRP labs sells that mounts above the 5130 chip.

      You may be able to install this, in your elegant fashion, on the underside of the Adafruit board and get the result you are looking for.

      It is tricky to find so I have provided the link


      1. Thanks Chris! The next time I get the building bug, I will look at this. I already have an extra Adafruit board, so it shouldn’t be too hard to figure out.


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s