Volledig besturingssysteem voor de myoelectrische prothese arm van mijn bachelor opdracht

Dependencies:   mbed QEI MODSERIAL FastPWM biquadFilter

Revision:
14:f8e84d287a22
Parent:
12:20ae1d20148d
Child:
15:26dd70c4a837
--- a/main.cpp	Fri Apr 19 11:51:14 2019 +0000
+++ b/main.cpp	Sat Apr 20 16:31:07 2019 +0000
@@ -1,11 +1,11 @@
-//Voor het toevoegen van een button:
+//libraries
 #include "mbed.h"
 #include "MODSERIAL.h"
 #include "QEI.h"
 #include "BiQuad.h"
 #include "FastPWM.h"
 
-// Algemeen
+//~~~~~~~~~~~~ Algemeen ~~~~~~~~~~~~~~
 DigitalIn button3(SW3);
 DigitalIn button2(SW2);
 DigitalIn But2(D12);
@@ -14,49 +14,52 @@
 DigitalOut led1(LED_GREEN);
 DigitalOut led2(LED_RED);
 DigitalOut led3(LED_BLUE);
-float counts = 0;
 
 MODSERIAL pc(USBTX, USBRX);
-Timer t;
-Timer t2;
+Timer t;                                // State timer, na vijf minuten gaat de state automatisch terug naar een vorige state
+Timer t2;                               // Timer voor de grafiek in matlab
+int count = 0;                          // Counter voor de grafiek in matlab
+float counts = 0;                       // Counter voor de MOVEMENT state, zorgt ervoor dat de tickers niet steeds opnieuw attached worden
+
 
-//Motoren
-DigitalOut direction1(D4);
+//~~~~~~~~ Motor waardes ~~~~~~~~~~~~~~~
+DigitalOut direction1(D4);              // Motor 1 is de rotatie motor
 FastPWM pwmpin1(D5);
-FastPWM pwmpin2(D6);
+FastPWM pwmpin2(D6);                    // Motor 2 is de motor in de elleboog
 DigitalOut direction2(D7);
-volatile float pwm1;
+volatile float pwm1;                    //Deze 'pwm' wordt gemaakt met de potmeters, wordt gebruikt voor het testen, maar niet voor de uiteindelijke besturing
 volatile float pwm2;
 
 //Encoder
 QEI encoder1 (D1, D0, NC, 1200, QEI::X4_ENCODING);
 QEI encoder2 (D3, D2, NC, 4800, QEI::X4_ENCODING);
-double Pulses1;
-double motor_position1;
+double Pulses1;                         // Afgelezen Encoder pulses
+double motor_position1;                 // De berekende hoek
 double Pulses2;
 double motor_position2;
-double error1;
-double u1;
+double error1;                          // Berekende error tussen de berekende hoek en de referentie hoek
+double error2;
+double u1;                              // PWM signaal dat naar de motor gaat
+double u2;
 
 //Pot meter
-AnalogIn pot(A5);
+AnalogIn pot(A5);                       // De potmeters worden alleen gebruikt bij het testen
 AnalogIn pot0(A0);
 float Pot2;
 float Pot1;
 
 //Ticker
-Ticker Pwm;
-Ticker PotRead;
-Ticker Kdc;
+Ticker Pwm;                             // Ticker om de motoren te laten bewegen
+Ticker PotRead;                         // Ticker voor de Continuous read functie
+Ticker ServoTick;                       // Ticker om een PWM signaal met een periode van 20 ms bij een DigitalOut pin te creeëren
 
 //Servo
-Ticker ServoTick;
-DigitalOut myservo1(D8); //Duim
-DigitalOut myservo2(D11); //Pink tot Middel vinger
-DigitalOut myservo3(D10); //wijsvinger
+DigitalOut myservo1(D8);                //Duim                              
+DigitalOut myservo2(D11);               //Pink tot Middel vinger
+DigitalOut myservo3(D10);               //wijsvinger
 
