I've made a few updates since writing the article. In general I will update the text, schematic and software in the main article without necessarily giving the history there but I'll make a note of it here.

March 11th 2010 - Revision 1.1

After some timing tests it seems that the standard LiquidCrystal display library with the Arduino is relatively slow. It is configured by giving it a list of integer numbers to define the ports. This is very flexible and convenient but it costs quite a few clock cycles because of the bit shifting and manuipulation that's involved.

We only need a limited subset of the HD44780 functionality so I've written code to do this and eliminated the LiquidCrystal library. I also changed the pin to pin mapping between the Arduino and the LCD so there is an updated schematic.

Download:  Software 1.1   Schematic 1.1

March 12th 2010 - Revison 1.2

I'm probably guilty of unnecesary optimization here but I've now replace the Arduino ShiftOut function with my own code to serially write to the DDS. ShiftOut is also quite slow for the same reason as the LiquidCrystal slowness described above. We now write 40 bits to the DDS in about 120us instead of 600us with ShiftOut.

The only code that now uses the Arduino digital I/O functions is the code that reads the buttons. I will leave this as it is because speed is not important for the buttons and it makes it easy to add more buttons of other input devices to the spare inputs.

Download: Software 1.2   Schematic 1.1

March 14th 2010 - Revision 1.3

We now have QRSS mode!  See the operating instructions page for more info.

Download: Software 1.3   Schematic 1.1

May 3rd 2010 - Revision 1.31

Bug fix. If you switched out of QRSS while the frequency was shifted for key down it stayed shifted until the encoder knob was turned. It immediately goes key up now.

QRSS dot time is now six seconds. This seems to be the more common setting on the air.

Download: Software 1.31   Schematic 1.1

October 30th 2010 - Revision 1.4

We now have a transceiver mode. This is designed to be used with the CW transceiver described here. You might want to stick with revision 1.31 if you don't want this mode.

Download: Software 1.4   Schematic 1.1

March 2013

Unfortunately I haven't touched this for quite a while sad. I'd like to get back to it and do some enhancements but ... spare time is scarce.

Several people have reported problems with the buttons not working. The pullup resistors on those ports are not being enabled properly. The solution seems to be to reverse two lines in the code so that we set the port as an input first and then enable the pullup resistors.

Change these lines:

// initialize the button ports
for (int i = 0; i < sizeof(_buttonPorts); i++)
  digitalWrite(_buttonPorts[i], HIGH); // enable pull-up resistor
  pinMode(_buttonPorts[i], INPUT); // set port as input


// initialize the button ports
for (int i = 0; i < sizeof(_buttonPorts); i++)
  pinMode(_buttonPorts[i], INPUT); // set port as input
  digitalWrite(_buttonPorts[i], HIGH); // enable pull-up resistor

The original code works on the older Arduinos but there is something slightly different about the newer boards or chips. I probably misread the specs and got it wrong with the original code but luckily it still worked. The encoder ports a few lines down are initialized in the correct order which explains why this is only a problem with the buttons.

I haven't tested this myself so I won't release a new version but I have put a note in the existing code pointing here.

Thanks to those who reported this.