
Project Overview
The primary objective of the Flex Hand project was to construct an interactive robotic hand capable of replicating human finger articulation in real time.
By instrumenting a glove with resistive flex sensors, the system captures natural finger bending gestures. An Arduino microcontroller processes these analog sensor signals, applies calibrated angle mapping, and commands dedicated servo motors to pull tendon strings connected to each wooden finger joint.
This project provided a hands-on exploration of the complete Sense → Process → Act paradigm, bringing together mechanical linkages, analog signal conditioning, embedded programming, and multi-actuator power management.
Hardware Components
The complete physical prototype was assembled on a testing bench using standard prototyping modules and a jointed wooden model hand:
| Component | Quantity | Function in System |
|---|---|---|
| Arduino MKR WiFi 1010 | 1 | Microcontroller board reading analog sensor inputs, executing mapping algorithms, and generating servo control signals. |
| Spectra Symbol Flex Sensors | 4 | Variable resistance sensors mounted along glove fingers to measure bending. |
| Servo Motors | 4 | Small rotary actuators (Grove Analog & DMS-MG90 servos) driving mechanical tendon lines. |
| Wooden Robotic Hand | 1 | Articulated wooden model hand providing anatomical joints and finger guides. |
| Fixed Resistors | 4 | Form voltage divider circuits to translate sensor resistance shifts into measurable voltage levels. |
| External 5V Power Supply | 1 | Regulated DC bench power supply dedicated to delivering sufficient driving current for the servos. |
| Breadboard & Jumper Wires | — | Prototyping bus for power rails, sensor dividers, and signal routing. |

How It Works
The system operates continuously in a real-time feedback loop. The control progression flows from human finger displacement to mechanical actuation:
[ Human Finger Movement ]
│
▼
[ Flex Sensor Bending ]
│
▼
[ Resistance & Voltage Changes ]
│
▼
[ Arduino Analog Input (A0–A3) ]
│
▼
[ Sensor Calibration & Angle Mapping ]
│
▼
[ Servo Motor Rotation (0°–180°) ]
│
▼
[ Robotic Finger Articulation ]
- Sense: As the user bends a finger, the conductive material within the corresponding flex sensor stretches, causing its electrical resistance to rise.
- Process: The Arduino reads the changing voltage at its analog input pins via an onboard Analog-to-Digital Converter (ADC). The raw reading is evaluated against stored calibration thresholds and mapped to an angular target between $0^\circ$ and $180^\circ$.
- Act: The calculated angle is transmitted as a PWM pulse train to the servo motor. As the servo horn rotates, it pulls on the tendon line routed through the finger segments, curling the wooden finger.
Electrical Connections & Circuit Design
Connecting analog resistive sensors alongside electromechanical motors requires careful circuit partitioning.
+3.3V (Arduino)
│
▼
┌──────────────┐
│ Flex Sensor │ (Variable Resistor)
└──────┬───────┘
├─────────────────────────► Analog Input (A0 - A3)
┌──────┴───────┐
│ Fixed Resistor│ (Pull-down / Voltage Divider)
└──────┬───────┘
│
GND (Common Ground)
External +5V Power Supply ────────► Servo Motors VCC (+5V)
External Power Supply GND ──┬─────► Servo Motors GND
│
Arduino GND ────────────────┴─────► Common Ground Reference
Arduino Digital Pins (4–7) ───────► Servo Signal Lines (PWM)
1. Flex Sensors as Variable Resistors
A flex sensor contains conductive carbon ink deposited on a flexible plastic substrate. When straight, the conductive particles remain tightly packed, maintaining a nominal base resistance. As the sensor bends, the conductive particles separate, increasing the total resistance:
- Straight position: Lower resistance ($\approx 200$ typical ADC reading in initial testing)
- Bent position: Higher resistance ($\approx 400$–$680$ ADC reading depending on divider values)
2. The Necessity of Voltage Dividers
Microcontroller ADC pins measure voltage, not raw resistance. A fixed resistor is connected in series with each flex sensor between the Arduino’s $3.3\text{V}$ rail and ground. The resulting voltage at the intermediate node varies predictably:
$$V_{out} = V_{in} \cdot \frac{R_{fixed}}{R_{flex} + R_{fixed}}$$
This varying voltage is delivered to analog inputs A0 through A3.
3. External Power for Servo Motors
The four servo motors cannot be powered directly from the Arduino board’s $5\text{V}$ or $3.3\text{V}$ regulator pins. When multiple motors rotate or experience mechanical resistance simultaneously, their combined stall current exceeds the safe output limit of the board, causing microcontroller resets, erratic motor twitches, and brownouts. A dedicated external $5\text{V} / 1\text{A}$ power supply powers the servos independently.
4. The Common Ground Rule
The external servo power supply and the Arduino board must share a common ground (GND) connection. Voltage is a relative potential difference; without a shared ground reference between the Arduino and the servo driver boards, the digital control pulses sent on pins 4–7 have no return path and cannot be interpreted reliably by the servo electronics.