-float Periodlength = 0.02; // de MG996R heeft een PWM periode van 20 ms
-double servo_position1; // in percentage van 0 tot 1, 0 is met de klok mee, 1 is tegen de klok in.
+float Periodlength = 0.02;              // de MG996R Servo heeft een PWM periode van 20 ms
+double servo_position1;                 // in percentage van 0 tot 1, 0 is met de klok mee, 1 is tegen de klok in.
 double servo_position2;
 double servo_position3;
 
@@ -69,54 +72,42 @@
 float Wijsvinger_recht = 0.93;
 
 
-// EMG
-float EMG1;       // Rotatie
-float EMG2;       // Elleboog
-float EMG3;       // Hand
-float EMG4;       // Reverse
-float Input1;       // Voor zonder EMG
-float Input2;
-int count = 0;
+
 
-//------------- EMG gloabals -------------//
-// Tickers
-Ticker sample_ticker; //ticker voor filteren met 1000Hz
-Ticker sample_timer;
-Ticker threshold_check_ticker; //ticker voor het checken van de threshold met 1000Hz
-Timer timer_calibration; //timer voor EMG Kalibratie
-double ts = 0.001; //tijdsstap !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-double calibration_time = 37; //Kalibratie tijd
 
+//~~~~~~~~ EMG waardes ~~~~~~~~~~~~~~~~~
 //Input
 AnalogIn    emg1( A1 ); //Duim
 AnalogIn    emg2( A2 ); //Bicep
 AnalogIn    emg3( A3 ); //Dorsaal
 AnalogIn    emg4( A4 ); //Palmair
 
-// GLOBALS EMG
-//Gefilterde EMG signalen
-volatile double emg1_filtered, emg2_filtered, emg3_filtered, emg4_filtered;
+// Tickers
+Ticker sample_ticker;                   //ticker voor filteren met 1000Hz
+Ticker sample_timer;                    //ticker voor printen van de uiteindelijke EMG waardes met 2 Hz
+Ticker threshold_check_ticker;          //ticker voor het checken van de threshold met 100Hz
+Timer timer_calibration;                //timer voor EMG Kalibratie
+double ts = 0.001;                      //tijdsstap
 
-bool thresholdreach1 = false;
-bool thresholdreach2 = false;
-bool thresholdreach3 = false;
-bool thresholdreach4 = false;
+float Input1;                           //Input voor motoren
+float Input2;
 
-volatile double temp_highest_emg1 = 0; //Hoogste waarde gevonden tijdens kalibratie
+//Gefilterde EMG signalen
+volatile double temp_highest_emg1 = 0;  //Hoogste waarde gevonden tijdens kalibratie
 volatile double temp_highest_emg2 = 0;
 volatile double temp_highest_emg3 = 0;
 volatile double temp_highest_emg4 = 0;
 
 //Percentage van de hoogste waarde waar de bovenste treshold gezet moet worden
-double Duim_p_t = 0.5; 
-double Bicep_p_t = 0.4; 
-double Dorsaal_p_t = 0.6; 
+double Duim_p_t = 0.5;
+double Bicep_p_t = 0.4;
+double Dorsaal_p_t = 0.6;
 double Palmair_p_t = 0.5;
 
 //Percentage van de hoogste waarde waar de onderste treshold gezet moet worden
-double Duim_p_tL = 0.5; 
-double Bicep_p_tL = 0.4; 
-double Dorsaal_p_tL = 0.5; 
+double Duim_p_tL = 0.5;
+double Bicep_p_tL = 0.4;
+double Dorsaal_p_tL = 0.5;
 double Palmair_p_tL = 0.5;
 
 // Waarde bovenste treshold waar het signaal overheen moet om de arm te activeren
@@ -131,6 +122,11 @@
 volatile double threshold3L;
 volatile double threshold4L;
 
+bool thresholdreach1 = false;           // Of de waarde boven de bovenste threshold is geweest
+bool thresholdreach2 = false;
+bool thresholdreach3 = false;
+bool thresholdreach4 = false;
+
 // thresholdreads bools
 bool Duim;
 bool Bicep;
