EMG converter with movement code for 1 motor

Dependencies:   HIDScope MODSERIAL QEI biquadFilter mbed

Fork of EMG_converter_code by K K

Committer:
Technical_Muffin
Date:
Mon Oct 26 14:22:40 2015 +0000
Revision:
4:fd29407c3115
Parent:
3:a69f041108d4
Child:
5:46e201518dd3
it reads the emg after the button was pressed. Look at what it says. And then it stops, look at what happens?

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 0:1883d922ada8 8 HIDScope scope(2); // Instantize a 2-channel HIDScope object
Technical_Muffin 2:83659da3e5fe 9 DigitalIn button1(PTA4);//test button for starting motor 1
Technical_Muffin 2:83659da3e5fe 10 DigitalOut led1(LED_RED);
Technical_Muffin 3:a69f041108d4 11 DigitalOut led2(LED_BLUE);
Technical_Muffin 3:a69f041108d4 12 MODSERIAL pc(USBTX,USBRX);
Technical_Muffin 0:1883d922ada8 13 /*The biquad filters required to transform the EMG signal into an usable signal*/
Technical_Muffin 0:1883d922ada8 14 biquadFilter filterhigh1(-1.1430, 0.4128, 0.6389, -1.2779, 0.6389);
Technical_Muffin 0:1883d922ada8 15 biquadFilter filterlow1(1.9556, 0.9565, 0.9780, 1.9561, 0.9780);
Technical_Muffin 0:1883d922ada8 16 biquadFilter notch(-1.1978e-16, 0.9561, 0.9780, -1.1978e-16, 0.9780);
Technical_Muffin 0:1883d922ada8 17 biquadFilter filterlow2(-1.9645, 0.9651, 1.5515e-4, 3.1030e-4, 1.5515e-4);
Technical_Muffin 1:9913e3886643 18 double emg_value;
Technical_Muffin 1:9913e3886643 19 double signalpart1;
Technical_Muffin 1:9913e3886643 20 double signalpart2;
Technical_Muffin 1:9913e3886643 21 double signalpart3;
Technical_Muffin 1:9913e3886643 22 double signalpart4;
Technical_Muffin 1:9913e3886643 23 double signalfinal;
Technical_Muffin 2:83659da3e5fe 24 double onoffsignal;
Technical_Muffin 4:fd29407c3115 25 double maxcal=0;
Technical_Muffin 0:1883d922ada8 26 /*
Technical_Muffin 0:1883d922ada8 27 */
Technical_Muffin 2:83659da3e5fe 28 void filter(){
Technical_Muffin 1:9913e3886643 29 emg_value = emg.read();//read the emg value from the elektrodes
Technical_Muffin 3:a69f041108d4 30 signalpart1 = notch.step(emg_value);//Highpass filter for removing offset and artifacts
Technical_Muffin 3:a69f041108d4 31 signalpart2 = filterhigh1.step(signalpart1);//rectify the filtered signal
Technical_Muffin 3:a69f041108d4 32 signalpart3 = abs(signalpart2);//low pass filter to envelope the emg
Technical_Muffin 3:a69f041108d4 33 signalpart4 = filterlow1.step(signalpart3);//notch filter to remove 50Hz signal
Technical_Muffin 1:9913e3886643 34 signalfinal = filterlow2.step(signalpart4);//2nd low pass filter to envelope the emg
Technical_Muffin 2:83659da3e5fe 35 onoffsignal=signalfinal/maxcal;//divide the emg signal by the max EMG to calibrate the signal per person
Technical_Muffin 1:9913e3886643 36 scope.set(0,emg_value);//set emg signal to scope in channel 1
Technical_Muffin 2:83659da3e5fe 37 scope.set(1,onoffsignal);//set filtered signal to scope in channel 2
Technical_Muffin 1:9913e3886643 38 scope.send();//send the signals to the scope
Technical_Muffin 0:1883d922ada8 39 }
Technical_Muffin 2:83659da3e5fe 40 double normalcal(){
Technical_Muffin 2:83659da3e5fe 41 double signalmeasure =emg.read();
Technical_Muffin 2:83659da3e5fe 42 if (signalmeasure > maxcal){
Technical_Muffin 2:83659da3e5fe 43 signalmeasure = maxcal;
Technical_Muffin 2:83659da3e5fe 44 }
Technical_Muffin 2:83659da3e5fe 45 return maxcal;
Technical_Muffin 2:83659da3e5fe 46 }
Technical_Muffin 3:a69f041108d4 47
Technical_Muffin 0:1883d922ada8 48 int main()
Technical_Muffin 0:1883d922ada8 49 {
Technical_Muffin 4:fd29407c3115 50 pc.baud(115200);
Technical_Muffin 3:a69f041108d4 51 led1.write(1);
Technical_Muffin 3:a69f041108d4 52 led2.write(1);
Technical_Muffin 4:fd29407c3115 53 bool calyes=0;
Technical_Muffin 4:fd29407c3115 54
Technical_Muffin 4:fd29407c3115 55 if(calyes==1){
Technical_Muffin 4:fd29407c3115 56 sample_timer.attach(&filter, 0.002);//continously execute the EMG reader and filter
Technical_Muffin 4:fd29407c3115 57 }
Technical_Muffin 3:a69f041108d4 58 while(1){
Technical_Muffin 4:fd29407c3115 59 if(button1.read()==false){
Technical_Muffin 4:fd29407c3115 60 for(int n =0; n<5000;n++){
Technical_Muffin 4:fd29407c3115 61 double signalmeasure =emg.read();
Technical_Muffin 4:fd29407c3115 62 pc.printf("%d", signalmeasure);
Technical_Muffin 4:fd29407c3115 63 if (signalmeasure > maxcal){
Technical_Muffin 4:fd29407c3115 64 signalmeasure = maxcal;
Technical_Muffin 4:fd29407c3115 65 }
Technical_Muffin 4:fd29407c3115 66 calyes=1;
Technical_Muffin 4:fd29407c3115 67 }
Technical_Muffin 4:fd29407c3115 68 }
Technical_Muffin 4:fd29407c3115 69
Technical_Muffin 4:fd29407c3115 70 // pc.printf("%f \n", onoffsignal);
Technical_Muffin 4:fd29407c3115 71 if(onoffsignal<=0.02){
Technical_Muffin 3:a69f041108d4 72 led1.write(0);
Technical_Muffin 3:a69f041108d4 73 led2.write(1);
Technical_Muffin 3:a69f041108d4 74 }
Technical_Muffin 4:fd29407c3115 75 else if(onoffsignal >= 0.05){
Technical_Muffin 3:a69f041108d4 76 led1.write(1);
Technical_Muffin 3:a69f041108d4 77 led2.write(0);
Technical_Muffin 3:a69f041108d4 78 }
Technical_Muffin 3:a69f041108d4 79 }
Technical_Muffin 0:1883d922ada8 80 }