Buy Magic Mushrooms
Magic Mushroom Gummies Best Amanita Muscaria Gummies

Morse code keyboard

 Uncategorized  Add comments
Feb 202012

USB Iambic Morse Keyboard

Have you switched your QSOs to PSK31 or some other digital mode, but miss the joy of sending CW with an iambic paddle? Then here’s a project for you.


Bill Ward (KD4ISF), Guy Dickenson (KD7TJJ) and Dave Clausen (W2VV) setup a club call sign N2YCR and a remotely operated computer station running fldigi for PSK31. The machine is in the backroom at NYCR and can be operated by members with general class amateur radio licenses from anywhere, using xvnc to display the fldigi application.


But operating it with a keyboard has none of the feel of an old fashioned QSO, so I designed an interface for Dave’s BY-1 Bencher Iambic Paddle. Iambic paddles are very different from straight keys in that they have two inputs: one for “dit” and one for “dah”. If an input is held in, it will repeat at a pre-programmed speed. If both are held in, they will alternate between the two symbols. Typically the dah is three time as long as the dit.

USB Iambic Morse Keyboard closeup

The paddle itself doesn’t generate the code; this is the responsibility of the radio, or in this case, of the Teensy 2.0. It runs a state machine that listens for PIND4PINB4 to be pulled low to indicate a dah, or PIND5PINB5 to be pulled low for a dit. If neither is pulled low within the time of two dits, the current bit-stream is looked up in a table and if there is a valid USB keyboard event in the table it will be sent to the host computer.

With a straight key the computer would need to estimate the codes per minute and try to differentiate dits from dahs. But with the iambic paddle, the operator has input the separate symbols so there is no difficult step to determine the code. This makes it feasible to run the entire decoding stack in a small microcontroller like the ATMega32U4.

Sending CW without audio feedback is very hard, so a tone is produced via PWM on OC0A at 498 Hz, directly into a speaker scavenged from an old headset. Software controls the volume in a crude fashion by limiting the on-time of the square wave. If the input sequence is not a valid Morse code, the timer 0 is switched to a slower speed, which causes OC0A to be driven at half speed, or 249 Hz, which will indicate an error tone.

Full source for the Teensy is available for your own use. It should appear as a generic USB keyboard and work with any application.

Making boxes

The case is made using my laser cut box generator and available on Thingiverse. I cut it using 6mm clear acrylic at 100% power, 4% speed, and etched the raster at 100% power, 20% speed. The box is a friction fit and holds together without any screws or glue.

Some possible improvements are to have an external potentiometer to control the speed of the CW (currently it is a compile time constant), and to create a USB serial device that translates its input into audio so that you can have a full CW QSO with fldigi.


 Posted by at 9:35 pm

  22 Responses to “Morse code keyboard”

Comments (18) Pingbacks (4)
  1. […] Building in part on the project in the previous post, check out this Iambic USB Keyboard that Trammell built for the N2YCR station at NYC Resistor. He writes: […]

  2. […] but [Hudson] at NYC Resistor finally managed to give that idea the justice it deserves. He built a USB Morse code keyboard¬†with the same type of telegraph key the pros […]

  3. […] via PSK31 may be quite boring due to the lack of a iambic paddle. This project was tested with a computer on the back of NYCR that receives commands via a paddle. Read on to know […]

  4. […] Since the device is pretending to be both a mouse and a keyboard, the sample code from pjrc needed quite a few hacks to implement both USB endpoints. I’ve been slowly reworking this code to use structs rather than arrays of bytes for the descriptors to make it easier to read; this device is a hacked up version of my USB Morse code keyboard. […]

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>