@@ -138,7 +134,9 @@
 bool Palmair;
 
 // filters
-//EMG1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+volatile double emg1_filtered, emg2_filtered, emg3_filtered, emg4_filtered;
+
+//EMG1
 //Highpass vierde orde cutoff 20Hz, Band filter om 49, 50, 51Hz eruit te filteren
 BiQuadChain highp1;
 BiQuad highp1_1( 0.8485, -1.6969, 0.8485, 1.0000, -1.7783, 0.7924 );
@@ -148,7 +146,7 @@
 //Lowpass first order cutoff 0.4Hz
 BiQuad lowp1( 0.0013, 0.0013, 0, 1.0000, -0.9975, 0 );
 
-//EMG2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+//EMG2
 //Highpass vierde orde cutoff 20Hz, Band filter om 49, 50, 51Hz eruit te filteren
 BiQuadChain highp2;
 BiQuad highp2_1( 0.8485, -1.6969, 0.8485, 1.0000, -1.7783, 0.7924 );
@@ -158,7 +156,7 @@
 //Lowpass first order cutoff 0.4Hz
 BiQuad lowp2( 0.0013, 0.0013, 0, 1.0000, -0.9975, 0 );
 
-//EMG3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+//EMG3
 //Highpass vierde orde cutoff 20Hz, Band filter om 49, 50, 51Hz eruit te filteren
 BiQuadChain highp3;
 BiQuad highp3_1( 0.8485, -1.6969, 0.8485, 1.0000, -1.7783, 0.7924 );
@@ -168,7 +166,7 @@
 //Lowpass first order cutoff 0.4Hz
 BiQuad lowp3( 0.0013, 0.0013, 0, 1.0000, -0.9975, 0 );
 
-//EMG4!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+//EMG4
 //Highpass vierde orde cutoff 20Hz, Band filter om 49, 50, 51Hz eruit te filteren
 BiQuadChain highp4;
 BiQuad highp4_1( 0.8485, -1.6969, 0.8485, 1.0000, -1.7783, 0.7924 );
@@ -178,12 +176,12 @@
 //Lowpass first order cutoff 0.4Hz
 BiQuad lowp4( 0.0013, 0.0013, 0, 1.0000, -0.9975, 0 );
 
-//Kinematica
-double stap1;
+//~~~~~~~~ Kinematica ~~~~~~~~~~~~~~~~~~
+double stap1;                           //Stap die bij de referentie hoek wordt opgeteld bij een EMG signaal van 1
 double stap2;
 double KPot;
 
-float ElbowReference;
+float ElbowReference;                   
 float Ellebooghoek1;
 float Ellebooghoek2;
 float Ellebooghoek3;
@@ -199,31 +197,31 @@
 float Hoeknieuw2;
 
 //Limiet in graden
-float lowerlim1 = -900;
+float lowerlim1 = -900;                 //Rotatie motor gewricht limiet, gelijk aan 180 graden rotatie beide kanten op
 float upperlim1 = 900;
-float lowerlim2 = 0;
+float lowerlim2 = 0;                    // Elleboog limiet, van 0 graden (helemaal gebogen) tot 110 graden (helemaal gestrekt)
 float upperlim2 = 1500;
 
-// VARIABLES PID CONTROLLER
+//~~~~~~~~ PID controler waardes ~~~~~~
 double Kp1 = 12.5;
 double Ki1 = 0;
 double Kd1 = 1;
-double Kp2 = 20;          // Zonder arm: 6,0,1, met rotatie: 10, 0, 1
+double Kp2 = 20;          
 double Ki2 = 0;
 double Kd2 = 1;
