to send emg signal to motor with test programm
Dependencies: HIDScope biquadFilter mbed
Fork of EMGvoorjan by
Diff: main.cpp
- 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