This page and all associated content (images, .pcb files, etc...) are Copyright ©
1999 Adam Wozniak, All Rights Reserved
The PicKey source code is GPL, and is available as a ZIP file The PCB designs and circuit designs are also GPL.
PIC-Key one handed mobile chorded keyboard based on a PIC microcontrollerMotivation:
Solve the keyboard input device problem for wearable computing and accessability needs. Most of the competition is either too large, too bulky, too costly, or too limited in OS support.Competition:
The most likely sore spot for patent infringement is US05267181. Most of the others I found are design patents, and describe only the physical shape of the device.Design:
The PIC-Key will be a one handed chorded keyboard similar in
appearance to the Twiddler. It will connect to the computer
via standard PS/2 mouse and Keyboard connectors.
Users will be able to enter keys and move the mouse by
pressing on a combination of 1 or more buttons.
As far as the Host CPU is concerned, it will act
just like commodity Keyboards and Mice; no special drivers
will be required. The use of a PIC microcontroller will
keep the overall component count low. I expect the most expensive
piece to manufacture will be the plastic housing and switch
I expect we can at least offer a product competitive with the Twiddler.
Q: Why a PS/2 mouse and not a serial mouse?
A: The commodity chip which implements the keyboard functionality on most of the PCs on the market today implements the PS/2 mouse functionality also. If you buy a computer today, odds are it has a PS/2 mouse connector. PS/2 mouse connectors are essentially free. Using a serial connector eats up a serial port, and most wearables types I know can come up with better things to do with a serial port. If this project goes well, I may consider doing a version with a serial mouse.
Q: What about a USB port?
A: While USB ports are becomming more common, I have yet to see a machine with a USB port and NO PS/2 ports, with the exception of the iMac. (see next question)
Q: What about a Macintosh port?
A: While the ADB is electrically similar to the PS/2 ports, and would be fairly easy to implement, I don't see a lot of interest in this from the wearable community. My most likely next port (if I do one at all) will be a USB device, which (unless I'm mistaken) would also be usable with an iMac.
Q: Why a 16C63 and not a 16F84?
A: While the 16F84 is the ubiquitous hobbiest choice, it falls short in a number of ways. It only has 1K program memory, vs 4K for the 16C63. The program code is already just over 1.5K, and I expect it to grow when I start doing alternate keymaps and user defined macros. The 16F84 only has 13 I/O pins, vs 22 for the 16C63. The current hardware design uses 15 I/O pins. The 16F84 has 68 bytes of data RAM, vs 192 bytes for the 16C63. I currently use almost 100 bytes of data RAM. The 16F84 tops out at 10Mhz, vs 20 MHz for the 16C63. While I only drive the chip at 8MHz, it is nice to know the extra speed is available if I ever need it.
Q: Do you use a standard chord layout?
A: I have been unable to find any documented standards for chorded keyboards other than so called "one state" keypads (one on/off button per finger). Both mine and the Twiddler are effectively "three state" chorded keyboards (each finger can press one of three buttons). Both are alphabetical. I am currently working with Kevin Wang to develop a chord layout which is based on english letter frequencies and relative finger strengths, including relative strengths at relative positions. The idea is to apply lots of algebra to arrive at a chord layout which distributes finger usage evenly over all fingers while typing normal english.
I have a prototype on a breadboard. I can use it to chord keystrokes into 3 different test PCs in my garage. It supports all the cool LEDs (capslock, scrolllock, numlock) and all the typematic repeat settings. I have settled on the circuit schematic, and have ordered 10 boards from ExpressPCB. I am in the process of adding PS/2 mouse support.
I have assembled prototypes. I have a keypad I like, but it is expensive. Friends have convinced me to add a fifth group of buttons, and non-volatile programmable memory. I'll post a new rev of the circuit board soon. Still no mouse progress; I may nix the idea, as touchpads can be had from surplus vendors at $5 or less.
I think I need to start getting broader input from the wearable community. I've posted the page URL to the wear-hard list. We'll see what happens... I still haven't decided if I want to productize this, or just Open Source the thing. I'm not sure how Open Source would work for a hardware project anyway. Advice is appreciated.
Got the case, and boy is it a dog. Anodized aluminum with no back. Too thick, too deep, too heavy, and completely unsuitable. :P Sent the second rev of the boards in today. Expect them back in one week or so. This rev should be suitable for sale as a kit, once I get the case issue sorted out. I'm starting to get more gung ho about implementing the mouse portion of the project, now that I've found some better references.
Picked up an old PS/2 model 55 to use as a test machine for the mouse portion of the project (I didn't have any spare motherboards w/ PS/2 mouse connector). I get it all working, and lo and behold it doesn't like my keyboard. Go figure. A quick spec re-read and some minor fiddling, and now all is happy again. Seems newer motherboards are less finicky about some obscure corners of the spec than the old PS/2 machines were. Anyway, I've learned something new. I also built a splitter cable to test the mouse functionality out. Looks like that is where I'm focusing my attention for a while.
You know you're in trouble when you go disassembling the PC BIOS to figure out why things aren't working. The PS/2 would only recognize my mouse code about 1/2 the time. Turns out the BIOS had stricter timing requirements for pointing devices than for keyboards. Go figure. Now on to the rest of the logic... I got rev 1 boards in today and assembled one. Looks smart, and is easier to test with. See pictures below.
Now I can drive the mouse cursor around the screen using chords. I'm glad I implemented the feature. Somehow makes it all worthwhile. Now I've got all sorts of ideas for re-implementing shift/alt/ctrl, as well as tightening up how they and the mouse control interact with the typematic features. not to mention programmable macros...
Well, I can play minesweeper with it now. I'd call that fit for human consumption...
I got some good email today.
Whelp, there's something like a User's Manual, and I've got a total of 4 functioning prototypes. I'll ship some off as soon as I get my cables... Extra buttons and non volatile memory are currently on hold. I've found a manufacturer of "semi-custom" cases; they start with a large selection of stock cases, then cut holes and add printing. Should be cheaper than a custom plastic injection mold. I've also found several outfits which will do custom silicon rubber keypads. Looks like I'm converging on a low cost case for this puppy.
NOT. I'm currently stalled on cases and keypads. I can't find anything i like "stock", and "custom" is turning out to be very cost prohibitive unless I can commit to an obscenely large number of units. *sigh* I'll figure it out :)
Source code is GPL'd. Find it here pickey-dist.zip
|The prototype breadboard unit.
This one is fully functional, except for the mouse support. I don't
like the membrane keypad at all. I'm looking for something with a
little more travel, and a lot less force.
A lot of people have asked about this keypad. It is a simple 3x4 matrix. All the debounce and decode is done in the PIC. As far as I know there are no "smart" commercial keypads or chips capable of handling chorded input.
|A fuzzy close-up. Note the low
|the Y connector to connect to the keyboard and mouse ports (The one pictured here is a commodity part, and is wired correctly, but has the incorrect gender on all ends.) You only need it if you want to get the mouse part working. Otherwise, just plug in using a standard PS/2 keyboard cable and off you go. Some laptops have their PS/2 port wired such that the Y splitter cable is not necessary. Since enough people have asked, this page shows graphicly how to connect this all together.|
|The circuit board layout. The board is about 1.5" by 2".
Lesson #1: look before you leap. I didn't make the connector holes
big enough. Note the ribbon cable in the next few pictures is
soldered directly to the board. Not what I originally had in mind.
Now I've got extra boards. Anyone want one? The Rev 1 (prototype 3, below)
fixes this, and places the board geometry such that I can solder it
directly to the keypad I found. Should make for a nice compact unit.
All the boards are made by Express PCB, an interesting outfit. You use their tools to lay out your board, then submit via the internet. They charge your credit card and ship you the boards. Not bad for low budget garage projects. If anyone sees anything cheaper out there, please let me know. Here are the ExpressPCB files (please note my copyright, above):
board Rev 0
board Rev 1
|close-ups of the populated rev 0 circuit board.|
|The completed second prototype. I like this keypad a bit better. The keys have some travel, and are easy to press. Now I just need something to mount the thing in. The keypad is digikey [MGR1533-ND] The biggest problem with it is size; It has a little too much extra plastic around the edge. I ordered the case for it, but it made the whole thing too bulky and difficult to work with.|
|The third prototype, using the Rev 1 board. The board is soldered directly to the keypad pins. The keypad and board are separated by a nonconducting foam pad. The silly ribbon cable is gone.|
|The back side of the third prototype. The board extends slightly beyond the edge of the keypad to accomodate the LEDs. I could have kept it in by drilling holes in the keypad, but I was concerned about getting the alignment right. I don't like the 'case' (or lack thereof), but it is otherwise functional and easy to work with.|
|The first four release quality prototype units (whatever that means). That's my workbench in the background.|
A chord is registered when one of the buttons is released.
Typematic action occurs when a chord is held without change for the
typematic delay period. I've got room in memory for something like 10
more chord mappings, and the non volatile memory I plan on adding should
hold one or two more.
This particular mapping only uses one and
two fingered chords for typing, and three fingered chords for
mouse movement. I use four fingered chords for the function keys.
CTRL, ALT, and SHIFT are "once sticky, twice toggle". (i.e., press
shift once, then the next character you type is shifted. press shift
twice in a row, and all characters are shifted until you press shift