Working EMG signals Mode control Direction control Position control Speed control

Dependencies:   AnglePosition2 Encoder FastPWM HIDScope MODSERIAL Movement PIDController Servo SignalNumber2 biquadFilter mbed

Fork of kinematics_control_copyfds by Peter Knoben

Files at this revision

API Documentation at this revision

Comitter:
peterknoben
Date:
Wed Nov 01 13:42:17 2017 +0000
Parent:
5:b4abbd3c513c
Child:
7:105e3ae0fb19
Commit message:
sdgf

Changed in this revision

Movement.lib Show annotated file Show diff for this revision Revisions of this file
SignalNumber.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/Movement.lib	Wed Nov 01 11:47:03 2017 +0000
+++ b/Movement.lib	Wed Nov 01 13:42:17 2017 +0000
@@ -1,1 +1,1 @@
-https://os.mbed.com/users/peterknoben/code/Movement/#03e2651b4a24
+https://os.mbed.com/users/peterknoben/code/Movement/#43a6498000e8
--- a/SignalNumber.lib	Wed Nov 01 11:47:03 2017 +0000
+++ b/SignalNumber.lib	Wed Nov 01 13:42:17 2017 +0000
@@ -1,1 +1,1 @@
-https://os.mbed.com/users/peterknoben/code/SignalNumber2/#15543c143a63
+https://os.mbed.com/users/peterknoben/code/SignalNumber2/#1a677b57ce81
--- a/main.cpp	Wed Nov 01 11:47:03 2017 +0000
+++ b/main.cpp	Wed Nov 01 13:42:17 2017 +0000
@@ -20,6 +20,7 @@
 
 InterruptIn But2(PTA4);             //Declare button for min calibration
 InterruptIn But1(PTC6);             //Declare button for max calibration
+InterruptIn Mode(D7);
 
 AnglePosition Angle;                //Declare Angle calculater
 PIDControl PID;                     //Declare PID Controller
@@ -40,6 +41,7 @@
 DigitalOut  Led_red(LED_RED);          
 DigitalOut  Led_green(LED_GREEN);
 DigitalOut  Led_blue(LED_BLUE);  
+DigitalOut  test(D2);
 
 const float CONTROLLER_TS = 0.02;   //Motor frequency
 const float MEAN_TS = 0.002;        //Filter frequency
@@ -51,19 +53,28 @@
 // Filtering the signal and getting the usefull information out of it.
 const int n = 400;                  //Window size for the mean value, also adjust in signalnumber.cpp
 const int action =50;               //Number of same mean values to change the signalnumber
-const int m = 300;                  //Number of samples for calibration
+const int m = 400;                  //Number of samples for calibration
 int CaseLeft, CaseRight, CaseMode;           //Strength of the muscles 
 float emg_offsetLeft, emg_offsetmaxLeft;     //Calibration offsets from zero to one for the left arm
 float emg_offsetRight, emg_offsetmaxRight;   //Calibration offsets from zero to one for the right arm
 float emg_offsetMode, emg_offsetmaxMode;
 float mean_value_left, mean_value_right, mean_value_mode;   //Mean value of the filtered system
 float kLeft, kRight, kMode;            //Scaling factors
+float Signal_filteredLeft, Signal_filteredRight, Signal_filteredMode;
 
 //BiQuad filter variables
