Arduino CW keyer for a BiTx or other homebrew rig

It’s been 3 years since I got my MST400 Mk 1 40 meter SSB transceiver going and started using it for SOTA activations. For those not familiar with it, it’s like a kit version of the BiTx40 from 2013. It has a similarly spec’d monoband superhet receiver, 10MHz IF, and IRF510 5 watt power stage. The circuit on a page is here. It’s been with me for nearly all of my 65 activations (over 400 SOTA activation points) around VK3. Now, with HF propagation approaching cycle lows, it is time to do what I should have done ages ago… add CW.

What spurred me on to do this mod was all the BiTx40 activity at Bitx20 on and Many of the BiTx40 mods being discussed are directly applicable to other similar QRP rigs.  Discussion of adding CW centered on building an audio oscillator to generate a 700Hz tone, feeding this into the mic amp, optionally into the audio amp for sidetone and as the Soldersmoke boys would say, ‘Bob’s your Mother’s Brother’.

There are a few other things to think about, the main one being whether or not you want break-in.  Having built and used the Wilderness SST (a CW rig designed from the ground up) I know how good break-in can be for CW operating convenience.  To add to this, the last rig I built and used for CW, a 160m AM/CW rig with manual T/R switching, reminded me of the nagging inconveniences.  I now consider break-in and a keyer mandatory for portable operation.  In the Wilderness SST, I added K1EL’s dedicated  hardware keyer with good results.

The DDS VFO in my MST400 is a kit module with closed source, so there was no chance of adding a keyer or accessing the display for other purposes.  So I decided to add a second microcontroller (Arduino) into the MST400 box.

A keyer is not a demanding thing to ask an Arduino to do. The enabler is the tone() and delay() functions. The first puts an audio frequency square wave on one of the pins, while the latter delays the script for a number of milliSeconds. Turn the tone on, delay for 60mS, turn tone off, and you just sent a dit at 10 w.p.m.  You get the idea. The rest is just code.

Ashar Farhan VU2ESE uses Arduino tone() for sidetone in his uBitx design.  On CW transmit, the uBitx Raduino tells the si5351 to put one of its clocks on the signal frequency.  Keying is done by enabling and disabling the si5351’s clock output; at the same time Raduino generates fixed frequency audio tone which is injected into the audio chain for sidetone. A simple R-C filter reduces the sharp edges.

So one night I laid out some experimental keyer code.  It all came together easily.  The keyer code is here.  The connections are described in the  You can download and run it as is, and it will blink the on-board LED.  Or add a small speaker with 220 ohm series resistor between pin 8 and ground.  (Note that I’ve only run this on a Nano). Here’s the wiring diagram and some pics.

I bent the pins of the DIL socket at right angles and soldered them to a handmade PCB. The only other parts are the 2N7000 PTT relay driver and 3-pin regulators.  I added code to read push-buttons on digital pins to trigger hard-coded messages (like CQ and CQ SOTA). A  5k linear pot across 5 volts with the wiper connected to one of the analogue inputs acts as a speed control. The board is designed to fit over the SO239 aerial socket on the MST400’s rear panel. The toroids to the left are part of a VSWR sampling bridge; not debugged yet… more to follow on this.

I also added a CW ident which sends a callsign every 180 seconds. In the spirit of Arduino, Raduino and BiTx40, you can modify this sketch to suit your needs and likes.  Let me know if you try it, or better still, use it in a BiTx or homebrew rig.

Some other Arduino keyers I found include this well-worked one from K3NG, and  this one for an Uno.

19th March 2018:  Jerry W0PWE contacted me a few months back and filled me in on how he took my keyer script from github and merged it into his Arduino controller script. Here’s a picture of his rig, a 5-band CW QRP transceiver, quite similar to my SummitProwler IV project. Love your work Jerry!


Tagged , , , , , ,

7 thoughts on “Arduino CW keyer for a BiTx or other homebrew rig

  1. […] ‘solder sessions’ finished all the wiring, debugging and testing required to deploy my Arduino Nano keyer and SWR/power meter, and the LED LDR AGC and S-meter modules into my homebrew 40 meter SSB rig […]


  2. Leo says:

    When I try to compile your keyer code I get the error message below. Please let me know how can I fix this issue. Thank you.

    key:42: error: variable or field ‘set_key_state’ declared void
    key:42: error: ‘key_state_e’ was not declared in this scope
    key:43: error: variable or field ‘activate_state’ declared void
    key:43: error: ‘trx_state_e’ was not declared in this scope
    variable or field ‘set_key_state’ declared void


  3. Leo says:

    Hi Paul,
    Many thanks for help updating the code.
    Now everything works fine.
    Best Regards.

    Liked by 1 person

Leave a Reply

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

You are commenting using your 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

Shack of VK2KMI

Ham Radio Blog of VK2KMI

Ham Historian

A passionate amateur looks at Melbourne history


My journey of repairing and recycling anything I put my hands on that I believe is still useful. Not just hardware, but including software with relevant content and issues in the field of Cyber Security, Vulnerability Scanning and Penetration Testing.

G4YDM Ham-Radio and SWL news

Radio craft, homebrew, QRP/SOTA, AM

Amateur radio experiences with VK1DA

Tj Lab


The Microscopic New Yankee Make Shop

Bits of technology and illogic by WA2MZE

Paul Gacek



This blog is no longer in use!

%d bloggers like this: