Bluetooth Morse Code Keyboard

This project is intended to help provide better computer access for people who can't easily use common keyboards and mice. Similar commercial products use serial, USB and PS/2 ports and cost up to $450 or more, which seems like a rip off to me for such a simple device. By using Bluetooth allows this device to be paired with more than just a desktop computer. Devices like laptops, smartphones and tablets that support bluetooth HID profiles can also be used. Additionally there are no messy wires to tangle up, and the source code is publicly available. You could also use this with a smart phone to type or send text messages. It's not uncommon to for people that want to send text messages without looking at a keyboard, say while driving. There may also be some speed advantages compared to some keyboards, it's not uncommon for people to send code at 25-50 words per minute

Parts:
Arduino ProMini 328 3.3v (Sparkfun) - $18.95
WT12 UART Bluetooth Breakout Board by Jeff Rowberg (www.keyglove.net) - $40.00
FTDI Basic Breakout - 3.3V (Sparkfun) - $14.95 or equivalent
Breadboard
2x 10k ohm resistors
Piezo buzzer (optional provides audio feedback)
2x push buttons (optional if using external input device)
3.5mm jack for connecting external switches (say sip-puff interface)
Wire

Total cost: $73.90 + tax/sh + misc

Schematic:
image of mockup in fritzing

Fritzing file: Bluetooth Morse Code Keyboard.fzz
The schematic and board layout functions in Fritzing are horrible, which is why they look so bad in the Fritzing file.

Source code:
It's dirty code, and should be rewritten. But... it mostly works.
https://code.google.com/p/bluetooth-morsecode-keyboard-mouse/
I posted it as is just to get it out there. I'm hoping others with better programming and or CW skills will be interested in helping. The code is currently licensed under GNU GPLv3.


photo of actual breadboard



Function:
The Arduino detects and decodes the button presses and then sends the decoded keyboard key presses or mouse movement commands to the computer over Bluetooth using the BlueGiga WT12. One button is configured to send dits and the other dahs which is the basis for Iambic keying. The buttons can be replaced by plugging any switch device into the 3.5mm jack, for example a proper iambic paddles or a sip/puff switch, capacitive touch switches, etc.

Improvemts:
Layout and produce a circuit board so that all components are integrated in one very small package
Include capacitive touch interface (strap to back of smart phone?)
Add a menu system so various operating parameters can be adjusted (i.e. code speed)
Make it easier to customize the codes
Add Auto-space function to insert spaces after words
Add mouse movement commands/codes
Implement optional straight key mode (single switch)
Use batteries instead of USB for power
Improve code

Problems:
It may be difficult for disabled people to perform the initial pairing using the default device interfaces. for instance a regular mouse or touch screen.
Most touch screen devices like iPad and iPhone don't support the mouse interface so device usability is still hindered, additionally they don't have keyboard commands to perform interface navigation.

Additional comments:
The WT12 is a really great Bluetooth module, very very easy to use. You do have to sign up with Bluegigga to get documentation...
Creating a device (WT12) in Fritzing was kind of a pain, until I realized that Inkscape's default svg format isn't plain svg and Fritzing only handles plain svg. After this I edited the svg by hand and it worked fine.
I have tested this with an iPhone, it worked fine, however the UI doesn't have any keyboard shortcuts and has no mouse support, so you can't do much beyond typing. I've tried this with one newer Android phone (v2.2 I think), and it didn't work. Apparently they haven't added native Bluetooth HID support yet (2011.07.30).
The primary document for this project is iWRAP_HID_Application_Note.pdf. It details the HID profile, keyboard and mouse commands available, configuring and pairing the WT12, available HID commands, sending HID commands, etc.
The cost could be lowered by creating a custom circuit board, and reducing the part count. Additionally, just about any microprocessor could be used. I chose the Arduino because it's straight forward, well documented, and easy to use.
The FTDI breakout is only used for programming the device, after the Arduino is programmed it can run off another power source.
Some of you might also want to look into lowering the cost of sip-puff switches. A cursory search shows they run in the $400+ range! Which seems absolutely insane to me. Sounds like a great project for a 3D printer. Note, Jim Lublin suggests using dental Saliva Ejectors for low cost "puff tubes" 100 for $3.89 (bottom of this page).
There are tons of other ways to implement a Morse code keyboard/mouse, say a keyer + sound card + software, or an Arduino running V-USB's HID profile, etc.

Credits/References:
BenB's USB Morse keyboard for decoding table, I never could get his project to work on an Arduino, but some of the code ended up being useful.
Jim Lublin's page http://www.makoa.org/jlubin/morsecode.htm for modified morse code. Standard morse code isn't meant to replace a keyboard so commands that are used often are shortened to make it easier to use.

These are codes from Jim's website, only a handful have been implemented at this point.
keyboard morse code
keyboard morse code
keyboard morse code
keyboard morse code

Above codes in text format

Compare this to standard Morse code

Updates:
2011.07.03 - Initial post
2011.08.09 - Updated to clarify a few sections based on questions I received, and add some more information/comments.