-BiQuad LP1( 0.6389437261127493, 1.2778874522254986, 0.6389437261127493, 1.1429772843080919, 0.4127976201429053 ); //Lowpass filter Biquad
-BiQuad HP2( 0.8370879899975344, -1.6741759799950688, 0.8370879899975344, -1.6474576182593796, 0.7008943417307579 ); //Highpass filter Biquad
-BiQuad NO3( 0.7063988100714527, -1.1429772843080923, 0.7063988100714527, -1.1429772843080923,  0.41279762014290533); //Notch filter Biquad 
-BiQuadChain BiQuad_filter;
+BiQuad LP1L( 0.6389437261127493, 1.2778874522254986, 0.6389437261127493, 1.1429772843080919, 0.4127976201429053 ); //Lowpass filter Biquad
+BiQuad HP2L( 0.8370879899975344, -1.6741759799950688, 0.8370879899975344, -1.6474576182593796, 0.7008943417307579 ); //Highpass filter Biquad
+BiQuad NO3L( 0.7063988100714527, -1.1429772843080923, 0.7063988100714527, -1.1429772843080923,  0.41279762014290533); //Notch filter Biquad 
+BiQuad LP1R( 0.6389437261127493, 1.2778874522254986, 0.6389437261127493, 1.1429772843080919, 0.4127976201429053 ); //Lowpass filter Biquad
+BiQuad HP2R( 0.8370879899975344, -1.6741759799950688, 0.8370879899975344, -1.6474576182593796, 0.7008943417307579 ); //Highpass filter Biquad
+BiQuad NO3R( 0.7063988100714527, -1.1429772843080923, 0.7063988100714527, -1.1429772843080923,  0.41279762014290533); //Notch filter Biquad 
+BiQuad LP1M( 0.6389437261127493, 1.2778874522254986, 0.6389437261127493, 1.1429772843080919, 0.4127976201429053 ); //Lowpass filter Biquad
+BiQuad HP2M( 0.8370879899975344, -1.6741759799950688, 0.8370879899975344, -1.6474576182593796, 0.7008943417307579 ); //Highpass filter Biquad
+BiQuad NO3M( 0.7063988100714527, -1.1429772843080923, 0.7063988100714527, -1.1429772843080923,  0.41279762014290533); //Notch filter Biquad 
+BiQuadChain BiQuad_filter_Left;
+BiQuadChain BiQuad_filter_Right;
+BiQuadChain BiQuad_filter_Mode;
 
 
 //Calibration-------------------------------------------------------------------
