Combination code of movement and emg code with small changes for 2 motors.

Dependencies:   HIDScope MODSERIAL QEI biquadFilter mbed

Fork of EMG_converter_code by Gerlinde van de Haar

Committer:
Technical_Muffin
Date:
Tue Oct 27 10:49:59 2015 +0000
Revision:
7:87d9904c1c19
Parent:
6:ec965bb75d40
Child:
8:5f13198a8e49
working emg code, commented

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Technical_Muffin 0:1883d922ada8 1 #include "mbed.h"
Technical_Muffin 0:1883d922ada8 2 #include "HIDScope.h"
Technical_Muffin 0:1883d922ada8 3 #include "biquadFilter.h" // Require the HIDScope library
Technical_Muffin 3:a69f041108d4 4 #include "MODSERIAL.h"
Technical_Muffin 0:1883d922ada8 5 //Define objects
Technical_Muffin 0:1883d922ada8 6 AnalogIn emg(A0); //Analog of EMG input
Technical_Muffin 0:1883d922ada8 7 Ticker sample_timer;
Technical_Muffin 5:46e201518dd3 8 Ticker motor_timer;
Technical_Muffin 6:ec965bb75d40 9 Ticker cal_timer;
Technical_Muffin 0:1883d922ada8 10 HIDScope scope(2); // Instantize a 2-channel HIDScope object
Technical_Muffin 2:83659da3e5fe 11 DigitalIn button1(PTA4);//test button for starting motor 1
Technical_Muffin 2:83659da3e5fe 12 DigitalOut led1(LED_RED);
Technical_Muffin 3:a69f041108d4 13 DigitalOut led2(LED_BLUE);
Technical_Muffin 3:a69f041108d4 14 MODSERIAL pc(USBTX,USBRX);
Technical_Muffin 0:1883d922ada8 15 /*The biquad filters required to transform the EMG signal into an usable signal*/
Technical_Muffin 0:1883d922ada8 16 biquadFilter filterhigh1(-1.1430, 0.4128, 0.6389, -1.2779, 0.6389);
Technical_Muffin 0:1883d922ada8 17 biquadFilter filterlow1(1.9556, 0.9565, 0.9780, 1.9561, 0.9780);
Technical_Muffin 0:1883d922ada8 18 biquadFilter notch(-1.1978e-16, 0.9561, 0.9780, -1.1978e-16, 0.9780);
Technical_Muffin 0:1883d922ada8 19 biquadFilter filterlow2(-1.9645, 0.9651, 1.5515e-4, 3.1030e-4, 1.5515e-4);
Technical_Muffin 1:9913e3886643 20 double emg_value;
Technical_Muffin 1:9913e3886643 21 double signalpart1;
Technical_Muffin 1:9913e3886643 22 double signalpart2;
Technical_Muffin 1:9913e3886643 23 double signalpart3;
Technical_Muffin 1:9913e3886643 24 double signalpart4;
Technical_Muffin 1:9913e3886643 25 double signalfinal;
Technical_Muffin 2:83659da3e5fe 26 double onoffsignal;
Technical_Muffin 4:fd29407c3115 27 double maxcal=0;
Technical_Muffin 6:ec965bb75d40 28 bool calyes=0;
Technical_Muffin 6:ec965bb75d40 29
Technical_Muffin 0:1883d922ada8 30 /*
Technical_Muffin 0:1883d922ada8 31 */
Technical_Muffin 2:83659da3e5fe 32 void filter(){
Technical_Muffin 6:ec965bb75d40 33 if(calyes==1){
Technical_Muffin 1:9913e3886643 34 emg_value = emg.read();//read the emg value from the elektrodes
Technical_Muffin 3:a69f041108d4 35 signalpart1 = notch.step(emg_value);//Highpass filter for removing offset and artifacts
Technical_Muffin 3:a69f041108d4 36 signalpart2 = filterhigh1.step(signalpart1);//rectify the filtered signal
Technical_Muffin 3:a69f041108d4 37 signalpart3 = abs(signalpart2);//low pass filter to envelope the emg
Technical_Muffin 3:a69f041108d4 38 signalpart4 = filterlow1.step(signalpart3);//notch filter to remove 50Hz signal
Technical_Muffin 1:9913e3886643 39 signalfinal = filterlow2.step(signalpart4);//2nd low pass filter to envelope the emg
Technical_Muffin 2:83659da3e5fe 40 onoffsignal=signalfinal/maxcal;//divide the emg signal by the max EMG to calibrate the signal per person
Technical_Muffin 1:9913e3886643 41 scope.set(0,emg_value);//set emg signal to scope in channel 1
Technical_Muffin 2:83659da3e5fe 42 scope.set(1,onoffsignal);//set filtered signal to scope in channel 2
Technical_Muffin 1:9913e3886643 43 scope.send();//send the signals to the scope
Technical_Muffin 6:ec965bb75d40 44 //pc.printf("emg signal %f, filtered signal %f \n",emg_value,onoffsignal);
Technical_Muffin 6:ec965bb75d40 45 }
Technical_Muffin 6:ec965bb75d40 46 }
Technical_Muffin 7:87d9904c1c19 47 void checkmotor(){//check the normalized signal and set actions if a threshold is passed
Technical_Muffin 6:ec965bb75d40 48 if(calyes==1){
Technical_Muffin 6:ec965bb75d40 49 if(onoffsignal<=0.25){
Technical_Muffin 6:ec965bb75d40 50 led1.write(1);
Technical_Muffin 6:ec965bb75d40 51 led2.write(0);
Technical_Muffin 6:ec965bb75d40 52 }
Technical_Muffin 6:ec965bb75d40 53 else if(onoffsignal >= 0.5){
Technical_Muffin 6:ec965bb75d40 54 led1.write(0);
Technical_Muffin 6:ec965bb75d40 55 led2.write(1);
Technical_Muffin 6:ec965bb75d40 56 }
Technical_Muffin 6:ec965bb75d40 57 }
Technical_Muffin 0:1883d922ada8 58 }
Technical_Muffin 5:46e201518dd3 59
Technical_Muffin 7:87d9904c1c19 60 void calibri(){//calibration function
Technical_Muffin 6:ec965bb75d40 61 if(button1.read()==false){
Technical_Muffin 7:87d9904c1c19 62 for(int n =0; n<5000;n++){//read for 5000 samples as calibration
Technical_Muffin 6:ec965bb75d40 63 emg_value = emg.read();//read the emg value from the elektrodes
Technical_Muffin 6:ec965bb75d40 64 signalpart1 = notch.step(emg_value);//Highpass filter for removing offset and artifacts
Technical_Muffin 6:ec965bb75d40 65 signalpart2 = filterhigh1.step(signalpart1);//rectify the filtered signal
Technical_Muffin 6:ec965bb75d40 66 signalpart3 = abs(signalpart2);//low pass filter to envelope the emg
Technical_Muffin 6:ec965bb75d40 67 signalpart4 = filterlow1.step(signalpart3);//notch filter to remove 50Hz signal
Technical_Muffin 6:ec965bb75d40 68 signalfinal = filterlow2.step(signalpart4);//2nd low pass filter to envelope the emg
Technical_Muffin 6:ec965bb75d40 69 double signalmeasure = signalfinal;
Technical_Muffin 7:87d9904c1c19 70 if (signalmeasure > maxcal){//determine what the highest reachable emg signal is
Technical_Muffin 6:ec965bb75d40 71 maxcal = signalmeasure;
Technical_Muffin 6:ec965bb75d40 72 }
Technical_Muffin 6:ec965bb75d40 73 }
Technical_Muffin 6:ec965bb75d40 74 calyes=1;
Technical_Muffin 6:ec965bb75d40 75 }
Technical_Muffin 6:ec965bb75d40 76 }
Technical_Muffin 0:1883d922ada8 77 int main()
Technical_Muffin 0:1883d922ada8 78 {
Technical_Muffin 4:fd29407c3115 79 pc.baud(115200);
Technical_Muffin 3:a69f041108d4 80 led1.write(1);
Technical_Muffin 3:a69f041108d4 81 led2.write(1);
Technical_Muffin 6:ec965bb75d40 82
Technical_Muffin 4:fd29407c3115 83 sample_timer.attach(&filter, 0.002);//continously execute the EMG reader and filter
Technical_Muffin 6:ec965bb75d40 84 motor_timer.attach(&checkmotor, 0.002);//continously execute the motor controller
Technical_Muffin 6:ec965bb75d40 85 cal_timer.attach(&calibri, 0.002);//ticker to check if motor is being calibrated
Technical_Muffin 6:ec965bb75d40 86
Technical_Muffin 5:46e201518dd3 87
Technical_Muffin 6:ec965bb75d40 88 while(1){
Technical_Muffin 7:87d9904c1c19 89 //random while loop to keep system going
Technical_Muffin 5:46e201518dd3 90 }
Technical_Muffin 0:1883d922ada8 91 }