Back to Expert Projects

🦾 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

ComponentSpecificationQtyNotes
Arduino Nano5V1
MyoWare Muscle SensorEMG1With biomedical pads
Micro ServosSG905One for each finger
InMoov Hand / 3D PrintTendon driven1Open-source design
Braided Fishing LineTendon material1Non-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
5★
0
4★
0
3★
0
2★
0
1★
0
...

Loading reviews...