I wanted to post the updated code I am now using for the robotic hand. This code works 100% better, it calibrates the signal for each finger for more precise movement.
#if defined(ARDUINO) && ARDUINO >= 100 #include "Arduino.h" #else #include "WProgram.h" #endif #include "EMGFilters.h" #include <Servo.h> #define TIMING_DEBUG 1 #define SensorPin A0 // input pin number EMGFilters myFilter; SAMPLE_FREQUENCY sampleRate = SAMPLE_FREQ_500HZ; NOTCH_FREQUENCY humFreq = NOTCH_FREQ_60HZ; Servo myservo1; Servo myservo2; Servo myservo3; Servo myservo4; Servo myservo5; static int Threshold = 50; const int stepsPer = 200; int envlope = 0; const int ledPin = 13; unsigned long timeStamp; unsigned long timeBudget; int sensorValue = 0; // the sensor value int fingerValue = 0; int a = 400; int b = 0; int x = 0; int y = 0; int calB = 0; int calR = 0; int calM = 0; int calI = 0; int calT = 0; float calMod = 1.1; //Add a 10% calibration modifier float calModMinus = 0.9; //Subtract 10% calibration Modifier void setup(){ myFilter.init(sampleRate, humFreq, true, true, true); Serial.begin(115200); timeStamp = micros(); myservo1.attach(2); myservo1.attach(3); myservo1.attach(4); myservo1.attach(5); myservo1.attach(6); b = 0; x = 0; Serial.println("Calibrate fingers in 2 seconds"); delay(1000); Serial.println("Calibrate Baby finger"); delay(250); digitalWrite(ledPin, HIGH); delay(250); digitalWrite(ledPin, LOW); delay(250); digitalWrite(ledPin, HIGH); delay(250); while (millis() < 15000) { //Calibrate Baby Finger timeStamp = micros(); int Value = analogRead(SensorPin); // filter processing int DataAfterFilter = myFilter.update(Value); int envlope = (sq(DataAfterFilter)); x = envlope; calB = calB + x; b = b + 1; } calB = calB / b; //Average Baby Finger Readings Serial.println(calB); //Show calibration Reading // digitalWrite(ledPin, LOW); delay(250); digitalWrite(ledPin, HIGH); delay(250); digitalWrite(ledPin, LOW); delay(250); Serial.println("Calibrate Ring finger"); delay(250); digitalWrite(ledPin, HIGH); delay(250); digitalWrite(ledPin, LOW); delay(250); digitalWrite(ledPin, HIGH); delay(250); b = 0; while (millis() < 15000) { //Calibrate Ring Finger timeStamp = micros(); int Value = analogRead(SensorPin); // filter processing int DataAfterFilter = myFilter.update(Value); int envlope = (sq(DataAfterFilter)); x = envlope; calR = calR + x; b = b + 1; } calR = calR / b; //Average Ring Finger Readings Serial.println(calR); //Show calibration Reading // digitalWrite(ledPin, LOW); delay(250); digitalWrite(ledPin, HIGH); delay(250); digitalWrite(ledPin, LOW); delay(250); Serial.println("Calibrate Middle finger"); delay(250); digitalWrite(ledPin, HIGH); delay(250); digitalWrite(ledPin, LOW); delay(250); digitalWrite(ledPin, HIGH); delay(250); b = 0; while (millis() < 15000) { //Calibrate Middle Finger timeStamp = micros(); int Value = analogRead(SensorPin); // filter processing int DataAfterFilter = myFilter.update(Value); int envlope = (sq(DataAfterFilter)); x = envlope; calM = calM + x; b = b + 1; } calM = calM / b; //Average Middle Finger Readings Serial.println(calM); //Show calibration Reading // digitalWrite(ledPin, LOW); delay(250); digitalWrite(ledPin, HIGH); delay(250); digitalWrite(ledPin, LOW); delay(250); Serial.println("Calibrate Index finger"); delay(250); digitalWrite(ledPin, HIGH); delay(250); digitalWrite(ledPin, LOW); delay(250); digitalWrite(ledPin, HIGH); delay(250); b = 0; while (millis() < 15000) { //Calibrate Index Finger timeStamp = micros(); int Value = analogRead(SensorPin); // filter processing int DataAfterFilter = myFilter.update(Value); int envlope = (sq(DataAfterFilter)); x = envlope; calI = calI + x; b = b + 1; } calI = calI / b; //Average Index Finger Readings Serial.println(calI); //Show calibration Reading // digitalWrite(ledPin, LOW); delay(250); digitalWrite(ledPin, HIGH); delay(250); digitalWrite(ledPin, LOW); delay(250); Serial.println("Calibrate Thumb finger"); delay(250); digitalWrite(ledPin, HIGH); delay(250); digitalWrite(ledPin, LOW); delay(250); digitalWrite(ledPin, HIGH); delay(250); b = 0; while (millis() < 15000) { //Calibrate Thumb timeStamp = micros(); int Value = analogRead(SensorPin); // filter processing int DataAfterFilter = myFilter.update(Value); int envlope = (sq(DataAfterFilter)); x = envlope; calT = calT + x; b = b + 1; } calT = calT / b; //Average Thumb Readings Serial.println(calT); //Show calibration Reading } void loop() { timeStamp = micros(); int Value = analogRead(SensorPin); // filter processing int DataAfterFilter = myFilter.update(Value); int envlope = (sq(DataAfterFilter)); if (calB > envlope * calModMinus && calB < envlope * calMod){ //Baby finger servo1(); //Goto function servo1 Serial.println("Small"); Serial.println(envlope); delay(100); } if (calR > envlope * calModMinus && calR < envlope * calMod){ //Ring Finger servo2(); //Goto function servo2 Serial.println("Ring"); Serial.println(envlope); delay(100); } if (calM > envlope * calModMinus && calM < envlope * calMod){ //Middle Finger servo3(); //Goto function servo3 Serial.println("Middle"); Serial.println(envlope); delay(100); } if (calI > envlope * calModMinus && calI < envlope * calMod){ //Index Finger servo4(); //Goto function servo4 Serial.println("Index"); Serial.println(envlope); delay(100); } if (calT > envlope * calModMinus && calT < envlope * calMod){ //Thumb servo5(); //Goto function servo5 Serial.println("Thumb"); Serial.println(envlope); delay(100); } delay(100); } void servo1(){ myservo1.attach(2); //Power to servo delay(15); //Short delay myservo1.write(180); //Turn servo 180° delay(1000); //Delay 1 second myservo1.write(0); //Return servo to 0° delay(1000); //Delay 1 second myservo1.detach(); //Power off to servo } void servo2(){ myservo2.attach(3); delay(15); myservo2.write(180); delay(1000); myservo2.write(0); delay(1000); myservo2.detach(); } void servo3(){ myservo3.attach(4); delay(15); myservo3.write(180); delay(1000); myservo3.write(0); delay(1000); myservo3.detach(); } void servo4(){ myservo4.attach(5); delay(15); myservo4.write(180); delay(1000); myservo4.write(0); delay(1000); myservo4.detach(); } void servo5(){ myservo5.attach(6); delay(15); myservo5.write(180); delay(1000); myservo5.write(0); delay(1000); myservo5.detach(); }
Thank you for following!!
Dale Winhold