
Bionic Arm Control Using Flex Sensors
A low-cost, gesture-driven 3D-printed prosthetic hand. A sensor glove maps human finger flexion straight to servo actuation — read, map, actuate, at 10 Hz as originally built.
Wearable input, tendon-driven output.
Each finger of a wearable glove is instrumented with a flex sensor whose resistance rises as the finger bends. An Arduino digitises the five analog channels, maps each to a 0–180° servo command, and drives five SG90 servos in a 3D-printed hand.
Nylon tendon lines transfer servo rotation to the fingertips, replicating the operator's gesture in real time.
Motivation — commercial bionic hands are expensive; this targets an affordable, manufacturable alternative for hazardous-environment teleoperation.
Signal flow.
Five fully independent channels — one flex sensor drives exactly one servo, giving per-finger control with no cross-coupling.
Modelled in Fusion 360.
The arm was modelled as a full forearm, a ball-joint wrist, and an articulated five-finger hand with internal tendon routing. Parts were printed individually and assembled.
Wire it, map it, write it.

Flex sensors wire into the Arduino's analog inputs as voltage dividers; the five servos take digital I/O.
The firmware is intentionally minimal and deterministic — read, map, constrain, write, at ~10 Hz.
#include <Servo.h>
Servo servo_1, servo_2, servo_3, servo_4, servo_5;
int flex_1=A0, flex_2=A1, flex_3=A2, flex_4=A3, flex_5=A4;
void setup(){
servo_1.attach(0); servo_2.attach(1); servo_3.attach(2);
servo_5.attach(3); servo_4.attach(4);
}
void loop(){
int p;
p = constrain(map(analogRead(flex_1),800,900,0,180),0,180); servo_1.write(p);
p = constrain(map(analogRead(flex_2),800,900,0,180),0,180); servo_2.write(p);
p = constrain(map(analogRead(flex_3),800,900,0,180),0,180); servo_3.write(p);
p = constrain(map(analogRead(flex_5),800,900,0,180),0,180); servo_5.write(p);
p = constrain(map(analogRead(flex_4),800,900,0,180),0,180); servo_4.write(p);
delay(100);
}map(800,900→0,180) linearises each sensor's usable resistance band; constrain() clamps to the servo's mechanical limits. This sketch also has two real defects: servos share the D0/D1 UART pins, and the same narrow 800–900 window is hardcoded across all five channels. A later firmware rewrite moves the servos to D3/D5/D6/D9/D10, adds per-finger calibration and smoothing, and targets ~50 Hz — not yet run on the physical hardware.
Bill of materials.
- · 5V logic · 7–12V in
- · 54 digital I/O (15 PWM)
- · 16 analog in · 16 MHz
- · 256 KB flash
- · 4.8–6V · 1.8–2.5 kg·cm torque
- · 0.1 s / 60° · 0°–180°
- · plastic gear · 9 g
- · ~25 kΩ flat → ~100 kΩ bent
- · voltage divider → ADC
- · as-built band ≈ 800–900 raw
- · mapped to 0–180°
- · SG90 ×5: ~100–250 mA moving
- · ~700 mA stalled, each
- · as-specced LiFePO4+9V combo undervolted — corrected
- · high tensile strength
- · warps without an enclosure
- · nozzle 230–260 °C
- · bed 80–130 °C
- · C / C++
- · Servo.h library
- · ~10 Hz control loop
Print, assemble, tendon-drive.
Fingers printed as three ABS segments — proximal, middle, distal — on an FDM printer.
Segments superglued into articulating digits; palm and forearm printed and joined.
Nylon lines tie each servo horn to a fingertip; rotation pulls the tendon and flexes the finger.
Live gesture reproduction.

The hand reproduces per-finger flexion from the glove in real time.
Limitations & future work.
- —Current build implements 5 flex→servo channels only; wrist/elbow DOF and an accelerometer are designed but not yet integrated.
- —Open-loop control — no force or position feedback from the hand.
- —As-built calibration is one hardcoded 800–900 window shared by all five channels — narrow, glove-specific, and a documented source of jitter.
- +EMG (muscle-impulse) control in place of flex.
- +Haptic feedback to the glove.
- +Added wrist and elbow DOF via accelerometer fusion.
- +Closed-loop tactile / force sensing at the fingertips.
- +Wireless glove-to-hand link (nRF24L01) to physically separate operator from the hand — the actual requirement for the hazardous-environment use case.