Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: Demo_TEST3 QEI biquadFilter mbed
Fork of Demo_TEST3 by
Diff: main.cpp
- 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