🦾 Bionic EMG Hand
Control a 3D-printed robotic hand with your muscle signals.
Overview
Electromyography (EMG) sensors detect the tiny electrical impulses generated by muscle contractions. By placing an EMG sensor on your forearm, you can trigger a robotic hand to mimic your flexes.
What you'll learn: Bio-signal amplification and filtering, threshold detection, and multi-servo string tendon actuation.
Estimated time: 12+ hours. Difficulty: ⭐⭐⭐⭐⭐ Expert.
Components Needed
| Component | Specification | Qty | Notes |
|---|---|---|---|
| Arduino Nano | 5V | 1 | |
| MyoWare Muscle Sensor | EMG | 1 | With biomedical pads |
| Micro Servos | SG90 | 5 | One for each finger |
| InMoov Hand / 3D Print | Tendon driven | 1 | Open-source design |
| Braided Fishing Line | Tendon material | 1 | Non-stretching |
Step-by-Step Tutorial
1
Print & Assemble
Print the finger segments and palm. Route fishing line from the fingertips, through the knuckles, to the servo horns.
2
Electrode Placement
Place the Mid and End electrodes on the belly of your forearm muscle, and the Reference electrode on a bony area (like your elbow).
3
Signal Smoothing
The raw EMG signal is very noisy. The MyoWare board rectifies and integrates it, but you should still use a moving average filter in software.
4
Actuation
When the smoothed analog reading crosses a certain threshold (muscle flexed), command all 5 servos to curl the fingers inwards.
Medical electrodes dry out after a few hours of use, drastically reducing signal quality. Always use fresh, sticky electrodes for the best results.
Code / Configuration
emg_hand.ino
INO
// EMG Bionic Hand (Snippet)
#include <Servo.h>
Servo thumb, index, middle, ring, pinky;
const int emgPin = A0;
const int threshold = 500; // Calibrate this to your muscle
bool isGrasping = false;
void setup() {
thumb.attach(2); index.attach(3);
middle.attach(4); ring.attach(5); pinky.attach(6);
openHand();
}
void loop() {
int emgVal = getSmoothedEMG(emgPin);
if (emgVal > threshold && !isGrasping) {
closeHand();
isGrasping = true;
}
else if (emgVal < (threshold - 100) && isGrasping) {
// Minus 100 provides hysteresis so it doesn't flutter
openHand();
isGrasping = false;Reviews & Ratings
—0 reviews
Sign in to leave a review
Loading reviews...