A long time ago one of my prize possessions was a Newton Messagepad 2000. I was a true believer. I even kept it running for many years past its prime as an address book and notepad. Finally it was put away along with its almost unused keyboard. Recently an ESP32 project made me consider the Newton Keyboard again because, unlike all modern keyboards, it sports a serial output which makes it super easy to use. That project never came to fruition but the keyboard was left laying on my lab bench. I finally decided to spend a little with it and make it useful again by giving it a USB keyboard interface.
The conversion itself is very simple. Disconnect the existing cable and wire an Arduino Leonardo (or clone as I used) to the keyboard's circuit board as shown above. Route the USB cable out the same hole in the keyboard's enclosure as was used by the original cable. The Arduino is held in place with double sticky tape. A couple of notes
- The keyboard is specified to operate at 4.5 volts. I suspect it would work at 5 volts but I included a 1N4148 diode from the Arduino's 5V output to the Keyboard's VCC circuit. This drops the voltage to between 4.4 and 4.5 volts.
- The keyboard has a differential output running at 9600 baud. The voltage levels are 5V CMOS compatible so we can just tap off the negative going signal from the pair and feed that into the Arduino's hardware serial port (RX input).
- The keyboard output a single byte for each key. One for a key press and one for a key release. The byte value is the same except the most significant bit (7) is set for key presses and clear for key releases.
The Arduino sketch simply converts the Newton keyboard key codes into modern ones (both key press and key release codes). It has two special features worth noting.
- The Newton Keyboard has no Escape key. A big problem for a unix/vi user like myself. A special case in the sketch returns the Escape key code when the left shift key is held down and the ~/' key is pressed.
- The Arduino sketch has a special mode that is entered when the 'X' key is pressed within five seconds of the Arduino booting. Since the Arduino takes a few seconds to boot there is an about 10 second delay after the keyboard is plugged in before it starts operating. The special mode causes the sketch to output key code values to the Arduino's USB serial port instead of turning it into USB HID device. I used this functionality to determine the keyboard's native key code values. The special mode is also useful to upload new code to the Arduino since the upload process won't work while the Arduino's USB interface is acting like a HID device.