Search models, users, collections, and posts

6th Finger Prosthetic V2- POWERED

Print Profile(1)

All
A1 mini
P1S
X1
A1
P1P
H2D
X1E
X1 Carbon
H2D Pro
H2S
P2S
H2C
X2D
A2L

0.2mm layer, 2 walls, 15% infill
0.2mm layer, 2 walls, 15% infill
Designer
1.6 h
1 plate
3.0(1)

Open in Bambu Studio
Boost
84
138
7
2
77
27
Released 

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)

HUION Artist Glove

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)

(0/1000)