Changed some stuff
Fork of EMG by
emg.cpp
- Committer:
- dubbie
- Date:
- 2015-10-27
- Revision:
- 25:6d1b035f4838
- Parent:
- 24:b7b3e87e0687
- Child:
- 27:25d0ee8cd7b7
- Child:
- 28:5a12ce2fa441
File content as of revision 25:6d1b035f4838:
#include "mbed.h" #include "HIDScope.h" #define MOV_AVG_NUM 100 //Define objects AnalogIn b_emg(A0); //Analog input bicep AnalogIn t_emg(A1); //Analog input tricep AnalogIn p_emg(A2); //Analog input bicep for push double b_highV[4]; double b_lowV[4]; double t_highV[4]; double t_lowV[4]; double p_highV[4]; double p_lowV[4]; //double lastOutputs[MOV_AVG_NUM-1]; double filter(double input, double coeff_input[], double coeff_output[], double prev_outputs[]) { double new_input = input; for(int i=1; i<5; i++) new_input -= coeff_input[i] * prev_outputs[i-1]; double new_output = coeff_output[0] * new_input; for(int i=1; i<5; i++) new_output += coeff_output[i] * prev_outputs[i-1]; // Set the new output as the first value of the 'recent outputs' for(int i = 3; i > 0; i--) prev_outputs[i] = prev_outputs[i-1]; prev_outputs[0] = new_input; return new_output; } double fh_b[]= {0.7602, -3.0406, 4.5609, -3.0406, 0.7602}; double fh_a[]= {1, -3.4532, 4.5041, -2.6273, 0.5778}; double b_highpass_filter(double u) { return filter(u, fh_a, fh_b, t_highV); } double t_highpass_filter(double u) { return filter(u, fh_a, fh_b, b_highV); } double p_highpass_filter(double u) { return filter(u, fh_a, fh_b, p_highV); } double fl_b[]= {0.00001329, 0.00005317, 0.00007976, 0.00005317, 0.00001329}; double fl_a[]= {1.0000, -3.6717, 5.0680, -3.1160, 0.7199}; double b_lowpass_filter(double u) { return filter(u, fl_a, fl_b, t_lowV); } double t_lowpass_filter(double u) { return filter(u, fl_a, fl_b, b_lowV); } double p_lowpass_filter(double u) { return filter(u, fl_a, fl_b, p_lowV); } double last_biceps = 0; double last_triceps = 0; double last_push = 0; /** Sample function * this function samples the emg and sends it to HIDScope **/ void sample(double& bicout, double& tricout, double& pushout) { double b_input = b_emg.read(); double output1 = b_highpass_filter(b_input); double output2 = fabs(output1); double output3 = b_lowpass_filter(output2); double t_input = t_emg.read(); double output4 = t_highpass_filter(t_input); double output5 = fabs(output4); double output6 = t_lowpass_filter(output5); double p_input = p_emg.read(); double output7 = p_highpass_filter(p_input); double output8 = fabs(output7); double output9 = p_lowpass_filter(output8); /*double tot = output3; for(int i=0; i<MOV_AVG_NUM-1; i++) { tot += lastOutputs[i]; if(i != 0) lastOutputs[i] = lastOutputs[i-1]; } lastOutputs[0] = output3; output3 = tot/MOV_AVG_NUM;*/ /* Second, set the sampled emg value in channel zero (the first channel) in the 'HIDScope' variable named 'scope' */ if (last_biceps == 0 and output3 > 0.06) { bicout = 1; } else if (last_biceps == 1 and output3 < 0.045) { bicout = 0; } else { bicout = last_biceps; } last_biceps = bicout; /*if (output3>0.06) {//This is the output for the right bicep bicout=1; } else if(output3>0.04) { bicout=0.5; } else { bicout=0; }*/ /*if (output6>0.0561) {//this is the output for the right tricep tricout=1; } else if(output6>0.0380) { tricout=0.5; } else { tricout=0; }*/ if (last_triceps == 0 and output6 > 0.045) { tricout = 1; } else if(last_triceps == 1 and output6 < 0.04) { tricout = 0; } else { tricout = last_triceps; } last_triceps = tricout; if (last_push ==0 and output9>0.06) {//this is the output for the left bicep (the push motion) pushout=1; } else if(last_triceps == 1 and output9<0.045) { pushout=0; } else { pushout = last_push; } last_push = pushout; }