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: HIDScope MODSERIAL mbed-dsp mbed
Diff: main.cpp
- Revision:
- 4:61bdf601e7b0
- Parent:
- 3:3d5ad874add0
- Child:
- 5:19f8766b63da
--- a/main.cpp Fri Jan 08 11:33:34 2016 +0000 +++ b/main.cpp Fri Jan 08 11:55:49 2016 +0000 @@ -18,10 +18,10 @@ #define Damp 5 //Deceleration of the motor #define Mass 1 // Mass value #define dt 0.01 //Sample frequency -#define EMG_tresh1 0.01 -#define EMG_tresh2 0.01 -#define EMG_tresh3 0.01 -#define EMG_tresh4 0.01 +#define EMG_tresh1 0.015 +#define EMG_tresh2 0.015 +#define EMG_tresh3 0.015 +#define EMG_tresh4 0.015 #define H_Gain 5 #define Pt_x 0.80 #define Pt_y 0.50 @@ -55,10 +55,10 @@ DigitalOut Ledb(LED3); //EMG inputs -AnalogIn emg1(A2); //biceps bottom emg board -AnalogIn emg2(A3); //triceps -AnalogIn emg3(A4); //Pectoralis major -AnalogIn emg4(A5); //Deltoid top emg board +AnalogIn emg1(A2); //biceps or wrist flexors bottom emg board +AnalogIn emg2(A3); //triceps or wirst extensors +AnalogIn emg3(A4); //Pectoralis major or wrist extensors +AnalogIn emg4(A5); //Deltoid or wrist flexors top emg board HIDScope scope(4); Ticker scopeTimer; @@ -82,6 +82,11 @@ arm_biquad_casd_df1_inst_f32 lowpass2_pect; arm_biquad_casd_df1_inst_f32 lowpass2_deltoid; +arm_biquad_casd_df1_inst_f32 highpass_biceps; +arm_biquad_casd_df1_inst_f32 highpass_triceps; +arm_biquad_casd_df1_inst_f32 highpass_pect; +arm_biquad_casd_df1_inst_f32 highpass_deltoid; + //used as extra filter for wrist motion arm_biquad_casd_df1_inst_f32 bandstop_biceps; arm_biquad_casd_df1_inst_f32 bandstop_triceps; @@ -93,11 +98,10 @@ float lowpass1_const[] = {0.956543225556877,1.91308645111375,0.956543225556877,-1.91119706742607,-0.914975834801434}; float lowpass2_const[] = {0.000609854718717299,0.00121970943743460,0.000609854718717299,1.92894226325203,-0.931381682126903}; //highpass filter settings: Fc = 20 Hz, Fs = 100 Hz - float highpass_const[] = {0.391335772501769,-0.782671545003538,0.391335772501769,0.369527377351241,-0.195815712655833}; - //bandstop filter settings Fc=[29Hz 36Hz], Fs= 100Hz float bandstop_const[] = {0.732022476556623, 0.681064744276583,0.732022476556623,-0.535944148680739,-0.713976335521464,1,0.930387749130681,1,-1.04147956553087,-0.752398361226849}; + /* //values are usable for triceps and biceps continuous motion, not for wrist motion. //lowpass 1 filter settings: Fc = 45 Hz, Fs = 100 Hz, Gain = -3 dB @@ -131,10 +135,6 @@ float highpass_const[] = {0.391335772501769, -0.782671545003537,0.391335772501769,0.369527377351241,-0.195815712655833 }; */ -arm_biquad_casd_df1_inst_f32 highpass_biceps; -arm_biquad_casd_df1_inst_f32 highpass_triceps; -arm_biquad_casd_df1_inst_f32 highpass_pect; -arm_biquad_casd_df1_inst_f32 highpass_deltoid; //state values float lowpass1_biceps_states[4]; @@ -158,7 +158,7 @@ float bandstop_deltoid_states[8]; -//global variabels +//global variables float filtered_biceps, filtered_triceps, filtered_pect, filtered_deltoid; float speed_old1, speed_old2, speed_old3, speed_old4; float acc1, acc2, acc3, acc4; @@ -185,40 +185,38 @@ emg_value3_f32 = emg3.read(); emg_value4_f32 = emg4.read(); - //process emg biceps + //Biquad process emg biceps arm_biquad_cascade_df1_f32(&bandstop_biceps, &emg_value1_f32, &filtered_biceps, 1 );//used for wrist motion arm_biquad_cascade_df1_f32(&lowpass1_biceps, &filtered_biceps, &filtered_biceps, 1 ); arm_biquad_cascade_df1_f32(&highpass_biceps, &filtered_biceps, &filtered_biceps, 1 ); filtered_biceps = fabs(filtered_biceps); //Rectifier, The Gain is already implemented. arm_biquad_cascade_df1_f32(&lowpass2_biceps, &filtered_biceps, &filtered_biceps, 1 ); //low pass filter - //process emg triceps + //Biquad process emg triceps arm_biquad_cascade_df1_f32(&bandstop_triceps, &emg_value2_f32, &filtered_triceps, 1 ); //used for wrist motion arm_biquad_cascade_df1_f32(&lowpass1_triceps, &filtered_triceps, &filtered_triceps, 1 ); arm_biquad_cascade_df1_f32(&highpass_triceps, &filtered_triceps, &filtered_triceps, 1 ); filtered_triceps = fabs(filtered_triceps); arm_biquad_cascade_df1_f32(&lowpass2_triceps, &filtered_triceps, &filtered_triceps, 1 ); - //process emg pectoralis major + //Biquad process emg pectoralis major arm_biquad_cascade_df1_f32(&bandstop_pect, &emg_value3_f32, &filtered_pect, 1 );//used for wrist motion arm_biquad_cascade_df1_f32(&lowpass1_pect, &filtered_pect, &filtered_pect, 1 ); arm_biquad_cascade_df1_f32(&highpass_pect, &filtered_pect, &filtered_pect, 1 ); filtered_pect = fabs(filtered_pect); arm_biquad_cascade_df1_f32(&lowpass2_pect, &filtered_pect, &filtered_pect, 1 ); - //process emg deltoid + //Biquad process emg deltoid arm_biquad_cascade_df1_f32(&bandstop_deltoid, &emg_value4_f32, &filtered_deltoid, 1 );//used for wrist motion arm_biquad_cascade_df1_f32(&lowpass1_deltoid, &filtered_deltoid, &filtered_deltoid, 1 ); arm_biquad_cascade_df1_f32(&highpass_deltoid, &filtered_deltoid, &filtered_deltoid, 1 ); filtered_deltoid = fabs(filtered_deltoid); arm_biquad_cascade_df1_f32(&lowpass2_deltoid, &filtered_deltoid, &filtered_deltoid, 1 ); -// send value to PC. +// send value to PC for control scope.set(0,filtered_biceps); //Filtered EMG signals scope.set(1,filtered_triceps); - /*scope.set(2,filtered_pect); - scope.set(3,filtered_deltoid);*/ scope.set(2,filtered_pect); scope.set(3,filtered_deltoid); scope.send(); @@ -229,8 +227,8 @@ void looper_motory() { - /*emg_y = (filtered_biceps - filtered_triceps); - emg_y_abs = fabs(emg_y); + emg_y = (filtered_biceps - filtered_triceps); + /*emg_y_abs = fabs(emg_y); force1 = emg_y_abs*K_Gain; force1 = force1 - damping1; acc1 = force1/Mass; @@ -239,9 +237,27 @@ step_freq1 = setpoint * speed1;*/ // Stepy.period(/*1.0/step_freq1*/0.000625); //speed_old1 = speed1; + + if (emg_y > 0) { + Diry = 1; + } + if (emg_y < 0) { + Diry = 0; + } + /*//Speed limit + if (speed2 > 1) { + speed2 = 1; + step_freq2 = setpoint; + }*/ + //EMG treshold + if (filtered_biceps < EMG_tresh1 && filtered_triceps < EMG_tresh2) { + Enabley = 1; //Enable = 1 turns the motor off. + } else { + Enabley = 0; + } //0.06 for biceps and triceps movement, 0.04 for wrist lower and upper motion right arm lower2 connections - if (filtered_triceps > 0.04) {//upward cart movement + /* if (filtered_triceps > 0.04) {//upward cart movement Diry.write(1); Enabley.write(0); //Enable = 1 turns the motor off. Ledr.write(0); @@ -258,7 +274,7 @@ } else{} //Speed limit - /*if (speed1 > 1) { + if (speed1 > 1) { speed1 = 1; step_freq1 = setpoint; }*/ @@ -313,8 +329,8 @@ else if (filtered_pect < 0.01 && filtered_deltoid < 0.01) {//0.04 for biceps and triceps stop, 0.01 for wrist lower and upper stop Enablex.write(1); } - else{} -}*/ + else{}*/ +} int main() {