
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
Revision 6:edd30e11f3c7, committed 2017-11-01
- Comitter:
- peterknoben
- Date:
- Wed Nov 01 13:42:17 2017 +0000
- Parent:
- 5:b4abbd3c513c
- Child:
- 7:105e3ae0fb19
- Commit message:
- sdgf
Changed in this revision
--- 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); } }