Werkt. (hopelijk)

Dependencies:   MODSERIAL mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "MODSERIAL.h"
00003 
00004 //Define objects
00005 AnalogIn    emg_biceps(PTB0);
00006 AnalogIn    emg_triceps(PTB1);
00007 AnalogIn    emg_flexoren(PTB2);
00008 AnalogIn    emg_extensoren(PTB3); //Analog input
00009 PwmOut      red(LED_RED); //PWM output
00010 Ticker timer;
00011 MODSERIAL pc(USBTX,USBRX,64,1024);
00012 
00013 #define offset_biceps 0 // offset ruwe invoer met adapter motoren, waar toepassen?
00014 
00015 //high pass filter constantes 15Hz cutoff 4e orde, Fs = 312,5Hz (geeft een wat mooiere waarde voor periode en is geen veelvoud van 50Hz)
00016 #define NUM0 0.6731 // constante
00017 #define NUM1 -2.6925 // z^-1
00018 #define NUM2 4.0388 // z^-2etc.
00019 #define NUM3 -2.6925
00020 #define NUM4 0.6731
00021 
00022 #define DEN0 1 // constante
00023 #define DEN1 -3.2133
00024 #define DEN2 3.9348
00025 #define DEN3 -2.1689
00026 #define DEN4 0.4531
00027 
00028 //lowpass filter constantes 4Hz 4e orde, Fs = 312,5 Hz
00029 #define NUM0_3 0.00000236 // constante
00030 #define NUM1_3 0.00000944 // z^-1
00031 #define NUM2_3 0.00001415 // z^-2etc.
00032 #define NUM3_3 0.00000944
00033 #define NUM4_3 0.00000236
00034 
00035 #define DEN0_3 1 // constante
00036 #define DEN1_3 -3.7899
00037 #define DEN2_3 5.3914
00038 #define DEN3_3 -3.4119
00039 #define DEN4_3 0.8104
00040 
00041 float std_dev (float input, int sig_number){
00042  //   define variables
00043     static int startcount=0;
00044     float sum;
00045     int size = 20;
00046     float sig_out;
00047     float mean;
00048     static int count_biceps=0;
00049     static int count_triceps=0;
00050     static int count_flexoren=0;
00051     static int count_extensoren=0;
00052     static float keeper_biceps[20];
00053     static float keeper_triceps[20];
00054     static float keeper_flexoren[20];
00055     static float keeper_extensoren[20];
00056     
00057     if (startcount >= size)
00058         {//ja, dan gewoon std dev nemen, want keeper is al vol
00059         switch(sig_number){
00060         case 1:
00061             keeper_biceps[count_biceps]=input;
00062             count_biceps++;
00063             if(count_biceps >= size)
00064                 count_biceps=0;
00065             //sizeof(keeper_biceps)/sizeof(float);
00066             for(int i=0; i < size; i++)
00067                 {sum+=keeper_biceps[i];        
00068                 }
00069             mean=sum/size;
00070             sum=0;
00071             for(int i=0; i < size; i++)
00072             {sum+=(keeper_biceps[i]-mean)*(keeper_biceps[i]-mean);
00073             }
00074             sig_out=sqrt(sum/size);
00075             sum=0;
00076             break;
00077         case 2:
00078             keeper_triceps[count_triceps]=input;
00079             count_triceps++;
00080             if(count_triceps==size)
00081                 count_triceps=0;
00082             //sizeof(keeper_triceps) / sizeof(float);
00083             for(int i=0; i < size; i++){
00084                 sum+=keeper_triceps[i];        
00085             }
00086             mean=sum/size;
00087             sum=0;
00088             for(int i=0; i < size; i++){
00089                 sum+=(keeper_triceps[i]-mean)*(keeper_triceps[i]-mean);
00090             }
00091             sig_out=sqrt(sum/size);
00092             sum=0;
00093             break;
00094         case 3:
00095             keeper_flexoren[count_flexoren]=input;
00096             count_flexoren++;
00097             if(count_flexoren==size) count_flexoren=0;
00098     
00099             //size=sizeof(keeper_flexoren)/sizeof(float);
00100             for(int i=0; i < size; i++){
00101                 sum+=keeper_flexoren[i];        
00102             }
00103             mean=sum/size;
00104             sum=0;
00105             for(int i=0; i < size; i++){
00106                 sum+=(keeper_flexoren[i]-mean)*(keeper_flexoren[i]-mean);
00107             }
00108             sig_out=sqrt(sum/size);
00109             sum=0;
00110             break;
00111         case 4:
00112             keeper_extensoren[count_extensoren]=input;
00113             count_extensoren++;
00114             if(count_extensoren==size) count_extensoren=0;
00115     
00116             //size=sizeof(keeper_extensoren)/sizeof(float);
00117             for(int i=0; i < size; i++){
00118                 sum+=keeper_extensoren[i];        
00119             }
00120             mean=sum/size;
00121             sum=0;
00122             for(int i=0; i < size; i++){
00123                 sum+=(keeper_extensoren[i]-mean)*(keeper_extensoren[i]-mean);
00124             }
00125             sig_out=sqrt(sum/size);
00126             sum=0;
00127             break;
00128             } // einde switch
00129         return sig_out;
00130         } // einde if startcount ...
00131         else
00132             {startcount+=1;
00133             switch(sig_number){
00134             case 1:
00135                 keeper_biceps[count_biceps]=input;
00136                 count_biceps++;
00137                 if(count_biceps >= size)
00138                     count_biceps=0;
00139                 break;
00140             case 2:
00141                 keeper_triceps[count_triceps]=input;
00142                 count_triceps++;
00143                 if(count_triceps >= size)
00144                     count_triceps=0;
00145                 break;
00146             case 3:
00147                 keeper_flexoren[count_flexoren]=input;
00148                 count_flexoren++;
00149                 if(count_flexoren >= size)
00150                     count_flexoren=0;
00151                 break;
00152             case 4:
00153                 keeper_extensoren[count_extensoren]=input;
00154                 count_extensoren++;
00155                 if(count_extensoren >= size)
00156                     count_extensoren=0;
00157                 break;    
00158             } // einde switch
00159         } // einde else
00160 } // einde std_dev
00161    
00162 float filter(int sig_number){
00163     float sig_out;
00164     // eerst variabelen definieren
00165     
00166     //biceps
00167         //filter 1
00168     float in0_biceps =0;
00169     static float in1_biceps =0, in2_biceps = 0, in3_biceps = 0, in4_biceps = 0;
00170     static float out0_biceps = 0, out1_biceps = 0 , out2_biceps = 0, out3_biceps = 0, out4_biceps = 0;
00171         
00172         //filter 3
00173     float in0_3_biceps =0;
00174     static float in1_3_biceps =0, in2_3_biceps = 0, in3_3_biceps = 0, in4_3_biceps = 0;
00175     static float out0_3_biceps = 0, out1_3_biceps = 0 , out2_3_biceps = 0, out3_3_biceps = 0, out4_3_biceps = 0;
00176         
00177    
00178     //triceps
00179         //filter 1
00180     float in0_triceps =0;
00181     static float in1_triceps =0, in2_triceps = 0, in3_triceps = 0, in4_triceps = 0;
00182     static float out0_triceps = 0, out1_triceps = 0 , out2_triceps = 0, out3_triceps = 0, out4_triceps = 0;
00183         
00184         //filter 3
00185     float in0_3_triceps =0;
00186     static float in1_3_triceps =0, in2_3_triceps = 0, in3_3_triceps = 0, in4_3_triceps = 0;
00187     static float out0_3_triceps = 0, out1_3_triceps = 0 , out2_3_triceps = 0, out3_3_triceps = 0, out4_3_triceps = 0;
00188         
00189     
00190     //flexoren
00191         //filter 1
00192     float in0_flexoren =0;
00193     static float in1_flexoren =0, in2_flexoren = 0, in3_flexoren = 0, in4_flexoren = 0;
00194     static float out0_flexoren = 0, out1_flexoren = 0 , out2_flexoren = 0, out3_flexoren = 0, out4_flexoren = 0;
00195        
00196         //filter 3
00197     float in0_3_flexoren =0;
00198     static float in1_3_flexoren =0, in2_3_flexoren = 0, in3_3_flexoren = 0, in4_3_flexoren = 0;
00199     static float out0_3_flexoren = 0, out1_3_flexoren = 0 , out2_3_flexoren = 0, out3_3_flexoren = 0, out4_3_flexoren = 0;
00200         
00201     
00202     //extensoren
00203         //filter 1
00204     float in0_extensoren =0;
00205     static float in1_extensoren =0, in2_extensoren = 0, in3_extensoren = 0, in4_extensoren = 0;
00206     static float out0_extensoren = 0, out1_extensoren = 0 , out2_extensoren = 0, out3_extensoren = 0, out4_extensoren = 0;
00207         
00208         //filter 3
00209     float in0_3_extensoren =0;
00210     static float in1_3_extensoren =0, in2_3_extensoren = 0, in3_3_extensoren = 0, in4_3_extensoren = 0;
00211     static float out0_3_extensoren = 0, out1_3_extensoren = 0 , out2_3_extensoren = 0, out3_3_extensoren = 0, out4_3_extensoren = 0;
00212         
00213     
00214     
00215     switch(sig_number){            
00216         case 1:        
00217             // signaal filteren op 15 Hz HIGHPASS
00218             in4_biceps = in3_biceps; in3_biceps = in2_biceps; in2_biceps = in1_biceps; in1_biceps = in0_biceps;
00219             in0_biceps = emg_biceps.read() - offset_biceps;
00220             out4_biceps = out3_biceps; out3_biceps = out2_biceps; out2_biceps = out1_biceps; out1_biceps = out0_biceps;           
00221             out0_biceps = (NUM0*in0_biceps + NUM1*in1_biceps + NUM2*in2_biceps + NUM3*in3_biceps + NUM4*in4_biceps - DEN1*out1_biceps - DEN2*out2_biceps - DEN3*out3_biceps - DEN4*out4_biceps ) / DEN0;                      
00222             /*
00223             //signaal filteren op 5Hz LOWPASS
00224             in4_3_biceps = in3_3_biceps; in3_3_biceps = in2_3_biceps; in2_3_biceps = in1_3_biceps; in1_3_biceps = in0_3_biceps;
00225             in0_3_biceps = abs(out0_biceps); // ruw - offset -> filter 1 -> stdev (-> filter 3)
00226             out4_3_biceps = out3_3_biceps; out3_3_biceps = out2_3_biceps; out2_3_biceps = out1_3_biceps; out1_3_biceps = out0_3_biceps;           
00227             out0_3_biceps = (NUM0_3*in0_3_biceps + NUM1_3*in1_3_biceps + NUM2_3*in2_3_biceps + NUM3_3*in3_3_biceps + NUM4_3*in4_3_biceps - DEN1_3*out1_3_biceps - DEN2_3*out2_3_biceps - DEN3_3*out3_3_biceps - DEN4_3*out4_3_biceps ) / DEN0_3;    
00228             */
00229             
00230             sig_out = out0_biceps;
00231             break;
00232         case 2:
00233             // signaal filteren op 15 Hz HIGHPASS
00234             in4_triceps = in3_triceps; in3_triceps = in2_triceps; in2_triceps = in1_triceps; in1_triceps = in0_triceps;
00235             in0_triceps = emg_triceps.read() - offset_biceps;
00236             out4_triceps = out3_triceps; out3_triceps = out2_triceps; out2_triceps = out1_triceps; out1_triceps = out0_triceps;           
00237             out0_triceps = (NUM0*in0_triceps + NUM1*in1_triceps + NUM2*in2_triceps + NUM3*in3_triceps + NUM4*in4_triceps - DEN1*out1_triceps - DEN2*out2_triceps - DEN3*out3_triceps - DEN4*out4_triceps ) / DEN0;                      
00238             
00239        
00240             //signaal filteren op 5Hz LOWPASS
00241             /*in4_3_triceps = in3_3_triceps; in3_3_triceps = in2_3_triceps; in2_3_triceps = in1_3_triceps; in1_3_triceps = in0_3_triceps;
00242             in0_3_triceps = abs(out0_triceps);
00243             out4_3_triceps = out3_3_triceps; out3_3_triceps = out2_3_triceps; out2_3_triceps = out1_3_triceps; out1_3_triceps = out0_3_triceps;           
00244             out0_3_triceps = (NUM0_3*in0_3_triceps + NUM1_3*in1_3_triceps + NUM2_3*in2_3_triceps + NUM3_3*in3_3_triceps + NUM4_3*in4_3_triceps - DEN1_3*out1_3_triceps - DEN2_3*out2_3_triceps - DEN3_3*out3_3_triceps - DEN4_3*out4_3_triceps ) / DEN0_3;    
00245             */
00246             
00247             sig_out = out0_triceps;
00248             break;
00249         case 3:
00250             // signaal filteren op 15 Hz HIGHPASS
00251             in4_flexoren = in3_flexoren; in3_flexoren = in2_flexoren; in2_flexoren = in1_flexoren; in1_flexoren = in0_flexoren;
00252             in0_flexoren = emg_flexoren.read();
00253             out4_flexoren = out3_flexoren; out3_flexoren = out2_flexoren; out2_flexoren = out1_flexoren; out1_flexoren = out0_flexoren;           
00254             out0_flexoren = (NUM0*in0_flexoren + NUM1*in1_flexoren + NUM2*in2_flexoren + NUM3*in3_flexoren + NUM4*in4_flexoren - DEN1*out1_flexoren - DEN2*out2_flexoren - DEN3*out3_flexoren - DEN4*out4_flexoren ) / DEN0;                      
00255     /*
00256             
00257             //signaal filteren op 5Hz LOWPASS
00258             in4_3_flexoren = in3_3_flexoren; in3_3_flexoren = in2_3_flexoren; in2_3_flexoren = in1_3_flexoren; in1_3_flexoren = in0_3_flexoren;
00259             in0_3_flexoren = abs(out0_2_flexoren);
00260             out4_3_flexoren = out3_3_flexoren; out3_3_flexoren = out2_3_flexoren; out2_3_flexoren = out1_3_flexoren; out1_3_flexoren = out0_3_flexoren;           
00261             out0_3_flexoren = (NUM0_3*in0_3_flexoren + NUM1_3*in1_3_flexoren + NUM2_3*in2_3_flexoren + NUM3_3*in3_3_flexoren + NUM4_3*in4_3_flexoren - DEN1_3*out1_3_flexoren - DEN2_3*out2_3_flexoren - DEN3_3*out3_3_flexoren - DEN4_3*out4_3_flexoren ) / DEN0_3;    
00262             
00263             
00264             */
00265             sig_out = out0_flexoren;
00266             break;
00267         case 4:
00268             // signaal filteren op 15 Hz HIGHPASS
00269             in4_extensoren = in3_extensoren; in3_extensoren = in2_extensoren; in2_extensoren = in1_extensoren; in1_extensoren = in0_extensoren;
00270             in0_extensoren = emg_extensoren.read();
00271             out4_extensoren = out3_extensoren; out3_extensoren = out2_extensoren; out2_extensoren = out1_extensoren; out1_extensoren = out0_extensoren;           
00272             out0_extensoren = (NUM0*in0_extensoren + NUM1*in1_extensoren + NUM2*in2_extensoren + NUM3*in3_extensoren + NUM4*in4_extensoren - DEN1*out1_extensoren - DEN2*out2_extensoren - DEN3*out3_extensoren - DEN4*out4_extensoren ) / DEN0;                      
00273     /*
00274             
00275             //signaal filteren op 5Hz LOWPASS
00276             in4_3_extensoren = in3_3_extensoren; in3_3_extensoren = in2_3_extensoren; in2_3_extensoren = in1_3_extensoren; in1_3_extensoren = in0_3_extensoren;
00277             in0_3_extensoren = abs(out0_2_extensoren);
00278             out4_3_extensoren = out3_3_extensoren; out3_3_extensoren = out2_3_extensoren; out2_3_extensoren = out1_3_extensoren; out1_3_extensoren = out0_3_extensoren;           
00279             out0_3_extensoren = (NUM0_3*in0_3_extensoren + NUM1_3*in1_3_extensoren + NUM2_3*in2_3_extensoren + NUM3_3*in3_3_extensoren + NUM4_3*in4_3_extensoren - DEN1_3*out1_3_extensoren - DEN2_3*out2_3_extensoren - DEN3_3*out3_3_extensoren - DEN4_3*out4_3_extensoren ) / DEN0_3;    
00280             
00281             
00282      */       
00283             sig_out = out0_extensoren;
00284             break;
00285     }
00286     return sig_out;
00287 }
00288 
00289 void looper()
00290 {   float emg_value_biceps;
00291     float emg_value_triceps;
00292     float emg_value_flexoren;
00293     float emg_value_extensoren;
00294     float dy;
00295     //static int sig_count = 1;
00296 emg_value_biceps=std_dev(filter(1),1);
00297 emg_value_triceps=std_dev(filter(2),2);
00298 emg_value_flexoren = std_dev(filter(3),3);
00299 emg_value_extensoren = std_dev(filter(4),4);
00300 
00301     if(emg_value_biceps < 4.5)
00302         emg_value_biceps=0;
00303     else if (emg_value_biceps > 13)
00304          emg_value_biceps = 13;
00305     //emg_value_biceps =  emg_value_biceps;
00306     
00307     if(emg_value_triceps < 2.5)
00308         emg_value_biceps=0;
00309     else if (emg_value_biceps > 10)
00310          emg_value_biceps = 10;
00311     //emg_value_triceps =  emg_value_triceps;
00312     
00313     if(emg_value_flexoren < 2)
00314         emg_value_flexoren=0;
00315     else if (emg_value_flexoren > 8)
00316          emg_value_flexoren = 8;
00317     emg_value_flexoren = 2*emg_value_flexoren;
00318     
00319     if(emg_value_extensoren < 5)
00320         emg_value_extensoren=0;
00321     else if (emg_value_extensoren > 13)
00322          emg_value_extensoren = 13;
00323  
00324 dy = emg_value_biceps - emg_value_triceps;
00325 dx = 2*(emg_value_flexoren - emg_value_extensoren);
00326     
00327     if(pc.rxBufferGetSize(0)-pc.rxBufferGetCount() > 30)
00328         pc.printf("%.6f, %.6f, %.6f\n",emg_value_biceps, emg_value_triceps, dy);
00329     /**When not using the LED, the above could also have been done this way:
00330     * pc.printf("%.6\n", emg0.read());
00331     */
00332 }
00333 
00334 int main()
00335 {
00336     /*setup baudrate. Choose the same in your program on PC side*/
00337     pc.baud(115200);
00338     /*set the period for the PWM to the red LED*/
00339     red.period_ms(2);
00340     /**Here you attach the 'void looper(void)' function to the Ticker object
00341     * The looper() function will be called every 1/Fs seconds.
00342     * Please mind that the parentheses after looper are omitted when using attach.
00343     */
00344     timer.attach(looper,0.0032); //invullen in seconde. .0032 is niet eens afgerond, dus vandaar die frequentie.
00345     while(1) //Loop
00346     {
00347       /*Empty!*/
00348       /*Everything is handled by the interrupt routine now!*/
00349     }
00350 }