3D model · Printables

6th Finger Prosthetic V2- POWERED

Model details

Platform
Printables
Price
Free
License
CC-BY-NC-SA
Non-commercial use only, with credit; share remixes under the same license.
Formats
3MFSTL
  • 14 Likes
  • 40 Downloads
  • 0 Makes
  • 2 Comments
  • 920 Views

Author:Big Guy Enterprises

Published

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; }

Tags

Comments

Loading comments…
More like this

Similar models

Names are used only to indicate the source of a result. Polyzon is not affiliated with the listed sites.