My Homemade DIY Steno Keyboard

Not having enough patience to wait for the Stenosaurus, I decided to make my own Steno keyboard. I was pretty happy with my modified Quickfire TK in most ways, but the offset between the upper and lower rows of keys was disorienting. Here is what that keyboard looked like just before I made my own.

Note that I removed unused keys because they were distracting. I found the pairs of keys that matched in height the best and placed them upside down in the top row to get them closer to their mates in the bottom row. Chords are easier to hit this way, but I still wanted the rows to line up.

I started by removing some mechanical keys from an old Kinesis keyboard that doesn’t work anymore. I experimented with drilling holes in a Radio Shack prototyping board and placing the keys. Then I bought a bargain bag of Cherry MX clears (white?) and after drilling the appropriate holes I hot-melt glued them to the board. I decided to wire each key to as separate IO pin on a micro-controller instead of using a matrix. It seemed simpler and it was only 23 pins. Here’s what the wiring looks like. It’s soldered, point to point, using wire-wrap wire.

I also bought key caps in two colors, black and dark gray, all the same size and shape. I installed the thumb keys sideways so that the AO and EU pairs would make comfortable chords same as the keys in the upper and lower rows. I also ended up placing the DZ keycaps sideways to get them closer to T and S. In the next version I would probably use roughly the same spacing except to place the * and the DZ keys sideways and slightly closer to their neighbors.

I used an Arduino Mega as the micro-controller. I normally program only in Forth, but this project is so simple that I decided to try the Arduino IDE instead. I believe it took less than an hour for me to code and debug the application, which surprised me.

Here’s a picture of the finished board:

I used my understanding of the TX Bolt protocol, since I knew how to use a serial port but not so much about emulating a USB keyboard. Also I hoped that using a serial protocol would bypass the problems with the NKRO keyboard in Linux that were preventing me from using VIM. It turned out that I was able to use both the standard keyboard (in Dvorak layout for me) and the steno keyboard using TX Bolt at the same time without any trouble.

I tried simplifying the TX Bolt protocol in hopes that it would not confuse Plover and make my program easier to write and debug. Instead of using a variable length packet, sending only the keys that are pressed, I sent all four bytes in order every time, even if some of them are zero. The top two bits of each byte identify the other six bits. Always sending byte number four lets Plover know immediately that the stroke is finished, I reasoned, and this seems to be the case. I never bother sending any other bytes.

I’ve been very happy with this keyboard. I would love to move on the next one. I would make it more compact, getting the micro-controller out of the way. It should have a case, both for protection and to make it more sturdy. I did bolt it to a piece of clear plastic from Tap Plastics, but I’d like to do better.

Finally, here’s a picture of the keyboard in action, editing a file with VIM in Linux on my laptop.