At the beginning of this year my RSI became severe enough that I had to do something. I tried a Kenisis contour and a Goldtouch split keyboard. Neither of these provided the relief I was looking for. I got lucky and found a used DataHand Personal on Ebay. I was able to get a unit in pristine condition for half the price of a new one (at this price I could resell it for close to what I paid, if needed). The difference with the Personal is that it has a fixed QWERTY layout whereas the professional allows reprogramming of 20 keys. The current model also has USB whereas mine has P/S2.
Learning the DataHand was pretty difficult. After 20 years of touch typing you dont really think about key locations. However, like most things in life, it was mastered with time and persistence (my RSI also kept me well motivated). After about 4 weeks I was using the DataHand part time and after 6 months was at 45 WPM (I was at 55 WPM on a traditional keyboard before I started). During this period I found some things with the DataHand key layout that I, personally, found sub-optimal. At this point I had a choice. For $180 I could have upgraded the unit to the Professional firmware to enable key reprogramming and resolved most of my issues. Or I could build my own controller.
I have am a EE by trade with many years of software and electronics experience. I innocently decided that designing my own controller would be a easy, quick project. The electronics part was easy but this was my first embedded software project. I have learned a lot and it has been fun, but writing Embedded C code was neither quick nor easy.
I searched the internet and found several keyboard projects based on the Atmel AVR platform. Because of these examples I picked the AVR. (I learn best from examples)
My first task was to reverse engineer the DataHand. I found that to be a fun challenge. The DataHand consists of 2 halves with 26 keys each. The DataHand used optical couplers instead of physical switches. This helps reduce the key force but also eliminates ghost keys. The two halves combine to create a single 13x4 keyboard matrix. The DataHand has a large 15 pin DIN cable to connect the left and right halves (The large cable is one thing I plan to streamline). There is one good thing about the 15 pin DIN cable: it makes a great debug port. (You see I have only one DataHand and I did not want to take it apart every time I wanted to work on my microcontroller.) So, in the evening I would just unplug the left hand and reconnect it to the 15pin DIN on my breadboard. This allowed me to do about 90% of my code development with the DataHand fully assembled.
My first AVR was the ATMega644 but I could never get the USB working. I then discovered the Teensy2.0++ from pjrc.com.
The Teensy is fantastic. It gave me an AVR with a ton of IO in a 40 pin DIP foot print and an onboard USB connector. Pjrc also included some debug utilities which turned out to be a real live saver. The DataHand uses a 40 pin 8051 as the microcontroller.
I was able to make an adapter using a 40 pin dip socket.
With the adapter I can plug the Teensy directly into the DataHand circuit card.
This was soooo much easier than making a new circuit card. Right now the cable for the Teensy snakes out the top, but eventually I will run it out the back.
At this point the project has the following:
[*]A Multi endpoint USB device that implements both a mouse and keyboard
[*]A firmware based 3 button scroll wheol mouse
[*]A Perl script which allows quick regeneration of the keyboard matrix
[*]Full rearrangement of mouse/keyboard layout via the Perl script and Firmware update
[*]A hotkey which initiates a firmware update
[*]No special mouse or keyboard drivers required
The new layout I have settled upon is below. I highlighted in green the keys I moved. This text is very close to what my Perl script reads in.
The things that drove my new layout were:
[*]The default DataHand layout has non-alphanumeric characters on the same keys in NAS and NORM mode. For example NAS+pointer_finger+east gives you underscore, whereas unshifted_pointer+east gives you single quote. By sharing the same key I found myself hitting shift+pointer+east instead of NAS+pointer+east for the underscore. To alleviate this I rearranged the keys to follow the shifted/unshifted relationship of the QWERTY layout as much as possible and only put special characters on the A-Z letter keys.
[*]I wanted the mouse keys on the unshifted NORM keys
[*]I wanted the ( and [*]When I hit the space key, the edge of my thumb would bump the FUNC key and put me in FUNC mode.
[*]When I would use FUNC mode keys like arrow or page down I would often forget to exit FUNC mode.
With this problem solved I went after the only real shortcoming I have found with the DataHand: the mouse. Dont get me wrong, the DataHand is a fantastic keyboard. However, I tried the built in mouse keys but they did not work well for me. It was like walking through Jell-O. I tried adjusting the speed of the mouse keys, no luck. I tried several things to solve the mouse problem: I first moved my external mouse to the left side (This gave a much needed break to my right hand). Next I purchased an ergonomictouchpad.com (recommendation from a DataHand user). This is a good device, but I could not find a good place to put it. The last thing has been the best.
I mounted a trackpoint from a IBM KPD8923 just below the c key.
As you can see, the mounting point is over the edge of the DataHand PCB. So, I had to create a mounting plate. Here is how the TP is held in place on the IBM keyboard.
I cut out the chunk to which the TP was mounted. I then mounted this on the backside of the DataHand circuit card.
It has been in place just a few weeks and I am really liking it. The addition of the trackpoint makes the DataHand a comprehensive keyboard/mouse solution. I just have to move my middle finger a small distance from the home row to access it. I have the 3 mouse buttons assigned to the right hand.
Some things I would like to do in the future:
[*]2 wire cable between left and right halves (instead of the bulky 15 pin din)
[*]Key frequency logger so I can better optimize my layout
[*]Design a PS2 -> USB controller so I can add acceleration to the TP
The DataHand at my desk