The Cerebral Palsy Project
David onstage at Ignite Seattle 9
“I challenge a team of you to design a computing device that enables people with mild to moderate cerebral palsy to contribute to society in meaningful and productive ways.”—email from Shivum Agarwal, November, 2009
Cerebral palsy (CP) is a congenital (present at birth) neuromuscular disorder. The disorder affects approximately 0.5% of children born worldwide, with little variation in frequency over the child's birth nation, or mother's lifestyle. 80-90% of CP cases are spastic, characterized by higher-than-usual muscle rigidity, i.e., the inability to relax a contracted muscle. Symptoms vary: some cases affect only (arms and legs), while others affect just the legs, or occasionally, just the patient's two arms. CP patients are likely to encounter difficulty in the performance of tasks requiring fine motor control, such as typing, or operating small switches. [1]
Our Solution
Our requirement analysis yielded the following results:
- The effects of cerebral palsy vary greatly across cases. Reconfigurability was necessary to ensure our solution's usefulness to the greatest possible population of users.
- Cost was a primary concern; the challenge was sponsored by the Spastics Centre Kanpur, an Indian organization founded for the benefit of those who suffer from spastic disorders.
- Ease of setup. Our solution's users would not have access to IT support personnel.
We adapted Objective Development's HIDKeys to run on an Atmel ATMega88, and fabricated a custom through-hole PCB using Eagle and BatchPCB.
Making It
Making the board requires doing the following five things:
- Purchase a board from BatchPCB.
- Order the components from Digikey.
- Assemble the device.
- Program the ATMega88.
- Connect the switches.
Step 1: Purchase the board.

To keep cost down, we sell the design through BatchPCB, a short-run board house operated by SparkFun.
Step 2: Order the components.
Order the following parts from Digikey (quantities are for one device):
| Part | Digikey Part Number | Quantity |
|---|---|---|
| 12 MHz oscillator | X1100-ND | 1 |
| 27 pF oscillator cap | 1430PH-ND | 2 |
| Power supply cap | P966-ND | 1 |
| USB diode | 1N4148TACT-ND | 2 |
| 68 ohm resistor | P68BACT-ND | 2 |
| 1.5k resistor | P1.5KBACT-ND | 1 |
| ATMega88PA | ATMEGA88PA-PU-ND | 1 |
| USB receptacle | ED90064-ND | 1 |
| Terminal block | A98338-ND | 3 |
| ICSP header | 609-3334-ND | 1 |
Additionally, the project requires switches for connection to the user's body. These switches must be ordered separately, in addition to the parts listed in the table.
Step 3: Assemble the device.

Insert the components into the board and solder them, taking note of the following:
- All components are mounted on the top (labeled) side of the board.
- The positive lead on the (electrolytic) power supply capacitor should be soldered to the pad marked with a small “+” symbol on the board's silkscreen. The negative capacitor lead is shorter than the positive, and marked with a “-” sign on the side of the capacitor.
- The two 68 ohm resistors should be soldered side-by-side near the bottom of the board; the 1.5k resistor should be placed near the top of the board.
- The two diodes are polarized—the black band on the device will match the white band on the board's silkscreen.
- The terminal block on the left side of the board is a common ground block; the other two are connected to individual microcontroller pins. The three terminal blocks can be soldered in any configuration.
Step 4: Program the device.
Programming the device requires avrdude and a working copy of GNU Make.
First, download the modified HIDKeys sources, either as a tarball from this site, or from the project's repository on Github.
Next, connect an AVR programmer to the board using the six-pin header located at the board's top left corner. We used a USBtinyISP. Be sure to line up pin 1 on the programmer's six-pin header (denoted by a red stripe on the ribbon cable) with the small “1” printed on the board.
Program the fuses and flash memory with the command “make fuse && make flash”. The “fuse” and “flash” targets in the Makefile are configured for a USBtinyISP; using a different programmer will require revising the Makefile.
Step 5: Connect the switches.
Connect the switches to the board using the three terminal blocks. The left terminal block is a common ground for all switches; the top and bottom terminal blocks connect to the microcontroller to produce the following letters:
| Letter | Terminal Block/Pin | AVR Pin |
|---|---|---|
| A | Top/1 | PB0 |
| B | Top/2 | PB1 |
| C | Top/3 | PB2 |
| D | Top/4 | PB3 |
| E | Top/5 | PB4 |
| F | Top/6 | PB5 |
| G | Top/7 | PC0 |
| H | Top/8 | PC1 |
| I | Bottom/1 | PC2 |
| J | Bottom/2 | PC3 |
| K | Bottom/3 | PC4 |
| L | Bottom/4 | PC5 |
| M | No connection | PD3 |
| N | Bottom/5 | PD4 |
| O | Bottom/6 | PD5 |
| P | Bottom/7 | PD6 |
| Q | Bottom/8 | PD7 |
Notes
[1] Miller, F., and Bachrach, Steven J. Cerebral Palsy: A Complete Guide for Caregiving (A Johns Hopkins Health Book). Amazon