6th Finger Prosthetic V2- POWERED
Print Profile(1)

Description
Uses micro servo, bend sensor, and Arduino Nano to power the ligament for the finger.
EXTERNAL PARTS USED:
Arduino Nano
MG90S Micro Servo
SpectraFlex Flex Sensor by Spectra Symbol (55mm)
Fishing Line (Braided 60lb)
10K Resistor
M3 Hardware
Wiring diagram (connect GND to GND on Nano and VIN to 5v on Nano):

Credit:
Ligament assembled using trimmed servo horn (to just have the part that slides on the servo), and glued servo spool around it (pulley item).
Hot glue sensor into the inside of the glove to track the bend of your pinky.
QUESTIONS? Please DM. Next update will use custom PCB to help the lack of power to the servo and increase system stability (OPEN TO COLLABORATIONS FOR THAT).
Arduino CODE (includes 3 second calibration times for extended and retraction):
#include <Servo.h>
Servo myServo;
const int flexsensor = A0;
const int servoPin = 11;
float emaValue = 0;
const float alpha = 0.15; // Smoothing
int sensorMin = 0;
int sensorMax = 1023;
const unsigned long sampleDuration = 3000; // 3 seconds
// === Nonlinear mapping ===
float nonlinearMap(float x) {
float normalized = constrain((x - sensorMin) / float(sensorMax - sensorMin), 0.0, 1.0);
float curved = pow(normalized, 1.5); // Exponential response
return curved * 180.0;
}
void setup() {
Serial.begin(9600);
myServo.attach(servoPin);
// === CALIBRATION STEP 1 ===
Serial.println("Calibration: Straighten your finger...");
myServo.write(0); // Move to open position
delay(3000); // Give user time
sensorMin = averageSensor(sampleDuration);
Serial.print("Sensor MIN: "); Serial.println(sensorMin);
// === CALIBRATION STEP 2 ===
Serial.println("Now curl your finger fully...");
myServo.write(180); // Move to closed position
delay(3000); // Give user time
sensorMax = averageSensor(sampleDuration);
Serial.print("Sensor MAX: "); Serial.println(sensorMax);
emaValue = analogRead(flexsensor); // Initialize EMA
}
void loop() {
int rawValue = analogRead(flexsensor);
emaValue = alpha * rawValue + (1 - alpha) * emaValue;
float servoAngle = nonlinearMap(emaValue);
servoAngle = constrain(servoAngle, 0, 180);
myServo.write((int)servoAngle);
// Debug output
Serial.print("Raw: "); Serial.print(rawValue);
Serial.print(" | EMA: "); Serial.print((int)emaValue);
Serial.print(" | Servo: "); Serial.println((int)servoAngle);
delay(10);
}
// === Helper: Sensor Averaging ===
int averageSensor(unsigned long duration) {
unsigned long start = millis();
long sum = 0;
int count = 0;
while (millis() - start < duration) {
int val = analogRead(flexsensor);
sum += val;
count++;
delay(10);
}
return sum / count;
}




Comment & Rating (7)