top of page

Arduino CW decoder project part 5

Updated: Oct 9, 2021

Although I am still refining some aspects of the code, the primary objectives have now been completed and I have a working CW decoder. The biggest change since my last post is that it is now in an enclosure and looks more permanent that the breadboard prototype. I have also done some more testing in order to identify any limitations and feed into the refinements.


The decoder components fitted comfortably into one of the plastic boxes that I use for my antenna matching transformers. I cut a hole in the lid for the LCD display and arranged the location of the other components around that.

To minimise the wiring and mounting requirements, I piggybacked an Arduino Nano onto the back of the LCD display. By choosing the data pins appropriately, I was able to align them with the matching data connections on the LCD display and use header pins to solder them together and support the Arduino. The LCD display was then secured in the cut-out using double sided sticky pads.

Arduino Nano mounted on the LCD panel
Audio interface and power supply

The audio connectors, audio interface board and power supply were mounted in the bottom of the box and the decoder was ready for more testing.

Schematic connection diagram


I have tested the decoder on a wide range of YouTube videos, web SDR sites and with my transceiver. I have not published any of the live conversations as I believe that I should get the participants permission to do that.

The decoder works with 100% accuracy on the learning videos that I found including speeds of 15 - 38wpm and a wide range of timing variations. The limitation of these is that the signal is virtually noiseless and consistent throughout so once the decoder has picked up the carrier frequency and the speed, it doesn't need to make any changes.

For the Titanic audio (shown here) the decoder is about 99% accurate with a few errors when the decoder retrains to a new transmitter. with a different signal frequency. There is also a section where multiple transmissions are happening simultaneously. The video transcript declares this as "jamming" but my decoder manages to decode the stronger signal for a good part of this section.

The real conversations which some users record and publish tend to have higher noise levels and fading signals. The decoder can now cope with these but will stop when the signal is below a minimum level or the noise level is too high relative to the signal. The same is true of my HF transceiver and web SDR but with the added complication of automatic gain control which brings the noise level up in the gaps between transmissions. This caused quite a few problems at first but I have now implemented algorithms to distinguish between noise and signal and to apply a digital "squelch" to suppress the attempted decoding of noise.


I am currently writing the code to allow the decoder to pick up a change in signal without losing the first character whilst it retrains. The principle has been successfully tested and just needs implementing. I then intend to do some more testing and get feedback from other users before finalising any further tweaks.

Meanwhile, in parallel, I have programmed a Nextion display to provide a much better interface. I will introduce this in the next part.

498 views0 comments


bottom of page