Tim Luten / Mbed 2 deprecated DEMO_TEST_LIJN

Dependencies:   Demo_TEST3 QEI biquadFilter mbed

Fork of Demo_TEST3 by Biorobotica TIC

Revision:
4:5ceb8f058874
Parent:
3:be5ac89a0b53
Child:
5:e7253884c2e4
Child:
6:1f722bf6a89b
--- a/main.cpp	Fri Oct 19 08:05:58 2018 +0000
+++ b/main.cpp	Wed Oct 24 11:42:35 2018 +0000
@@ -1,71 +1,104 @@
 #include "mbed.h"
 #include "math.h"
 #include "BiQuad.h"
-#include "Servo.h"
-//#include "HIDScope.h"
+//#include "Servo.h"
+#include "HIDScope.h"
 
 
 
 //Define objects
-AnalogIn    emgL( A0 );                                                         // EMG Left Arm
-AnalogIn    emgR( A1 );                                                         // EMG Right Arm
+AnalogIn    emgL(A0);                                                           // EMG Left Arm
+AnalogIn    emgR(A1);                                                           // EMG Right Arm
+AnalogIn    emgS(A2);                                                           // EMG Servo spier
 DigitalOut  ledB(LED_BLUE);                                                     // Informative LED for gaining zero and max
 DigitalOut  ledR(LED_RED);
 DigitalOut  ledG(LED_GREEN);                                                    // Informative LED for gaining zero and max
-DigitalIn   TestButton(PTA4);                                                   // Button used for gaining zero and max
-DigitalIn   zeromax(PTC6);                                                        // Button used for switching between zero and max
+DigitalIn   CalButton(PTA4);                                                    // Button used for gaining zero and max
+DigitalIn   zeromax(PTC6);                                                      // Button used for switching between zero and max
 Ticker      emgSampleTicker;                                                    // Ticker for sample frequency
-//HIDScope    scope( 4 );                                                       
-Servo myservo(D13);
+HIDScope    scope( 6 );                                                       
+//Servo myservo(D13);
 DigitalOut motor1direction(D7);
 PwmOut motor1control(D6);
 
 
- int P= 200;                                                                    // Number of points for moving average first emg
- int Q = 200;                                                                   // Number of points for moving average second emg
+ int P= 200;                                                                    // Number of points for movag first emg
+ int Q = 200;                                                                   // Number of points for movag second emg
+ int R = 200;                                                                   // Number of points for movag third emg
  double A[200];                                                                 // Vector for storing data of first emg
  double B[200];                                                                 // Vector for storing data of second emg
+ double C[200];                                                                 // Vector for storing data of third emg
  int k = 0;                                                                     // Counter for configuration:
- double Rvector[200];                                                           // Vector for Rwaarde configuration
- double Rwaarde[2];                                                             // Vector for storage of max and zero of left biceps
- double Lvector[200];                                                           // Vector for Lwaarde configuration
- double Lwaarde[2];                                                             // Vector for storage of max and zero of right biceps
+ double Lvector[200];                                                           // Vector for Rwaarde configuration
+ double Lwaarde[2];                                                             // Vector for storage of max and zero of left biceps
+ double Rvector[200];                                                           // Vector for Lwaarde configuration
+ double Rwaarde[2];                                                             // Vector for storage of max and zero of right biceps
+ double Svector[200];                                                           // Vector for Swaarde configuration
+ double Swaarde[2];                                                             // Vector for storage of max and zero of servo emg
  int x = 0;                                                                     // Variable for switching between zero and max
- double movmeanR;                                                               // Moving Average mean value of right biceps
- double movmeanL;                                                               // Moving Average mean value of left biceps
+ double movagR;                                                                 // Moving Average mean value of right biceps
+ double movagL;                                                                 // Moving Average mean value of left biceps
+ double movagS;                                                                 // Moving Average mean value of servo spier
  float thresholdL = 10;                                                         // Startvalue for threshold, to block signals -
  float thresholdR = 10;                                                         // - before the zero and max values are calculated
+ float thresholdS = 10;                                                         //-------
  
