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:
Mon Oct 26 14:05:37 2015 +0000
Revision:
3:a69f041108d4
Parent:
2:83659da3e5fe
Child:
4:fd29407c3115
emg converter code, not working as the signal is not constant and the if functions do not react to varying signals

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 2:83659da3e5fe 25 double maxcal=1;
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 3:a69f041108d4 50 led1.write(1);
Technical_Muffin 3:a69f041108d4 51 led2.write(1);
Technical_Muffin 3:a69f041108d4 52 sample_timer.attach(&filter, 0.002);//continously execute the EMG reader and filter
Technical_Muffin 3:a69f041108d4 53 while(1){
Technical_Muffin 3:a69f041108d4 54 pc.baud(115200);
Technical_Muffin 3:a69f041108d4 55 pc.printf("%f \n", onoffsignal);
Technical_Muffin 3:a69f041108d4 56 if(onoffsignal==0.02){
Technical_Muffin 3:a69f041108d4 57 led1.write(0);
Technical_Muffin 3:a69f041108d4 58 led2.write(1);
Technical_Muffin 3:a69f041108d4 59 }
Technical_Muffin 3:a69f041108d4 60 else if(onoffsignal == 0.05){
Technical_Muffin 3:a69f041108d4 61 led1.write(1);
Technical_Muffin 3:a69f041108d4 62 led2.write(0);
Technical_Muffin 3:a69f041108d4 63 }
Technical_Muffin 3:a69f041108d4 64 }
Technical_Muffin 0:1883d922ada8 65 }