Thursday, March 13, 2014

Guest Post: Charles's DIY Steno Keyboard!

Recently Charles emailed me about the fantastic steno keyboard he's rigged up from scratch. It looked so amazing, I thought I'd ask him to write a guest post about the process. So here it is!

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.

9 comments:

Anonymous said...

This is brilliant! I want one!!!

Stan S, said...

So sexy!

Anonymous said...

any chance of getting a step by step tutorial of how to build a keyboard like that?

Anonymous said...

This is awesome!

Makes me more eager for Stenosarus to come out!

Shayne said...

Love it! Ingenious use of the Teensy, too.

David Graper said...

I'd love to know your source for the Cherry clears and (if you're willing) your source code.

Has the board held up for you?

Charles Shattuck said...

I got the switches at MechanicalKeyboards.com,

http://mechanicalkeyboards.com/shop/index.php?l=product_detail&p=596

but I wouldn't advise using them. Clears are pretty stiff compared to browns. I made a second keyboard, this time using an Arduino Micro and multiplexing. On that board I replaced all the springs with some I hardvested from Cherry MX browns from an old keyboard I already had. I need a source of cheap browns or reds! I'm happy to share the code for both boards, I just need to figure out where to put it.

Charles Shattuck said...

I put my source code up at github...

https://github.com/CharleyShattuck/Steno-Keyboard-Arduino

It's two files. "steno_keyboard.ino" is the original version, for the Arduino Mega. "mux_steno.ino" is the for the newer board using an Arduino Micro and fewer pins.

These are my first working programs in C and I think they are pretty simple and easy to understand. I'd love to hear what you think. (I've been programming in Forth for 25 years or so).

Anonymous said...

Hey this is absolutely fantastic. Although I knew about chorded keyboards, I didn't know that steno keyboards also used chords (I believed they just type sequentially, really really fast).

Maybe a chorded keyboard (like the image on the wikipedia for the entry) would be a good project, as you don't have to have your hands raised while, for example, you want to type while lying down (relieves strain, especially for those who can't sit for a long time or are hospitalized).

Also, congratulations for writing your first working programs in C! If you take note which loop checks conditions when, it's the easiest language on earth.