Ultimate 3D keyboard progress report

This thing is going to rotate heads

Small TX light is flashing on my table as I'm typing this. Arduino is transmitting my key presses to the PC.

I have made a keyboard that's truly custom.

It's got proper ESC-key and a shift with clearance around it. I'm not sure the shape is correct, but I'm getting used to it. It's easy to reach around in my new keyboard, although I keep hitting the wrong keys. It takes a while to get used to a letter-bottom-row in your keyboard.

This is not my whole left hand side. I was planning for arrow key sector and an F1-F12 function key block around this baby. It took so long to print what I got, so I left them out for now. The frequently used parts must work before I introduce luxuries here.

The extra 2 rows are the most prominent in this design. First of all up there I got some usual non-US keyboard keys that were hard to fit into ergodox. Second I got 6 keys reserved for production of parentheses. I'm tired about using shift key to reach on symbols. On the right-hand-side I'll have another one like that. It'll be for most common symbols. My goal is to mostly avoid having to press shift while programming.

Keymap configuration

Since few people actually have useful extra keys in their keyboards, keyboard mapping customization is bit tricky on computers. I tried to map the symbols on my keyboard that it would mostly work, but I got special needs. I put the special keys into use by mapping them into scancodes I never had anyway, then I put those scancodes to produce useful actions. To do this in linux with xkb, I had to write the following file: ~/.xkb/xkb-map

xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   {
        include "pc+se(dvorak)+inet(evdev)"
        key <FK13> {         [     bracketleft ] };
        key <FK14> {         [    bracketright ] };
        key <FK15> {         [       braceleft ] };
        key <FK16> {         [       parenleft ] };
        key <FK17> {         [      parenright ] };
        key <FK18> {         [      braceright ] };
    xkb_geometry  { include "pc(pc105)" };

Running xkbcomp ~/.xkb/xkb-map $DISPLAY delivers this file into it's place. That setting feels simultaneously actually a bit cool and a bit clunky.

Sadly there's simultaneously lot of space and little of space in the USB spec for this kind of stuff.


Pose on the keyboard

I raised the location of thumb keys to make them more accessible. I'm not sure whether I got it right because I still have to make some effort to reach them. Also because the thing is oriented like it is I find it easy to press X with my thumb! I'm not sure about how useful that is.

My build is a bit flimsy and some keypresses shake the thing a lot. It's uncomfortable and I should get rid of that when I construct a final design. Diddn't want to maximize my use of plastic while prototyping. I hope it doesn't compromise testing. I decided I wouldn't print the arm rest. It's necessary for so high keyboard but I had this convenient printer cartridge package laying around.

I thought the pose was bad at first touch. But I'm getting used to this. I probably have to do adjustments but I'll try it for a week before doing so. These things need time to come out.


More wires

It was especially helpful to order some small PCB-boards that would fit under the keys and allow me to do quick modifications to my keyboard and it's matrix. Also the underbelly full of wires seem slightly cool! It is a total mess on my table because it's lacking enclosure. But it makes up kind of a likeable aesthetic.

The electronics here are quite straightforward and easy to reason about. There's a diode connected in series with every keyswitch, and the keyswitches are connected into a scanning matrix. The wires of the scanning matrix reach to the control circuit.


Wires bound with painters tape for revealing their order

Arduino Keyboard -library is trying to help you too much, so you can't make it run with it. The source code was relatively short when all the crud is removed so it's not total letdown though.

I hate when simple things such as keyboard scanning is made complex to support every possible cause. So I rolled out my own from the pieces I picked up. It shows up in the menu as an arduino keyboard, but I don't really care much about that detail. I know it could be changed by changing the HID library.

It's bit worrying that someone comes and crumbles my keyboard firmwares to prevent access to my computer. To prevent that it's enough to not have your main user in tty or dialout groups, so I'm probably fine. I've never had anyoen snooping on my Linux computer.

In case someone wants to replicate this on some of their projects, they may be interested about sending USB codes without mangling. I left in little bit of mess because it was clean enough, but here's the source code in case anyone reading this needs it.

Layout was designed in VR

As if the whole project weren't hardcore enough, I designed this layout in virtual reality.

It is difficult to analyse possible designs on a flat screen. The shapes I were thinking of were all quite complex - I wanted to bend the typing area to shorten the distances between keys. We tried to print out a design for studying and it was a crapshoot.

Since I got Oculus Rift and one computer where they work, I wrote myself a tool in Unity3D to position keyboard keys and store the results in .json -files. I hooked up a 3D connexion joystick to move every little piece to its place in the virtual environment. The resulting design was shaky but I exported the results to Solidworks and figured out the relations there are. I ended up positioning the keys to tessellated toroidical and spherical surfaces.

It was quite hard to print in whole, and I would have made so many errors to make it infeasible. So I made the thing out of pieces. The result was sort of weird flat profiles and hard round shells that keep the thing together. I think I'll try design the next enclosure out of plexi glass shapes that mesh neatly together. I may have to practice a bit with the concept first.

Hacker Summary

I've written tons of parentheses in markdown syntax and I friggin love this! The keys are relatively far but are still 6x more comfortable to press than the usual shift-parenthesis combination. That alone means this project has succeed to improve comfort during typing.

I will see how I have to change it to improve the comfort. Right now it feels like it would need little bit more of concavity so I can reach the symbol rows easier. The starting angle of 30 degrees is maybe bit too much, but if I lower it that would mean the last row gets too steep. Lots of constraints that need to go together.

I am sure it's going further.. But I gotta get more cherry MX keys in blue flavour before that! I only had 78 of them to start with. Going to need at least 50 more to build the right hand side.