to send emg signal to motor with test programm

Dependencies:   HIDScope biquadFilter mbed

Fork of EMGvoorjan by Roy Theussing

Revision:
28:4b22455930ff
Parent:
27:674193a62e06
Child:
29:a48b63e60a40
--- a/main.cpp	Tue Oct 24 12:58:41 2017 +0000
+++ b/main.cpp	Wed Oct 25 11:24:25 2017 +0000
@@ -1,52 +1,45 @@
 #include "mbed.h"
 #include "HIDScope.h"
 #include "BiQuad.h"
-#include "math.h" 
+#include "math.h"
+#include "Serial.h" 
 
 
 //Define objects
-AnalogIn    emg0( A0 );
-AnalogIn    emg1( A1 );
-
-Ticker      sample_timer;
-HIDScope    scope( 3 );
-DigitalOut  led(LED1);
+AnalogIn    emg( A0 ); //EMG
+AnalogIn    emg1( A1 ); //EMG
+HIDScope    scope( 5 ); // aantal scopes dat gemaakt kan worden
+DigitalOut  ledB(LED_BLUE); 
+DigitalOut  ledG(LED_GREEN);
+DigitalIn TestButton(PTA4); // button naast het ledje
+DigitalIn onoff(PTC6); // button aan de andere kant
+Ticker emgSampleTicker; // Ticker voor de sample frequency
 
-/** Sample function
- * this function samples the emg and sends it to HIDScope
- **/
- int P= 200;
- double A[200];
- 
+
+ int P= 200; // aantal test punten voor de moving average
+ double A[200]; // de vector waar punten in worden opgeslagen voor de moving average moet even groot zijn als P
+ int k = 0; // counter voor de configuratie
+ double Vvector[200]; // vector voor de Vwaarde configuratie
+ double Vwaarde[2]; // vector voor waardes van V
+ int x = 0; // x waarde voor de Vwaarde
  
-void sample()
-{
-    /* 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, emg0.read() );
-    scope.set(1, emg1.read() );
-    /* 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();
-    /* To indicate that the function is working, the LED is toggled */
-    led = !led;
-}
+ // Filters 
+BiQuadChain bqc;
+BiQuad bq1( 0.6844323315947305,1.368864663189461, 0.6844323315947305,1.2243497755555954,0.5133795508233265); //lp?
+BiQuad bq2( 0.6844323315947306, -1.3688646631894612,  0.6844323315947306,   -1.2243497755555959, 0.5133795508233266); //hp?
+BiQuad bq3(  0.7566897754116633, -1.2243497755555959,  0.7566897754116633,   -1.2243497755555959, 0.5133795508233266); // notch?
 
-BiQuadChain bqc;
-BiQuad bq1( 0.6844323315947305,1.368864663189461, 0.6844323315947305,1.2243497755555954,0.5133795508233265);
-BiQuad bq2( 0.6844323315947306, -1.3688646631894612,  0.6844323315947306,   -1.2243497755555959, 0.5133795508233266);
-BiQuad bq3(  0.7566897754116633, -1.2243497755555959,  0.7566897754116633,   -1.2243497755555959, 0.5133795508233266);
+
 
-Ticker emgSampleTicker;
-AnalogIn emg( A0 );
-
+// sample function voor plotten van de emg signalen en moving average 
 void emgSample() {
     
-    double emgFiltered = bqc.step( emg.read() );
-    double emgabs = abs(emgFiltered);
-    scope.set(0, emgFiltered );
-    scope.set(1, emgabs );
+    double emgFiltered = bqc.step( emg.read() ); // gefilterde waarde van het emg signaal
+    double emgabs = abs(emgFiltered); // absolute waarde van het gefilterde signaal
+    scope.set(0, emgFiltered ); // stuurt de waarden naar de grafiek
+    scope.set(1, emgabs ); // stuurt de waarden naar de grafiek
     
+    // deze for-loop maakt de vector voor de moving average
     for(int i = P-1; i >= 0; i--){
         if (i == 0) {
             A[i] = emgabs;
@@ -54,28 +47,59 @@
          else {
              A[i] = A[i-1];
              }   
-        }
+    }
     double sum = 0;
+    // deze for-loop sommeert de array
     for (int n = 0; n < P-1; n++) {
     sum = sum + A[n];
     }
     
-    double movmean = sum/P;
+    double movmean = sum/P; //dit is de moving average waarde
     
-    scope.set(2, movmean);
+    // hier wordt het test programma opgestart, zodat zero waarde kan worden gekregen
+    if (TestButton==0 & k<200) {
+        Vvector[k] = movmean;
+        ledB = !ledB;
+        k++;
+    }    
+    else if (k==200) { // hier moet de test klaar zijn
+        double sumZ = 0;
+            for (int n = 0; n < 199; n++) {
+            sumZ = sumZ + Vvector[n];
+            } // neemt de som van de zerovector array
+        Vwaarde[x] = sumZ/200; // dit is het gemiddelde voor een betrouwbare value
+        scope.set(3,Vwaarde[0]); //stuurt de zeroV waarde naar het plotje
+        if (x == 1) {
+            scope.set(4,Vwaarde[1]); //stuurt de maxV waarde naar het plotje
+        }
+        k++;
+        ledB = 1;
+        ledG = !ledG;
+    }
+    else if (k == 201 && onoff ==0) {// dit is om het ledje uit te doen en om het mogelijk te maken de test opnieuw te doen
+        ledG = !ledG;
+        k = 0;
+        if (x==0) {
+            x++;
+        }
+        else if (x==1) {
+            x=0;
+        }
+    }
+         
+    scope.set(2, movmean); // stuurt de moving average naar de plot
+    
     scope.send();
 }
 
 
+
 int main()
-{   
-bqc.add( &bq1 ).add( &bq2 ).add( &bq3 );
-emgSampleTicker.attach( &emgSample, 0.002 );
-    /**Attach the 'sample' function to the timer 'sample_timer'.
-    * this ensures that 'sample' is executed every... 0.002 seconds = 500 Hz
-    */
-    //sample_timer.attach(&sample, 0.01);
-
-    /*empty loop, sample() is executed periodically*/
+{  
+ledB = 1;
+ledG = 1;
+bqc.add( &bq1 ).add( &bq2 ).add( &bq3 ); // hier wordt het filter gemaakt
+emgSampleTicker.attach( &emgSample, 0.002 ); //dit bepaald de sample frequency en is nu 500 Hz
+ 
     while(1) {}
 }
\ No newline at end of file