@@ -82,9 +93,9 @@
 // One calibration
 void maxcalibration(){
     pc.printf("start max calibration \r\n");
-    emg_offsetmaxLeft = SignalLeft.calibrate(m,(emg0))-emg_offsetLeft;
-    emg_offsetmaxRight = SignalRight.calibrate(m,(emg2))-emg_offsetRight;
-    emg_offsetmaxMode = SignalMode.calibrate(m, (emg4))-emg_offsetMode;
+    emg_offsetmaxLeft = SignalLeft.calibrate(m, emg0)-emg_offsetLeft;
+    emg_offsetmaxRight = SignalRight.calibrate(m, emg2)-emg_offsetRight;
+    emg_offsetmaxMode = SignalMode.calibrate(m, emg4)-emg_offsetMode;
     kLeft = 1/emg_offsetmaxLeft;
     kRight = 1/emg_offsetmaxRight;
     kMode = 1/emg_offsetmaxMode;
@@ -94,9 +105,19 @@
 
 //Filtering the signals---------------------------------------------------------
 //Filter de EMG signals with a BiQuad filter
-float Filter(float input, float offset){
+float FilterLeft(float input, float offset){
+    float Signal=(input-offset);                    //((input0+input1)/2)
+    float Signal_filtered= BiQuad_filter_Left.step(Signal);
+    return Signal_filtered;
+}
+float FilterRight(float input, float offset){
     float Signal=input-offset;                    //((input0+input1)/2)
-    float Signal_filtered= BiQuad_filter.step(Signal);
+    float Signal_filtered= BiQuad_filter_Right.step(Signal);
+    return Signal_filtered;
+}
+float FilterMode(float input, float offset){
+    float Signal=input-offset;                    //((input0+input1)/2)
+    float Signal_filtered= BiQuad_filter_Mode.step(Signal);
     return Signal_filtered;
 }
 
@@ -105,17 +126,17 @@
 //---------------------------------Servo----------------------------------------
 //------------------------------------------------------------------------------
 void servo(){
-    float Signal_filteredLeft = fabs(Filter(emg0, emg_offsetLeft));
-    float Signal_filteredRight = fabs(Filter(emg2, emg_offsetRight));
+    Signal_filteredLeft = fabs(FilterLeft(emg0, emg_offsetLeft));
+    Signal_filteredRight = fabs(FilterRight(emg2, emg_offsetRight));
     CaseLeft = SignalLeft.getnumber(n, action, Signal_filteredLeft, kLeft);
     CaseRight = SignalRight.getnumber(n, action, Signal_filteredRight, kRight);
     if (CaseLeft>=3){
-        Up = 1; 
-        Up = 0;
+        Up = 0; 
+        Up = 1;
     }
     else if (CaseRight >=3){
+        Down = 0;
         Down = 1;
-        Down = 0;
     }
 }
 int milli =0;
@@ -141,21 +162,27 @@
 
 // Control mode selection-------------------------------------------------------
 
+
+
+
+
+
+
 //Determine the signalnumbers (i.e. speed) based on the strenght of the EMG signals
 void signalnumber(){
     //Left
-    float Signal_filteredLeft = fabs(Filter(emg0, emg_offsetLeft));
+    Signal_filteredLeft = fabs(FilterLeft(emg0, emg_offsetLeft));
     mean_value_left = SignalLeft.getmean(n, Signal_filteredLeft)*kLeft;          
     CaseLeft = SignalLeft.getnumber(n, action, Signal_filteredLeft, kLeft);
     //Right
-    float Signal_filteredRight = fabs(Filter(emg2, emg_offsetRight));
+    Signal_filteredRight = fabs(FilterRight(emg2, emg_offsetRight));
     mean_value_right = SignalRight.getmean(n, Signal_filteredRight)*kRight; 
     CaseRight = SignalRight.getnumber(n, action, Signal_filteredRight, kRight);
     //Mode
-    float Signal_filteredMode = fabs(Filter(emg4, emg_offsetMode));
+    Signal_filteredMode = fabs(FilterMode(emg4, emg_offsetMode));
     mean_value_mode = SignalMode.getmean(n, Signal_filteredMode)*kMode;
     CaseMode = SignalMode.getnumber(n, action, Signal_filteredMode, kMode);
-    if(CaseMode >= 3){
+    /*if(CaseMode >= 3){
         milli ++;
         if(milli>=150){
             mode_selection();
@@ -164,11 +191,16 @@
     }
     else{
         milli=0;
-    }
+    }*/
 }
 
 
 
+
+
+
+
+
 //------------------------------------------------------------------------------
 //-------------------------Kinematic Constants----------------------------------
 //------------------------------------------------------------------------------
@@ -199,7 +231,7 @@
 double M1_v1 = 0.0, M1_v2 = 0.0; //Calculation values
 const double motor1_gain = 2*PI;
 const float M1_N = 0.5;
-static float position_math[2]={};
+float position_math[2]={};
 
 void motor1_control(){
     float reference_alpha = Angle.getbeta(max_rangex, max_rangey, x_offset, y_offset, beta_offset, L1, L2, position_math[0], position_math[1]);
@@ -258,10 +290,14 @@
 
 int main(){
     pc.baud(115200);
+    test=0;
     setled(); 
-    BiQuad_filter.add( &LP1 ).add( &HP2 ).add( &NO3);
+    BiQuad_filter_Left.add( &LP1L ).add( &HP2L ).add( &NO3L);
+    BiQuad_filter_Right.add( &LP1R ).add( &HP2R ).add( &NO3R);
+    BiQuad_filter_Mode.add( &LP1M ).add( &HP2M ).add( &NO3M);
     But2.rise(&mincalibration);
     But1.rise(&maxcalibration);
+    Mode.rise(&mode_selection);
     motor1.period(0.0001f); motor2.period(0.0001f);
     MyControllerTicker.attach(&motor_control, CONTROLLER_TS); 
     MyTickerMean.attach(&signalnumber, MEAN_TS);
@@ -270,8 +306,9 @@
 //    MyTickerMean.attach(&signalmode,MEAN_TS);
 
     while(1) {
-        pc.printf("Mean %f %f %f \r\n", mean_value_left, mean_value_right, mean_value_mode);
+//        pc.printf("Mean %f %f %f \r\n", mean_value_left, mean_value_right, mean_value_mode);
 //        pc.printf("Case %i %i %i, mode = %i \r\n", CaseLeft, CaseRight, CaseMode, mode);
+        pc.printf("mean %f , case = %i \r\n", mean_value_left, CaseLeft);
         wait(0.1f);
     }
 }