Arduino Programming
The firmware running on the Arduino MKR WiFi 1010 follows a modular structure leveraging the standard Servo library:
1. Analog Input Acquisition (analogRead())
The program samples the sensor voltage on pins A0 to A3:
int val1 = analogRead(flexPin1);
2. Empirical Sensor Calibration
Because manufacturing tolerances and physical glove mounting introduce variations between sensors, each channel uses individually measured calibration constants:
const int S1_STRAIGHT = 320; // Reading when finger is completely relaxed
const int S1_BENT = 680; // Reading when finger is fully flexed
3. Range Mapping (map())
The map() function linearly scales the raw sensor input from its calibrated boundaries to the valid angular range of the servo motor ($0^\circ$ to $180^\circ$):
int angle1 = map(val1, S1_STRAIGHT, S1_BENT, 0, 180);
4. Safe Boundary Constraining (constrain())
To ensure sensor fluctuations do not command servos beyond their physical stops, constrain() clamps values safely:
angle1 = constrain(angle1, 0, 180);
5. Servo Command & Telemetry Output
The mapped angle is dispatched to the servo, and diagnostic values are logged over serial:
servo1.write(angle1);
Serial.print("S1: "); Serial.print(val1);
Serial.print(" -> "); Serial.println(angle1);
delay(20); // Short delay to stabilize motion loop

Testing & Troubleshooting
System testing was executed systematically in four successive stages:
- Individual Flex Sensor Verification: Each sensor was flexed independently while monitoring values on the Arduino Serial Monitor to verify electrical continuity and monotonic response.
- Individual Calibration: Minimum (straight) and maximum (bent) limits were recorded for each finger and hardcoded into the calibration definitions.
- Isolated Servo Testing: Each servo was tested without tendon loads to confirm sweep range and horn zeroing.
- Complete System Integration: All four fingers were operated concurrently while observing mechanical tracking.
Primary Engineering Hurdle: Insufficient Power
- Problem Encountered: During initial integration with servos powered from the Arduino $5\text{V}$ rail, the servos behaved erratically—stuttering, losing torque, or failing to bend under tendon tension.
- Root Cause: Inrush currents from four simultaneous inductive motors caused severe voltage sag on the board’s power rail.
- Solution Implemented: Added an external $5\text{V} / 1\text{A}$ power supply dedicated exclusively to the servo power bus, with the ground tied directly to the Arduino’s ground pin.
- Outcome: Servo movement immediately stabilized, enabling smooth, repeatable mechanical action.
Results & Demonstrated Performance

Confirmed Results
- Independent 4-Channel Control: Four flex sensors successfully controlled four independent servo motors without electrical crosstalk.
- One-to-One Teleoperation: The wooden robotic hand reliably reproduced corresponding human finger bending motions.
- Accurate Angle Scaling: The calibration-and-mapping firmware converted variable analog inputs into proportional tendon pulls.
Known Limitations
- Second Finger Deflection Discrepancy: During testing, the second robotic finger did not achieve the full intended bending angle exhibited by the other three digits.
- Suspected Causes Discussed:
- Mechanical friction along the tendon routing line through the wooden knuckles.
- String tension slack on that specific servo horn.
- Narrower software angular limits set during calibration testing.
- Status: This mechanical constraint was documented as an identified area for refinement in future hardware revisions rather than an unexpected software failure.
Engineering Lessons Learned
- Isolating Actuator Power: Never power electromechanical actuators directly from logic power rails. Always isolate motor power domains while maintaining a common ground.
- Sensor Calibration is Mandatory: Off-the-shelf analog sensors have baseline offsets and variable sensitivities. Per-channel calibration routines are essential for accurate mapping.
- Mechanical Tensioning Dictates Performance: In cable-driven robotic systems, mechanical factors (string elasticity, friction, routing friction) directly govern whether electrical actuation translates into clean joint motion.
- Diagnostic Serial Telemetry: Real-time serial logging provides immediate insight into whether a glitch originates in sensor hardware, mapping mathematics, or mechanical resistance.
Project Team
This project was developed collaboratively as an undergraduate robotics engineering laboratory project at Metropolia University of Applied Sciences (in partnership with the U!REKA European University network).
- Team Members: Alisa Atlasova, Gian Andrea Dho, Wei Wang (Vivi)
- Course Focus: Embedded Sensors, Microcontrollers & Actuation Systems