======== Prothese de main arduino ======== [[https://wikifab.org/wiki/Proth%C3%A8se_de_main_command%C3%A9e_par_des_capteurs_musculaires#Fichiers|Prothese main arduino 001]] [[https://www.gotronic.fr/art-capteur-pour-muscle-myoware-27378.htm|Capteur pour muscle Myoware]] [[https://www.gotronic.fr/art-pads-a-electrodes-sen-12969-26244.htm|Electrodes pour muscle ]] ==== Main Robotisée HackBerry ==== {{ :start:arduino:main001.jpg?direct&600 |}} [[https://e-nable.fr/fr/fabrications/projet-robotique/la-main-hackberry/|Fabrication collaborative Main-robotisée site e-nable]] [[https://drive.google.com/drive/folders/1PkoY7QRCFFofEhJ_Oy8mezCnoT-idXC4|Doc Main robotisée]] [[https://github.com/mission-arm/HACKberry/tree/master/HACKberry_program|Programme main robotisée HackBerry GitHub]] [[https://wikifab.org/wiki/Proth%C3%A8se_de_main_command%C3%A9e_par_des_capteurs_musculaires#%C3%89tape_32_-_T%C3%A9l%C3%A9verser_le_code_Arduino_dans_la_main|Prothese main robot Arduino]] [[https://wikilab.myhumankit.org/index.php?title=Projets:Bionicohand#R.C3.A9f.C3.A9rences.2F_Sources|Bionicohan FR]] ==== Capteurs EMG ==== [[http://fr.mfgrobots.com/mfg/it/1002029866.html| Capteurs EMG c'est Quoi ? FR ]] [[https://fr.aliexpress.com/w/wholesale-capteur-emg-arduino.html|EMG sur Alliexpress]] [[https://wikilab.myhumankit.org/images/a/a6/DIY_-_Faites_le_vous-m%C2%88me-_Capteur_EMG.pdf|DIY_-_Faites_le_vous-même-_Capteur_EMG.pdf]] [[https://youtu.be/J7_LEoYuqww|video capteur EMG EN]] [[start:arduino:emg|test capteurs EMG]] === Programme HackBerry.ino version V1.0 MK2 === /* * Arduino micro code for HACKberry Mk2. * Origially created by exiii Inc. * edited by Kouki Shinjo on 2018/04/26 */ #include //Settings const boolean isRight = 0;//right:1, left:0 const int outThumbMax = 95;//right:open, left:close const int outIndexMax = 100;//right:open, left:close const int outOtherMax = 75;//right:open, left:close const int outThumbMin = 10;//right:close, left:open const int outIndexMin = 0;//right:close, left:open const int outOtherMin = 20;//right:close, left:open const int speedMax = 6; const int speedMin = 0; const int speedReverse = -3; const int thSpeedReverse = 15;//0-100 const int thSpeedZero = 30;//0-100 const boolean onSerial = 0; // 1 is not recommended //Pin int pinButtonCalib; //start calibration int pinButtonTBD; // No function implemented yet. int pinButtonThumb; // open/close thumb int pinButtonOther; //lock/unlock other three fingers int pinServoIndex; int pinServoOther; int pinServoThumb; int pinSensor; //sensor input //Hardware Servo servoIndex; //index finger Servo servoOther; //other three fingers Servo servoThumb; //thumb //Software boolean isThumbOpen = 1; boolean isOtherLock = 0; int swCount0,swCount1,swCount2,swCount3 = 0; int sensorValue = 0; // value read from the sensor int sensorMax = 700; int sensorMin = 0; int speed = 0; int position = 0; const int positionMax = 100; const int positionMin = 0; int prePosition = 0; int outThumb,outIndex,outOther = 90; int outThumbOpen,outThumbClose,outIndexOpen,outIndexClose,outOtherOpen,outOtherClose; void setup() { if (onSerial) Serial.begin(9600); // Pin Configuration pinButtonCalib = A6;// A4 sur Arduino Uno pour test Calibration pinButtonTBD = A7;// A5 sur Arduino Uno pour test pinButtonThumb = A0;// Verrouillage pouce pinButtonOther = 10;// Verouillage 3 doigts pinServoIndex = 5;// Servo pour l'index pinServoOther = 6;// Servo pour 3 doigts pinServoThumb = 9;// Servo pour le pouce pinSensor = A1; // Capteur de pression if(isRight){ outThumbOpen=outThumbMax; outThumbClose=outThumbMin; outIndexOpen=outIndexMax; outIndexClose=outIndexMin; outOtherOpen=outOtherMax; outOtherClose=outOtherMin; } else { outThumbOpen=outThumbMin; outThumbClose=outThumbMax; outIndexOpen=outIndexMin; outIndexClose=outIndexMax; outOtherOpen=outOtherMin; outOtherClose=outOtherMax; } servoIndex.attach(pinServoIndex);//index servoOther.attach(pinServoOther);//other servoThumb.attach(pinServoThumb);//thumb pinMode(pinButtonCalib, INPUT_PULLUP); pinMode(pinButtonTBD, INPUT_PULLUP); pinMode(pinButtonThumb, INPUT_PULLUP); pinMode(pinButtonOther, INPUT_PULLUP); } void loop() { //==waiting for calibration== if(onSerial) Serial.println("======Waiting for Calibration======"); while (1) { servoIndex.write(outIndexOpen); servoOther.write(outOtherOpen); servoThumb.write(outThumbOpen); if(onSerial) serialMonitor(); delay(10); if (readButton(pinButtonCalib) == LOW) { calibration(); break; } } //==control== position = positionMin; prePosition = positionMin; while (1) { if (readButton(pinButtonCalib) == LOW) swCount0 += 1; else swCount0 = 0; if (swCount0 == 10) { swCount0 = 0; calibration(); } if (readButton(pinButtonTBD) == LOW) swCount1 += 1; else swCount1 = 0; if (swCount1 == 10) { swCount1 = 0; // Do something here while (readButton(pinButtonTBD) == LOW) delay(1); } if (readButton(pinButtonThumb) == LOW) swCount2 += 1; else swCount2 = 0; if (swCount2 == 10) { swCount2 = 0; isThumbOpen = !isThumbOpen; while (readButton(pinButtonThumb) == LOW) delay(1); } if (readButton(pinButtonOther) == LOW) swCount3 += 1;//A3 else swCount3 = 0; if (swCount3 == 10) { swCount3 = 0; isOtherLock = !isOtherLock; while (readButton(pinButtonOther) == LOW) delay(1); } sensorValue = readSensor(); delay(25); if(sensorValuesensorMax) sensorValue=sensorMax; sensorToPosition(); outIndex = map(position, positionMin, positionMax, outIndexOpen, outIndexClose); servoIndex.write(outIndex); if (!isOtherLock){ outOther = map(position, positionMin, positionMax, outOtherOpen, outOtherClose); servoOther.write(outOther); } if(isThumbOpen) servoThumb.write(outThumbOpen); else servoThumb.write(outThumbClose); if(onSerial) serialMonitor(); } } /* * functions */ boolean isDigitalPin(const int pin) { return (pin >= 0) && (pin <= 19) ? true : false; } boolean readButton(const int pin) { if ( isDigitalPin(pin) ) { return digitalRead(pin); } else { if (analogRead(pin) > 512) return HIGH; else return LOW; } } int readSensor() { int i, sval; for (i = 0; i < 10; i++) { sval += analogRead(pinSensor); } sval = sval/10; return sval; } void sensorToPosition(){ int tmpVal = map(sensorValue, sensorMin, sensorMax, 100, 0); if(tmpVal positionMax) position = positionMax; prePosition = position; } void calibration() { outIndex=outIndexOpen; servoIndex.write(outIndexOpen); servoOther.write(outOtherClose); servoThumb.write(outThumbOpen); position=positionMin; prePosition=positionMin; delay(200); if(onSerial) Serial.println("======calibration start======"); sensorMax = readSensor(); sensorMin = sensorMax - 50; unsigned long time = millis(); while ( millis() < time + 4000 ) { sensorValue = readSensor(); delay(25); if ( sensorValue < sensorMin ) sensorMin = sensorValue; else if ( sensorValue > sensorMax )sensorMax = sensorValue; sensorToPosition(); outIndex = map(position, positionMin, positionMax, outIndexOpen, outIndexClose); servoIndex.write(outIndex); if(onSerial) serialMonitor(); } if(onSerial) Serial.println("======calibration finish======"); return; } void serialMonitor(){ Serial.print("Min="); Serial.print(sensorMin); Serial.print(",Max="); Serial.print(sensorMax); Serial.print(",sensor="); Serial.print(sensorValue); Serial.print(",speed="); Serial.print(speed); Serial.print(",position="); Serial.print(position); Serial.print(",outIndex="); Serial.print(outIndex); Serial.print(",isThumbOpen="); Serial.print(isThumbOpen); Serial.print(",isOtherLock="); Serial.println(isOtherLock); } === Programme HackBerry.ino version V3.1 MK2 === /* * Arduino micro code for HACKberry. * Origially created by exiii Inc. * edited by Genta Kondo on 2017/6/11 */ #include //Settings const boolean isRight = 1;//right:1, left:0 //For right hand, find optimal values of ThumbMin, IndexMax and OtherMax first. //For left hand, find optimal values of ThumbMax, IndexMin and OtherMin first. //Then, calculate the remaining values by following rules. //Difference of ThumbMin and ThumbMax is 86 //Difference of IndexMin and IndexMax is 117 //Difference of OtherMin and OtherMax is 55 const int outThumbMax = 170;//right:open, left:close const int outIndexMax = 142;//right:open, left:close const int outOtherMax = 96;//right:open, left:close const int outThumbMin = 170-86;//right:close, left:open const int outIndexMin = 140-117; //right:close, left:open const int outOtherMin = 95-55;//right:close, left:open const int speedMax = 6; const int speedMin = 0; const int speedReverse = -3; const int thSpeedReverse = 15;//0-100 const int thSpeedZero = 30;//0-100 const boolean onSerial = 0; //Mk2 doesn't use serial monitor //Hardware Servo servoIndex; //index finger Servo servoOther; //other three fingers Servo servoThumb; //thumb int pinCalib; //start calibration //int pinTBD; int pinThumb; // open/close thumb int pinOther; //lock/unlock other three fingers int pinSensor = A1; //sensor input //Software boolean isThumbOpen = 1; boolean isOtherLock = 0; int swCount0,swCount1,swCount2,swCount3 = 0; int sensorValue = 0; // value read from the sensor int sensorMax = 700; int sensorMin = 0; int speed = 0; int position = 0; const int positionMax = 100; const int positionMin = 0; int prePosition = 0; int outThumb,outIndex,outOther = 90; int outThumbOpen,outThumbClose,outIndexOpen,outIndexClose,outOtherOpen,outOtherClose; void setup() { Serial.begin(9600); if(isRight){ pinCalib = A6; //pinTBD = A7; pinThumb = A0; pinOther = 10; outThumbOpen=outThumbMax; outThumbClose=outThumbMin; outIndexOpen=outIndexMax; outIndexClose=outIndexMin; outOtherOpen=outOtherMax; outOtherClose=outOtherMin; } else{ pinCalib = A6; //pinTBD = A7; pinThumb = A0; pinOther = 10; outThumbOpen=outThumbMin; outThumbClose=outThumbMax; outIndexOpen=outIndexMin; outIndexClose=outIndexMax; outOtherOpen=outOtherMin; outOtherClose=outOtherMax; } servoIndex.attach(5);//index servoOther.attach(6);//other servoThumb.attach(9);//thumb //pinMode(pinCalib, INPUT);//A6 //digitalWrite(pinCalib, HIGH); //pinMode(pinTBD, INPUT);//A5 //digitalWrite(pinTBD, HIGH); pinMode(pinThumb, INPUT);//A4 digitalWrite(pinThumb, HIGH); pinMode(pinOther, INPUT);//A3 digitalWrite(pinOther, HIGH); } void loop() { //==waiting for calibration== if(onSerial) Serial.println("======Waiting for Calibration======"); while (1) { servoIndex.write(outIndexOpen); servoOther.write(outOtherOpen); servoThumb.write(outThumbOpen); if(onSerial) serialMonitor(); delay(10); if (DigitalRead(pinCalib) == LOW) { calibration(); break; } } //==control== position = positionMin; prePosition = positionMin; while (1) { if (DigitalRead(pinCalib) == LOW) swCount0 += 1; else swCount0 = 0; if (swCount0 == 10) { swCount0 = 0; calibration(); } if (digitalRead(pinThumb) == LOW) swCount2 += 1; else swCount2 = 0; if (swCount2 == 10) { swCount2 = 0; isThumbOpen = !isThumbOpen; while (digitalRead(pinThumb) == LOW) delay(1); } if (digitalRead(pinOther) == LOW) swCount3 += 1;//A3 else swCount3 = 0; if (swCount3 == 10) { swCount3 = 0; isOtherLock = !isOtherLock; while (digitalRead(pinOther) == LOW) delay(1); } sensorValue = readSensor(); delay(25); if(sensorValuesensorMax) sensorValue=sensorMax; sensorToPosition(); outIndex = map(position, positionMin, positionMax, outIndexOpen, outIndexClose); servoIndex.write(outIndex); if (!isOtherLock){ outOther = map(position, positionMin, positionMax, outOtherOpen, outOtherClose); servoOther.write(outOther); } if(isThumbOpen) servoThumb.write(outThumbOpen); else servoThumb.write(outThumbClose); if(onSerial) serialMonitor(); } } /* * functions */ int readSensor() { int i, sval; for (i = 0; i < 10; i++) { sval += analogRead(pinSensor); } sval = sval/10; return sval; } void sensorToPosition(){ int tmpVal = map(sensorValue, sensorMin, sensorMax, 100, 0); if(tmpVal positionMax) position = positionMax; prePosition = position; } void calibration() { outIndex=outIndexOpen; servoIndex.write(outIndexOpen); servoOther.write(outOtherClose); servoThumb.write(outThumbOpen); position=positionMin; prePosition=positionMin; delay(200); if(onSerial) Serial.println("======calibration start======"); sensorMax = readSensor(); sensorMin = sensorMax - 50; unsigned long time = millis(); while ( millis() < time + 4000 ) { sensorValue = readSensor(); delay(25); if ( sensorValue < sensorMin ) sensorMin = sensorValue; else if ( sensorValue > sensorMax )sensorMax = sensorValue; sensorToPosition(); outIndex = map(position, positionMin, positionMax, outIndexOpen, outIndexClose); servoIndex.write(outIndex); if(onSerial) serialMonitor(); } if(onSerial) Serial.println("======calibration finish======"); } void serialMonitor(){ Serial.print("Min="); Serial.print(sensorMin); Serial.print(",Max="); Serial.print(sensorMax); Serial.print(",sensor="); Serial.print(sensorValue); Serial.print(",speed="); Serial.print(speed); Serial.print(",position="); Serial.print(position); Serial.print(",outIndex="); Serial.print(outIndex); Serial.print(",isThumbOpen="); Serial.print(isThumbOpen); Serial.print(",isOtherLock="); Serial.println(isOtherLock); } boolean DigitalRead(const int pin) { if (analogRead(pin) > 512)return 1; else return 0; } ==== Simulation main sur Tinkercad ==== === Cablage Arduino Uno et servoMoteurs === [[https://www.tinkercad.com/things/aOcPVfLshTv-mainrobot001/editel?sharecode=5w0XKvIfN_HbnWhJSuMrUpc_JwIGZ0DbrTIVq2bElGQ|{{ :start:arduino:capture_du_2022-10-31_10-43-01.jpg?direct&800 |}}]] === Schema === {{ :start:arduino:capture_du_2022-10-31_10-50-53.jpg?direct&600 |}} === Programme HackBerry_Test_tinkercad.ino version V1.0 === #include //Pin int pinButtonCalib; //start calibration int pinButtonTBD; // No function implemented yet. int pinButtonThumb; // open/close thumb int pinButtonOther; //lock/unlock other three fingers int pinServoIndex; int pinServoOther; int pinServoThumb; int pinSensor; //sensor input //Software int sensorValue = 0; int memPouce = 0; int memIndex = 0; int mem3Dgts = 0; //Hardware Servo servoIndex; //index Servo servoOther; //3doigts Servo servoThumb; //pouce //Valeurs mini/max servos const int outThumbMax = 170;//valeur max servo pouce const int outIndexMax = 142;//valeur max servo index const int outOtherMax = 96;//valeur max servo 3doigts const int outThumbMin = 170-86;//valeur min servo pouce 170-86=84 const int outIndexMin = 140-117; //valeur min servo index 140-117= 23 const int outOtherMin = 95-55;//valeur min servo 3doigts 95-55 = 40 void setup() { Serial.begin(9600); // Pin Configuration pinButtonCalib = A4;// A6 sur Hackberry pour test Calibration -- validation index pinButtonTBD = A5;// A7 sur Hackberry pour test pinButtonThumb = A0;// Verrouillage pouce -- validation pouce pinButtonOther = 10;// Verouillage 3 doigts -- validation 3doigts pinServoIndex = 5;// Servo pour l'index pinServoOther = 6;// Servo pour 3 doigts pinServoThumb = 9;// Servo pour le pouce pinSensor = A1; // Capteur de pression servoIndex.attach(pinServoIndex);//index servoOther.attach(pinServoOther);// 3 doigts servoThumb.attach(pinServoThumb);//Pouce pinMode(pinButtonCalib, INPUT_PULLUP); pinMode(pinButtonTBD, INPUT_PULLUP); pinMode(pinButtonThumb, INPUT_PULLUP); pinMode(pinButtonOther, INPUT_PULLUP); } void loop() { sensorValue = 0; if ( digitalRead(pinButtonThumb) == HIGH ){ memPouce = 1; memIndex = 0; mem3Dgts = 0; } if ( digitalRead(pinButtonCalib) == HIGH ){ memPouce = 0; mem3Dgts = 0; memIndex = 1; } if ( digitalRead(pinButtonOther) == HIGH ){ memPouce = 0; mem3Dgts = 1; memIndex = 0; } if (memPouce == 1){ sensorValue = analogRead(pinSensor); delay(25); sensorValue = map(sensorValue, 0, 1023, outThumbMin, outThumbMax); Serial.print("sensor pouce= "); Serial.println(sensorValue); servoThumb.write(sensorValue); delay(15); } if (memIndex == 1){ sensorValue = analogRead(pinSensor); delay(25); sensorValue = map(sensorValue, 0, 1023,outIndexMin, outIndexMax); Serial.print("sensor index= "); Serial.println(sensorValue); servoIndex.write(sensorValue); delay(15); } if (mem3Dgts == 1){ sensorValue = analogRead(pinSensor); delay(25); sensorValue = map(sensorValue, 0, 1023,outOtherMin, outOtherMax); Serial.print("sensor doigts= "); Serial.println(sensorValue); servoOther.write(sensorValue); delay(15); } } ==== Test main.ino==== //EMG sensor robotic hand controller //This code is for controlling a robotic hand with //an EMG sensor. // //© Au Robots 8.4.2017 //Necessary for controlling the servos #include const int x = ///// This is the reference value and it //will depend on your setup. You have to find it out //yourself by looking at the serial monitor and finding //a value between the maximum and minimum value. //Naming the servos Servo servo1; Servo servo2; Servo servo3; Servo servo4; Servo servo5; Servo servo6; void setup() { //Starting the serial monitor Serial.begin(9600); //Configuring servo pins servo2.attach(10); // pinky servo3.attach(11); //ring servo4.attach(3); // middle servo5.attach(6); //index servo6.attach(5); //thumb } void loop() { //Printing the EMG data Serial.println(analogRead(5)); //If the EMG data is greater than x the hand closes if(analogRead(5) > x) { servo2.write(180); servo3.write(148); servo4.write(89); servo5.write(180); servo6.write(180); } //If the EMG data is lower than x the hand opens else if (analogRead(5) < x) { servo2.write(38); servo3.write(10); servo4.write(0); servo5.write(16); servo6.write(16); } //A delay to slow down the process delay(100); }