-double Ts = 0.0005;      // Sample time in seconds
+double Ts = 0.0005;                     // tijdstap voor pwm ticker    
 
 
-// ~~~~~~~~~~~~~~~~~~~EMG FUNCTIONS~~~~~~~~~~~~~~~~~~
+// ~~~~~~~~~~~~~~~~~~~ EMG functies ~~~~~~~~~~~~~~~~~~
 void emgsample()
 {
-    
+
     // EMG signaal lezen
     double emgread1 = emg1.read();
     double emgread2 = emg2.read();
     double emgread3 = emg3.read();
     double emgread4 = emg4.read();
-    
+
     // Vierde orde highpass filter + notch filter
     double emg1_highpassed = highp1.step(emgread1);
     double emg2_highpassed = highp2.step(emgread2);
@@ -248,104 +246,100 @@
 void threshold_check()
 {
 
-// EMG1 Check    
-if (thresholdreach1 == false){            //Als emg_filtered nog niet boven de bovenste threshold is geweest
-    //bovenste threshold check
-    if(emg1_filtered>threshold1) {
-        Duim = 1;
-        thresholdreach1 = true;
-        
-    } else {
-        Duim= 0;
-    }
-    }
-else{                                   //Als emg_filtered boven de bovenste threshold is geweest
-    //onderste threshold check
-    if(emg1_filtered<threshold1L) {
-        Duim = 0;
-        thresholdreach1 = false;
-        
-    } else {
-        Duim= 1;
-    }
+// EMG1 Check
+    if (thresholdreach1 == false) {         //Als emg_filtered nog niet boven de bovenste threshold is geweest
+        //bovenste threshold check
+        if(emg1_filtered>threshold1) {
+            Duim = 1;
+            thresholdreach1 = true;
+
+        } else {
+            Duim= 0;
+        }
+    } else {                                //Als emg_filtered boven de bovenste threshold is geweest
+        //onderste threshold check
+        if(emg1_filtered<threshold1L) {
+            Duim = 0;
+            thresholdreach1 = false;
+
+        } else {
+            Duim= 1;
+        }
     }
 
-// EMG2 Check    
-if (thresholdreach2 == false){            //Als emg_filtered nog niet boven de bovenste threshold is geweest
-    //bovenste threshold check
-    if(emg2_filtered>threshold2) {
-        Bicep = 1;
-        thresholdreach2 = true;
-    } else {
-        Bicep= 0;
-    }
-    }
-else{                                   //Als emg_filtered boven de bovenste threshold is geweest
-    //onderste threshold check
-    if(emg2_filtered<threshold2L) {
-        Bicep = 0;
-        thresholdreach2 = false;
-        
-    } else {
-        Bicep= 1;
-    }
+// EMG2 Check
+    if (thresholdreach2 == false) {         //Als emg_filtered nog niet boven de bovenste threshold is geweest
+        //bovenste threshold check
+        if(emg2_filtered>threshold2) {
+            Bicep = 1;
+            thresholdreach2 = true;
+        } else {
+            Bicep= 0;
+        }
+    } else {                                //Als emg_filtered boven de bovenste threshold is geweest
+        //onderste threshold check
+        if(emg2_filtered<threshold2L) {
+            Bicep = 0;
+            thresholdreach2 = false;
+
+        } else {
+            Bicep= 1;
+        }
     }
 
-// EMG3 Check    
-if (thresholdreach3 == false){            //Als emg_filtered nog niet boven de bovenste threshold is geweest
-    //bovenste threshold check
-    if(emg3_filtered>threshold3) {
-        Dorsaal = 1;
-        thresholdreach3 = true;
-    } else {
-        Dorsaal= 0;
-    }
-    }
-else{                                   //Als emg_filtered boven de bovenste threshold is geweest
-    //onderste threshold check
-    if(emg3_filtered<threshold3L) {
-        Dorsaal = 0;
-        thresholdreach3 = false;
-        
-    } else {
-        Dorsaal= 1;
-    }
+// EMG3 Check
+    if (thresholdreach3 == false) {         //Als emg_filtered nog niet boven de bovenste threshold is geweest
+        //bovenste threshold check
+        if(emg3_filtered>threshold3) {
+            Dorsaal = 1;
+            thresholdreach3 = true;
+        } else {
+            Dorsaal= 0;
+        }
+    } else {                                //Als emg_filtered boven de bovenste threshold is geweest
+        //onderste threshold check
+        if(emg3_filtered<threshold3L) {
+            Dorsaal = 0;
+            thresholdreach3 = false;
+
+        } else {
+            Dorsaal= 1;
+        }
     }
 
-// EMG4 Check    
-if (thresholdreach4 == false){            //Als emg_filtered nog niet boven de bovenste threshold is geweest
-    //bovenste threshold check
-    if(emg4_filtered>threshold4) {
-        Palmair = 1;
-        thresholdreach4 = true;
-    } else {
-        Palmair= 0;
-    }
-    }
-else{                                   //Als emg_filtered boven de bovenste threshold is geweest
-    //onderste threshold check
-    if(emg4_filtered<threshold4L) {
-        Palmair = 0;
-        thresholdreach4 = false;
-        
-    } else {
-        Palmair= 1;
-    }
+// EMG4 Check
+    if (thresholdreach4 == false) {         //Als emg_filtered nog niet boven de bovenste threshold is geweest
+        //bovenste threshold check
+        if(emg4_filtered>threshold4) {
+            Palmair = 1;
+            thresholdreach4 = true;
+        } else {
+            Palmair= 0;
+        }
+    } else {                                //Als emg_filtered boven de bovenste threshold is geweest
+        //onderste threshold check
+        if(emg4_filtered<threshold4L) {
+            Palmair = 0;
+            thresholdreach4 = false;
+
+        } else {
+            Palmair= 1;
+        }
     }
 
-    }
+}
 
-// Functies Kinematica
-float Kinematics1(float EMG1)
+//~~~~~~~~~ Functies Kinematica ~~~~~~~~~~~~
+float Kinematics1(float Bicep)
 {
 
-    if (Dorsaal == 1 && Duim == 0) {
+    if (Bicep == 1 && Duim == 0) {          //Als alleen Bicep flexie wordt afgelezen gaat de waarde van de referentie hoek omhoog             
         stap1 = 450*Ts;
         Hoeknieuw1 = PolsReference + stap1;
         return Hoeknieuw1;
     }
 
-    else if (Dorsaal == 1 && Duim == 1) {
+    else if (Bicep == 1 && Duim == 1) {     //Als Bicep en Duim flexie wordt afgelezen gaat de waarde van de referentie hoek omlaag
         stap1 = 450*Ts;
         Hoeknieuw1 = PolsReference - stap1;
         return Hoeknieuw1;
@@ -358,13 +352,13 @@
 float Kinematics2(bool Dorsaal)
 {
 
-    if (Dorsaal == 1 && Duim == 0) {
+    if (Dorsaal == 1 && Duim == 0) {        //Als alleen Dorsaal flexie wordt afgelezen gaat de waarde van de referentie hoek omhoog
         stap2 = 300*Ts;
         Hoeknieuw2 = ElbowReference + stap2;
         return Hoeknieuw2;
     }
 
-    else if (Dorsaal == 1 && Duim == 1) {
+    else if (Dorsaal == 1 && Duim == 1) {   //Als Dorsaal en Duim flexie wordt afgelezen gaat de waarde van de referentie hoek omhoog
         stap2 = 300*Ts;
         Hoeknieuw2 = ElbowReference - stap2;
         return Hoeknieuw2;
@@ -378,12 +372,12 @@
 float Limits1(float Polshoek2)
 {
 
-    if (Polshoek2 <= upperlim1 && Polshoek2 >= lowerlim1) {       //Binnen de limieten
+    if (Polshoek2 <= upperlim1 && Polshoek2 >= lowerlim1) {         //Binnen de limieten
         Polshoek3 = Polshoek2;
     }
 
     else {
-        if (Polshoek2 >= upperlim1) {                            //Boven de limiet
+        if (Polshoek2 >= upperlim1) {                               //Boven de limiet
             Polshoek3 = upperlim1;
         } else {                                                    //Onder de limiet
             Polshoek3 = lowerlim1;
@@ -397,12 +391,12 @@
 float Limits2(float Ellebooghoek2)
 {
 
-    if (Ellebooghoek2 <= upperlim2 && Ellebooghoek2 >= lowerlim2) {       //Binnen de limieten
+    if (Ellebooghoek2 <= upperlim2 && Ellebooghoek2 >= lowerlim2) { //Binnen de limieten
         Ellebooghoek3 = Ellebooghoek2;
     }
 
     else {
-        if (Ellebooghoek2 >= upperlim2) {                            //Boven de limiet
+        if (Ellebooghoek2 >= upperlim2) {                           //Boven de limiet
             Ellebooghoek3 = upperlim2;
         } else {                                                    //Onder de limiet
             Ellebooghoek3 = lowerlim2;
@@ -413,12 +407,12 @@
 }
 
 
-// PID Controller
+//~~~~~~~~ PID Controller~~~~~~~~~~~~~~~
 double PID_controller1(double error1)
 {
     static double error1_integral = 0;
     static double error1_prev = error1; // initialization with this value only done once!
-    static BiQuad LowPassFilter(0.0640, 0.1279, 0.0640, -1.1683, 0.4241); //(BIQUAD_FILTER_TYPE type, T dbGain, T freq, T srate, T bandwidth);
+    static BiQuad LowPassFilter(0.0640, 0.1279, 0.0640, -1.1683, 0.4241); 
 
     // Proportional part:
     double u_k1 = Kp1 * error1;
@@ -459,39 +453,40 @@
     return u_k2 + u_i2 + u_d2;
 }
 
-// Functies Motor
+//~~~~~~~~~~~~ Functies Motor ~~~~~~
 void moter1_control(double u1)
 {
-    direction1= u1 > 0.0f; //positief = CW
+    direction1= u1 > 0.0f;          //positief = CW
     if (fabs(u1)> 0.7f) {
         u1 = 0.7f;
     } else {
         u1= u1;
     }
-    pwmpin1.write(fabs(u1)) ; //pwmduty cycle canonlybepositive, floatingpoint absolute value
+    pwmpin1.write(fabs(u1)) ; 
 }
 
 void moter2_control(double u2)
 {
-    direction2= u2 < 0.0f; //positief = CW
+    direction2= u2 < 0.0f;          //positief = CW
     if (fabs(u2)> 0.99f) {
         u2 = 0.99f;
     } else {
         u2= u2;
     }
-    pwmpin2.write(fabs(u2)) ; //pwmduty cycle canonlybepositive, floatingpoint absolute value
+    pwmpin2.write(fabs(u2)) ; 
 }
 
 void PwmMotor(void)
 {
     //Continues Read
-    Pot2 = pot.read();
+    Pot2 = pot.read();           //Potmeters alleen voor testen
     Pot1 = pot0.read();
     pwm2 =(Pot2*2)-1;            //scaling naar -1 tot 1
     pwm1 =(Pot1*2)-1;
-    Input1 = Bicep;
+    Input1 = Bicep;              //Voor testen hier potmeter waarde 'pwm1'invullen
     Input2 = Palmair;
-
+    
+    // Reference hoek berekenen, in graden
     float Polshoek1 = Kinematics1(Input1);
     float Polshoek4 = Limits1(Polshoek1);
     PolsReference = Polshoek4;
@@ -506,7 +501,8 @@
     motor_position1 = -(Pulses1/1200)*360;
     Pulses2 = encoder2.getPulses();
     motor_position2 = -(Pulses2/4800)*360;
-
+    
+    // Error berekenen, naar PID controller en dan naar motor
     double error1 = PolsReference - motor_position1;
     double u1 = PID_controller1(error1);
     moter1_control(u1);
@@ -525,8 +521,8 @@
 
 }
 
-//Servo functies
-void servowait1(void)
+//~~~~~~~~~~ Servo functies ~~~~~~~~~~~~
+void servowait1(void)~                  //creeërt een PWM periode van 20 ms met een pulslengte tussen de 500 en 2500 microseconden
 {
     double Pulslength1 = 0.0005 + (servo_position1 * 0.002); //in seconden, waarde tussen de 500 en de 2500 microseconden, als de waarde omhoog gaat beweegt de servo tegen de klok in
     myservo1 = true;
@@ -559,20 +555,21 @@
 
 
 
-void ContinuousReader(void)
+void ContinuousReader(void)             //leest potmeters af
 {
     Pot2 = pot.read();
     Pot1 = pot0.read();
-    pwm2 =(Pot2*2)-1;            //scaling naar -1 tot 1
+    pwm2 =(Pot2*2)-1;                   //scaling naar -1 tot 1
     pwm1 =(Pot1*2)-1;
 }
 
-void sample(){
-pc.printf("Duim = %i\r\n", Duim);
-pc.printf("Bicep = %i\r\n",Bicep);
-pc.printf("Dorsaal = %i\r\n", Dorsaal);
-pc.printf("Palmair = %i\r\n", Palmair);           
-        
+void sample()                           //Print uiteindelijke EMG output
+{
+    pc.printf("Duim = %i\r\n", Duim);
+    pc.printf("Bicep = %i\r\n",Bicep);
+    pc.printf("Dorsaal = %i\r\n", Dorsaal);
+    pc.printf("Palmair = %i\r\n", Palmair);
+
 }
 
 // StateMachine
@@ -597,7 +594,7 @@
                 stateChanged = false;
             }
 
-            // State transition logic: Als button 1 word ingedrukt --> calibratie, anders motor uithouden
+            // State transition logic: Als button 3 word ingedrukt --> calibratie, anders motor uithouden
             if (!button3) {
                 currentState = CALIBRATION  ;
                 stateChanged = true;
@@ -618,7 +615,7 @@
                 sample_ticker.attach(&emgsample, 0.001);            // Leest het ruwe EMG signaal af met een frequentie van 1000Hz
                 timer_calibration.reset();
                 timer_calibration.start();
-                while(timer_calibration<20) {                           //Duim
+                while(timer_calibration<20) {                           //Binnen 20 seconden alle spieren maximaal aanspannen, hoogste waarde wordt opgeslagen
                     if(timer_calibration>0 && timer_calibration<20) {
 
                         if(emg1_filtered>temp_highest_emg1) {
@@ -645,7 +642,7 @@
 
                 }
                 pc.printf("threshold calculation\r\n");
-                threshold1 = temp_highest_emg1*Duim_p_t;
+                threshold1 = temp_highest_emg1*Duim_p_t;                //Percentage van de hoogste waarde wordt gebruikt om de bovenste en onderste treshold aan te geven
                 threshold2 = temp_highest_emg2*Bicep_p_t;
                 threshold3 = temp_highest_emg3*Dorsaal_p_t;
                 threshold4 = temp_highest_emg4*Palmair_p_t;
@@ -659,13 +656,13 @@
             }
             sample_ticker.detach();
             timer_calibration.stop();
-            // State transition logic: automatisch terug naar motors off.
+            // State transition logic: automatisch naar HOMING 1
 
             currentState = HOMING1;
             stateChanged = true;
             break;
 
-        case HOMING1:
+        case HOMING1:                       //Gebruik de knoppen op het motor shield om het rotatie gewricht naar de beginpositie te brengen
             // Actions
             if (stateChanged) {
                 // state initialization: green
@@ -694,7 +691,7 @@
                 stateChanged = false;
             }
 
-            // State transition logic: naar HOMING (button2), na 5 min naar MOTORS_OFF
+            // State transition logic: naar HOMING 2(button3), na 5 min naar MOTORS_OFF
 
             if (!button3) {
                 t.stop();
@@ -713,9 +710,9 @@
             }
             break;
 
-        case HOMING2:
+        case HOMING2:                               // gebruik knoppen op het motor shield om het elleboog gewricht naar de begin positie te brengen ( helemaal gebogen)
             // Actions
-            
+
             if (stateChanged) {
                 // state initialization: white
                 t.start();
@@ -743,7 +740,7 @@
                 stateChanged = false;
             }
 
-            // State transition logic: naar DEMO (button2), naar MOVEMENT(button3)
+            // State transition logic: naar DEMO (button2), naar MOVEMENT(button3), na 5 min. automatisch naar MOTORS OFF
             if (!button2) {
                 currentState = DEMO;
                 stateChanged = true;
@@ -765,7 +762,7 @@
             }
             break;
 
-        case DEMO:
+        case DEMO:                              // Mogelijkheid om hier je demo routine in te zetten
             // Actions
             if (stateChanged) {
                 // state initialization: light blue
@@ -796,12 +793,12 @@
                 stateChanged = false;
             }
 
-            // State transition logic: automatisch terug naar HOMING
+            // State transition logic: automatisch terug naar HOMING2
             currentState = HOMING2;
             stateChanged = true;
             break;
 
-        case MOVEMENT:
+        case MOVEMENT:                              // Hier worden de motoren bestuurd met EMG input
             // Actions
 
             if (stateChanged) {
@@ -810,29 +807,30 @@
                 led1 = 1;
                 led2 = 0;
                 led3 = 0;
-                  
+
                 // Tickers aan
                 if (counts == 0) {
                     pwmpin1 = 0;
                     pwmpin2 = 0;
                     Input1 = pwm1;
                     Input2 = pwm2;
-                    Pwm.attach (PwmMotor, Ts);
+                    
+                    Pwm.attach (PwmMotor, Ts);                          // Motoren gaan aan
                     sample_ticker.attach(&emgsample, 0.001);            // Leest het ruwe EMG signaal af met een frequentie van 1000Hz
-                    threshold_check_ticker.attach(&threshold_check, 0.01);
-                    sample_timer.attach(&sample, 0.5);    
+                    threshold_check_ticker.attach(&threshold_check, 0.01);  //Checkt of threshold overgeschreden wordt
+                    sample_timer.attach(&sample, 0.5);                  // print de EMG waardes
                     servo_position1 = Duim_krom;
                     servo_position2 = MWP_krom;
                     servo_position3 = Wijsvinger_krom;
-                    
-                    ServoTick.attach(&ServoPeriod, Periodlength);
+
+                    ServoTick.attach(&ServoPeriod, Periodlength);       //Servo's gaan aan
                     counts++;
-                    wait(1);
+                    wait(1);                                            //Zorgt ervoor dat hij niet doorschiet naar de volgende staat als je te lang de knop indrukt
                 }
-                
+
                 // Servo positie
 
-                if (Dorsaal == 1 && Duim == 0) {
+                if (Dorsaal == 1 && Duim == 0) {                       
                     servo_position1 = Duim_krom;
                     servo_position2 = MWP_krom;
                     servo_position3 = Wijsvinger_krom;
@@ -845,20 +843,6 @@
                     led1 = !led1;
                 }
 
-                /*
-
-                 // printen
-                if(count==500)
-                {
-                float tmp = t2.read();
-                pc.printf(" Elleboog positie: %f reference: %f, rotatie positie: %f reference: \r\n", motor_position2, ElbowReference, motor_position1, PolsReference);
-                count = 0;
-                }
-                count++;
-
-
-                */
-                
                 stateChanged = false;
             }
 
@@ -919,12 +903,11 @@
                 currentState = MOVEMENT;
                 stateChanged = true;
                 counts = 0;
-                        } 
-            else {
+            } else {
                 currentState = FREEZE  ;
                 stateChanged = false;
-                }
-            
+            }
+
             break;
 
     }