G0ETP IAMBIC Keyer with Remote-Keying Capability

Since my trusty old TS450S does not have an internal IAMBIC keyer, I wrote code for an STM32 Nucleo board a few years ago to do IAMBIC keying, as well as sending text for beacon / CQ use. As part of making my own control system for remote radio operation, I recently modified the code so that two keyers could key a radio remotely over a network connection with extremely low jitter and strong immunity to network delay. This project has now reached the level of usefulness where it warrants its own page.

Keyer Schematic

G0ETP IAMBIC Keyer Schematic

The keyer is based around a Nucleo32 board from ST Micro. I used an L432 board but since the keyer code doesn't require much space or grunt, any of the N32 boards will do. I have considered making the keyer with a bare STM32 IC but the N32 board gives the convenience of

  • USB Power
  • USB Serial port (for PC connection)
  • USB FLASH programming / debug
  • Working back from the radio, we have an open-collector transistor to key the radio via J3. Since some radios have a relatively high idle voltage on their key pin, D1 stops this from damaging the CPU input. The straight key is able to key the radio even with the unit powered off which I find useful, for example for tuning my auto ATU. Diode D2 prevents CPU/transistor keying from activating the straight-key CPU input. The paddle key inputs on J2 require no special logic. The AD8531 op-amp is used to drive a loudspeaker from the CPU DAC output. Side-tone is a 700Hz sine-wave with nice pulse shaping. Volume control is taken care of in the software.

    Keyer Operation

    The keyer presents a human-friendly command-line interface via its USB serial port (/dev/ttyACM0 on Linux). The help screen looks as follows:

    CMD:?
    Commands for G0ETP CW Keyer V1.20 on Nucleo64 F303 (C) Tim Howe 2020-23:
     Blue button (if available) will start/stop the beacon keyer
     D Disable beacon keying
     E[0-n] Enable beacon keying for n reps. (0 or blank is infinite)
     F[0/1] Show/set IAMBIC FSM policing of inter-character spacing
     L<0/1> Turn the LED off or on
     M[20-200] Show/set the CW dot duration in ms
     N[0/1] Show/set network keying output enable
     R[0/1] Show/set paddle reverse (right/left handed)
     T[string] Show/set the CW beacon text
     V[0-9] Show/set CW side-tone volume
     W[20-200] Show/set the CW dot duration in WPM

    Keying Data Stream (Based on but not the same as CwCom)

    When network-keying output is enabled, the keyer outputs a string of key-down (+ve) and key-up (-ve) timestamps in ms. The first value is the key up duration since the last sequence. I have elected to send a -0 here if the previous sequence was more than 5s ago; this is interpreted by the receiving keyer as an opportunity to re-start its network pre-buffer delay (currently 1s but will be programmable). This means that the remote keyer has a delay of (internet)+1s and all gaps up to 5s are completely faithfully reconstructed. Gaps longer than 5s simply allow the process to be re-baselined, removing any liklihood of internet timing creep. An example showing 'CQ CQ' at 21wpm:

    -0 +165 -55 +55 -55 +165 -55 +55 -165 +165 -55 +165 -55 +55 -55 +165 -825 +165 -55 +55 -55 +165 -55 +55 -165 +165 -55 +165 -55 +55 -55 +165

    More to follow


    Last updated: 10.12.2023