- // Filters 
-BiQuadChain bqcR;                                                               // BiQuad for signal right biceps
-BiQuad bq1R( 0.6844323315947305,1.368864663189461, 0.6844323315947305, 
-             1.2243497755555954,0.5133795508233265); // LP
-BiQuad bq2R( 0.6844323315947306, -1.3688646631894612,  0.6844323315947306, 
-            -1.2243497755555959, 0.5133795508233266); // HP
-BiQuad bq3R( 0.7566897754116633, -1.2243497755555959,  0.7566897754116633,   
-            -1.2243497755555959, 0.5133795508233266); // Notch
-BiQuadChain bqcL;                                                               // BiQuad for signal left biceps
-BiQuad bq1L( 0.6844323315947305,1.368864663189461, 0.6844323315947305,
-             1.2243497755555954,0.5133795508233265); // LP
-BiQuad bq2L( 0.6844323315947306, -1.3688646631894612,  0.6844323315947306, 
-            -1.2243497755555959, 0.5133795508233266); // HP
-BiQuad bq3L( 0.7566897754116633, -1.2243497755555959,  0.7566897754116633, 
-            -1.2243497755555959, 0.5133795508233266); // Notch
+ //------------Filter parameters----------------------
+
+//Lowpassfilter
+//const double b0LP = 0.0014831498359569692;
+//const double b1LP = 0.0029662996719139385;
+//const double b2LP = 0.0014831498359569692;
+//const double a1LP = -1.918570032544273;
+//const double a2LP = 0.9245026318881009;
+//Highpassfilter                        Fc = 10 Hz;, Q = 0.5, Fs = 500 Hz
+const double b0HP = 0.8851221317817073;
+const double b1HP = -1.7702442635634146;
+const double b2HP = 0.8851221317817073;
+const double a1HP =  -1.7632371847263784;
+const double a2HP = 0.777251342400451;
+//Notchfilter                           Fc = 50 Hz, Q = 10, Fs = 500 Hz
+const double b0NO = 0.9714498065192796;
+const double b1NO = -1.5718388053127037;
+const double b2NO = 0.9714498065192796;
+const double a1NO = -1.5718388053127037;
+const double a2NO = 0.9428996130385592;
+
+//--------------Filter------------
+//BiQuad LPR( b0LP, b1LP, b2LP, a1LP, a2LP ); //Lowpass filter Biquad
+BiQuad HPR( b0HP, b1HP, b2HP, a1HP, a2HP ); //Highpass filter Biquad
+BiQuad NOR( b0NO, b1NO, b2NO, a1NO, a2NO ); //Notch filter Biquad 
+
+//BiQuad LPL( b0LP, b1LP, b2LP, a1LP, a2LP ); //Lowpass filter Biquad
+BiQuad HPL( b0HP, b1HP, b2HP, a1HP, a2HP ); //Highpass filter Biquad
+BiQuad NOL( b0NO, b1NO, b2NO, a1NO, a2NO ); //Notch filter Biquad 
+
+//BiQuad LPS( b0LP, b1LP, b2LP, a1LP, a2LP ); //Lowpass filter Biquad
+BiQuad HPS( b0HP, b1HP, b2HP, a1HP, a2HP ); //Highpass filter Biquad
+BiQuad NOS( b0NO, b1NO, b2NO, a1NO, a2NO ); //Notch filter Biquad 
 
 
 void emgSample() {                                                              // EMG function
+    
+    double emgNOFilteredL = NOL.step(emgL.read());                              // Filtered NO value of EMG signal left biceps                
+    double emgHPFilteredL = HPL.step(emgNOFilteredL);                           // Filtered HP value of EMG signal left biceps
+    double emgabsL = fabs(emgHPFilteredL);                                      // Absolute value of EMG signal left biceps  
+      
                                                              
-    double emgNOFilteredR = bq3R.step(emgR.read());                          // Filtered HP value of EMG signal left biceps                
-    double emgHPFilteredR = bq2R.step(emgNOFilteredR);                            // Filtered HP value of EMG signal left biceps
-    double emgabsR = fabs(emgHPFilteredR);                                       // Absolute value of EMG signal left biceps          
+    double emgNOFilteredR = NOR.step(emgR.read());                              // Filtered NO value of EMG signal right biceps                
+    double emgHPFilteredR = HPR.step(emgNOFilteredR);                           // Filtered HP value of EMG signal right biceps
+    double emgabsR = fabs(emgHPFilteredR);                                      // Absolute value of EMG signal right biceps          
     
-    double emgNOFilteredL = bq3L.step(emgL.read());                          // Filtered HP value of EMG signal left biceps                
-    double emgHPFilteredL = bq2L.step(emgNOFilteredL);                            // Filtered HP value of EMG signal left biceps
-    double emgabsL = fabs(emgHPFilteredL);                                       // Absolute value of EMG signal left biceps
+    
+    double emgNOFilteredS = NOS.step(emgS.read());                              // Filtered NO value of EMG signal servo spier                
+    double emgHPFilteredS = HPS.step(emgNOFilteredS);                           // Filtered HP value of EMG signal servo spier
+    double emgabsS = fabs(emgHPFilteredS);                                      // Absolute value of EMG signal servo spier
     
     
     
     
+//-------------------Linker bicep-------------------------------------    
+    
     for(int i = P-1; i >= 0; i--){                                              // For-loop used for moving average
         if (i == 0) {
             A[i] = emgabsL;
@@ -78,10 +111,13 @@
     for (int n = 0; n < P-1; n++) {                                             // Summation of array
         sumL = sumL + A[n];
     }
-    movmeanL = sumL/P;     
+    movagL = sumL/P;     
+    
     
     
-    for(int i = P-1; i >= 0; i--){                                              // For-loop used for moving average
+//--------------Rechter bicep---------------------------------------
+    
+    for(int i = Q-1; i >= 0; i--){                                              // For-loop used for moving average
         if (i == 0) {
             B[i] = emgabsR;
             }
@@ -91,25 +127,44 @@
     }
     double sumR = 0;
 
-    for (int n = 0; n < P-1; n++) {                                             // Summation of array
+    for (int n = 0; n < Q-1; n++) {                                             // Summation of array
     sumR = sumR + B[n];
     }
-    movmeanR = sumR/P; //dit is de moving average waarde                        // Moving average value right biceps
+    movagR = sumR/Q;                                                             // Moving average value right biceps
+    
+//---------------Servo spier ------------------------------------    
+    
+    for(int i = R-1; i >= 0; i--){                                              // For-loop used for moving average
+        if (i == 0) {
+            C[i] = emgabsS;
+            }
+         else {
+             C[i] = C[i-1];
+             }   
+    }
+    double sumS = 0;
+    for (int n = 0; n < R-1; n++) {                                             // Summation of array
+        sumS = sumS + C[n];
+    }
+    movagS = sumS/R;     
     
     /* Set the sampled emg values in channel 0 (the first channel) and 1 (the second channel) in the 'HIDScope' instance named 'scope' */
-   // scope.set(0, emgL.read() );
-    //scope.set(1, movmeanL);
-    //scope.set(2, emgR.read());
-    //scope.set(3, movmeanR);
+    scope.set(0, emgL.read());
+    scope.set(1, movagL);
+    scope.set(2, emgR.read());
+    scope.set(3, movagR);
+    scope.set(4, emgS.read());
+    scope.set(5, movagS);
     /* Repeat the step above if required for more channels of required (channel 0 up to 5 = 6 channels) 
     *  Ensure that enough channels are available (HIDScope scope( 2 ))
     *  Finally, send all channels to the PC at once */
-   // scope.send();                                                     // Moving average value left biceps
+    scope.send();                                                     // Moving average value left biceps
 
 
-    if (TestButton==0 & k<200) {                                                // Loop used for gaining max and zero value
-        Lvector[k] = movmeanL;
-        Rvector[k] = movmeanR;
+    if (CalButton==0 & k<200) {                                                 // Loop used for gaining max and zero value
+        Lvector[k] = movagL;
+        Rvector[k] = movagR;
+        Svector[k] = movagS;
         
         if (x==0){
         ledB = !ledB;                                                           // SPIER NIET AANSPANNEN BIJ BLAUW
@@ -122,12 +177,15 @@
     else if (k==200) {                                                          // End of the loop, used for calculation value
         double sumY = 0;
         double sumZ = 0;
+        double sumX = 0;
             for (int n = 0; n < 199; n++) {                                     
             sumY = sumY + Lvector[n];
             sumZ = sumZ + Rvector[n];
+            sumX = sumX + Svector[n];
             } 
         Lwaarde[x] = sumY/200;                                                  // Value of zero for left biceps
-        Rwaarde[x] = sumZ/200;                                                  // Value of zero for rigth biceps
+        Rwaarde[x] = sumZ/200;                                                  // Value of zero for right biceps
+        Swaarde[x] = sumX/200;                                                  // Value of zero for Servo spier
         k++;
         ledB = 1;
         ledR = 1;
@@ -147,6 +205,7 @@
     {
         thresholdL = Lwaarde[0]+(Lwaarde[1]-Lwaarde[0])*(0.25f);
         thresholdR = Rwaarde[0]+(Rwaarde[1]-Rwaarde[0])*(0.25f);
+        thresholdS = Swaarde[0]+(Swaarde[1]-Swaarde[0])*(0.25f);
     }
 }
 
@@ -158,23 +217,24 @@
 emgSampleTicker.attach( &emgSample, 0.002 );                                    // Ticker for EMG function
 Lwaarde[0] = 0.01;                                                              // Startvalue for zerovalue, to - 
 Rwaarde[0] = 0.01;                                                              // - prevent dividing by 0
+Swaarde[0] = 0.01;
     while(1) {
         
-        if (movmeanR > thresholdR)
-        {   myservo = 0.5;
-            wait(0.01);
-        }
-        else {
-            myservo = 0.0;
-            wait(0.01);
-            }
-            
-        if (movmeanL > thresholdL)
-        {   motor1control.write(0.8);
-            motor1direction.write(true);
-            }
-        else {
-            motor1control.write(0);
-            }
+     //   if (movmeanR > thresholdR)
+//        {   myservo = 0.5;
+//            wait(0.01);
+//        }
+//        else {
+//            myservo = 0.0;
+//            wait(0.01);
+//            }
+//            
+//        if (movmeanL > thresholdL)
+//        {   motor1control.write(0.8);
+//            motor1direction.write(true);
+//            }
+//        else {
+//            motor1control.write(0);
+//            }
     }
 }
\ No newline at end of file