This is my first post on Treehouse Projects, and I hope it will be the beginning of a lot more to come in the future.
Prosthetic body parts have always intrigued me. The research I have witnessed and read about in the field has always inspired me to try and find solutions to assist people with disabilities. By no means is this project an innovative step in that direction, but it is a first for me, and I hope future versions will be much more practical and potentially useful from a functional and economical standpoint.
This project is simply a system of two servos controlled via an accelerometer, meant to imitate the hand gestures of the individual holding the device. It gives the “hand” two degrees of freedom. The entire system is controlled by a microcontroller (Arduino clone).
For the general hobbyist, most of these parts would be readily available. The key components I used were:
- Microcontroller (any will do really, you’ll need at least 4 IO pins, 2 being analog if your accelerometer requires them like mine do; I used an Arduino clone, find my code below)
- Servos (you’ll need 2; I use the HXT900 as I have them lying around when I build planes)
- Accelerometer (I chose the MMA7361 because it was cheap, and analog is always easier to work with; other alternatives like the ADXL345 are great too)
- Solderless breadboard or PCB (I chose solderless because I will reuse the parts)
- Wood (I used 6mm ply; you can experiment with different materials, doesn’t matter much)
This project took me about six hours to complete. It shouldn’t have taken that long, but I am a beginner when it comes to 3D modeling and woodworking. An unexpected twist in the software also caused delays.
The total cost came out to be approximately $15 (excluding the microcontroller).
Sketches & Images
These are pictures of the model I drew in Sketchup, as well as what they physically resulted in:
I used my 3D sketches to measure and cut the wood. I used a scroll saw on a board of 6mm ply, and put the parts together.
Connecting the components was quite simple. For the MMA7361 accelerometer, I had it on default sensitivity settings, and only used the XY analog outputs. I wasn’t expecting my model to fall off the desk, so I didn’t need the Z output (although it would be funny if I did use it, and programmed the hand to break the fall!). Do note that I also utilized the SL (sleep pin) on 3.3V. The servos were connected to the 5V rail, and connected to the digital pins of the microcontroller.
Note: It was fine controlling one servo via a laptop’s USB connection with the microcontroller, but take caution to always connect it to an external power source for anything more. In retrospect, it’s a lesson learned for me, and I will make doubly sure to always use an external power source going forward. USB ports typically don’t provide more than 500ma anyways.
Other problems came in when I connected my servos and accelerometer all together to the microcontroller. Alone, the accelerometer gave very accurate and stable results. I viewed these results over the serial print display at a baud rate of 9600. However, once I connected the servos, some sort of disturbance or interference which I’m still trying to triangulate caused the accelerometer to randomly produce spikes and/or dips in its readings, even when sitting perfectly still on my desk. I was forced to jury rig a simple algorithm to smooth out these jittery movements.
See my code for more details, but what I essentially did was wait for an anomaly to occur, and if it did not occur for more than 2 readings, then ignore the readout and use a previously stored value. This algorithm ended up creating a few variables to toy with in order to find an ‘optimal’ combination to minimize jitter. The reason it checks for 2 readings is because the anomaly could genuinely be someone moving the accelerometer – as you can imagine, this also causes a very slight, albeit noticeable, delay in responsiveness. If anyone can suggest a potential cause for the atypical readouts when I connect the servos, I would appreciate it.
What went wrong? Well, a lot of things actually. Foremost was the jittery movement of the servos, which was partly solved by the code to smooth the movement. Second was the size of the housing of the servos: it was too small. I misjudged it significantly, but ended up using a child’s glove to work equally well (see video). Third, the inability to mount the accelerometer on my hand – it was a little too big, and I didn’t want to solder it all up.
What would improve it? I was actually aiming to ‘wear’ the accelerometer, so next time I might try a cheaper surface mount version of it on a custom PCB. This was a really rough first prototype, so I’m still relatively satisfied. Next, servos are simply too inaccurate. I would like sub-degree accuracy, and will definitely strive to utilize stepper motors (I have 2 small ones with driver boards on the way now).
Next steps? Improve accuracy and stability, gradually add more degrees of freedom eventually leading up to a full arm sometime in the future, and add the simple ability to grasp objects. My initial idea was to make a small robotic hand which could be programmed by copying the motion of a human arm, and complete tasks which one would find monotonous after ‘seeing’ the user perform it once.
Thank you to the authors of the following pages I referenced to help me build this project:
- Sebarduino for tips on how to operate the MMA7361 – written in French, but easy enough to read it if it’s your … um … third language