2 losse EMG signalen van de biceps en deltoid

Dependencies:   HIDScope MODSERIAL mbed-dsp mbed Encoder

Fork of Lampje_EMG_Gr6 by Jesse Kaiser

Committer:
jessekaiser
Date:
Thu Oct 16 13:34:51 2014 +0000
Revision:
6:8f4138a811e0
Parent:
5:03105d8bf72c
Child:
7:1ca320a12035
Script om de reactie van 2 EMG signalen te testen;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jessekaiser 0:db396b9f4b4c 1 #include "mbed.h"
jessekaiser 0:db396b9f4b4c 2 #include "HIDScope.h"
jessekaiser 0:db396b9f4b4c 3 #include "arm_math.h"
jessekaiser 0:db396b9f4b4c 4 #include "MODSERIAL.h"
jessekaiser 0:db396b9f4b4c 5
jessekaiser 0:db396b9f4b4c 6 Serial pc(USBTX, USBRX); // tx, rx
jessekaiser 0:db396b9f4b4c 7 DigitalOut myled1(LED_RED);
jessekaiser 0:db396b9f4b4c 8 DigitalOut myled2(LED_GREEN);
jessekaiser 0:db396b9f4b4c 9 DigitalOut myled3(LED_BLUE);
jessekaiser 1:099b19376f16 10 PwmOut motorsignal(PTD4);
jessekaiser 0:db396b9f4b4c 11
jessekaiser 0:db396b9f4b4c 12 //Define objects
jessekaiser 3:0895fa0a6ca4 13 AnalogIn emg0(PTB1); //Analog input
jessekaiser 2:39e1bde54e73 14 AnalogIn emg1(PTB2); //Analog input
jessekaiser 3:0895fa0a6ca4 15 HIDScope scope(4);
jessekaiser 0:db396b9f4b4c 16
jessekaiser 0:db396b9f4b4c 17 arm_biquad_casd_df1_inst_f32 lowpass;
jessekaiser 2:39e1bde54e73 18 //lowpass filter settings: Fc = 225 Hz, Fs = 500 Hz, Gain = -3 dB
jessekaiser 0:db396b9f4b4c 19 float lowpass_const[] = {0.8005910266528647, 1.6011820533057295, 0.8005910266528647, -1.5610153912536877, -0.6413487153577715};
jessekaiser 0:db396b9f4b4c 20 //state values
jessekaiser 0:db396b9f4b4c 21 float lowpass_states[4];
jessekaiser 0:db396b9f4b4c 22 arm_biquad_casd_df1_inst_f32 highpass;
jessekaiser 2:39e1bde54e73 23 //highpass filter settings: Fc = 20 Hz, Fs = 500 Hz, Gain = -3 dB
jessekaiser 0:db396b9f4b4c 24 float highpass_const[] = {0.956542835577484, -1.913085671154968, 0.956542835577484, 1.911196288237583, -0.914975054072353};
jessekaiser 0:db396b9f4b4c 25 //state values
jessekaiser 0:db396b9f4b4c 26 float highpass_states[4];
jessekaiser 2:39e1bde54e73 27
jessekaiser 2:39e1bde54e73 28 //De globale variabele voor het gefilterde EMG signaal
jessekaiser 2:39e1bde54e73 29 float filtered_biceps;
jessekaiser 2:39e1bde54e73 30 float filtered_deltoid;
jessekaiser 0:db396b9f4b4c 31
jessekaiser 0:db396b9f4b4c 32
jessekaiser 0:db396b9f4b4c 33 /** Looper function
jessekaiser 0:db396b9f4b4c 34 * functions used for Ticker and Timeout should be of type void <name>(void)
jessekaiser 0:db396b9f4b4c 35 * i.e. no input arguments, no output arguments.
jessekaiser 0:db396b9f4b4c 36 * if you want to change a variable that you use in other places (for example in main)
jessekaiser 0:db396b9f4b4c 37 * you will have to make that variable global in order to be able to reach it both from
jessekaiser 0:db396b9f4b4c 38 * the function called at interrupt time, and in the main function.
jessekaiser 0:db396b9f4b4c 39 * To make a variable global, define it under the includes.
jessekaiser 0:db396b9f4b4c 40 * variables that are changed in the interrupt routine (written to) should be made
jessekaiser 0:db396b9f4b4c 41 * 'volatile' to let the compiler know that those values may change outside the current context.
jessekaiser 0:db396b9f4b4c 42 * i.e.: "volatile uint16_t emg_value;" instead of "uint16_t emg_value"
jessekaiser 0:db396b9f4b4c 43 * in the example below, the variable is not re-used in the main function, and is thus declared
jessekaiser 0:db396b9f4b4c 44 * local in the looper function only.
jessekaiser 0:db396b9f4b4c 45 **/
jessekaiser 1:099b19376f16 46
jessekaiser 1:099b19376f16 47
jessekaiser 0:db396b9f4b4c 48 void looper()
jessekaiser 0:db396b9f4b4c 49 {
jessekaiser 1:099b19376f16 50 /*variable to store value in*/
jessekaiser 2:39e1bde54e73 51 uint16_t emg_value1;
jessekaiser 3:0895fa0a6ca4 52 uint16_t emg_value2;
jessekaiser 1:099b19376f16 53
jessekaiser 2:39e1bde54e73 54 float emg_value1_f32;
jessekaiser 2:39e1bde54e73 55 float emg_value2_f32;
jessekaiser 0:db396b9f4b4c 56 /*put raw emg value both in red and in emg_value*/
jessekaiser 2:39e1bde54e73 57 emg_value1 = emg0.read_u16(); // read direct ADC result, converted to 16 bit integer (0..2^16 = 0..65536 = 0..3.3V)
jessekaiser 2:39e1bde54e73 58 emg_value1_f32 = emg0.read();
jessekaiser 3:0895fa0a6ca4 59
jessekaiser 2:39e1bde54e73 60 emg_value2 = emg1.read_u16();
jessekaiser 2:39e1bde54e73 61 emg_value2_f32 = emg1.read();
jessekaiser 0:db396b9f4b4c 62
jessekaiser 2:39e1bde54e73 63 //process emg biceps
jessekaiser 2:39e1bde54e73 64 arm_biquad_cascade_df1_f32(&highpass, &emg_value1_f32, &filtered_biceps, 1 );
jessekaiser 2:39e1bde54e73 65 filtered_biceps = fabs(filtered_biceps);
jessekaiser 2:39e1bde54e73 66 arm_biquad_cascade_df1_f32(&lowpass, &filtered_biceps, &filtered_biceps, 1 );
jessekaiser 3:0895fa0a6ca4 67
jessekaiser 2:39e1bde54e73 68 //process emg deltoid
jessekaiser 2:39e1bde54e73 69 arm_biquad_cascade_df1_f32(&highpass, &emg_value2_f32, &filtered_deltoid, 1 );
jessekaiser 3:0895fa0a6ca4 70 filtered_deltoid = fabs(filtered_deltoid);
jessekaiser 2:39e1bde54e73 71 arm_biquad_cascade_df1_f32(&lowpass, &filtered_deltoid, &filtered_deltoid, 1 );
jessekaiser 1:099b19376f16 72
jessekaiser 0:db396b9f4b4c 73 /*send value to PC. */
jessekaiser 3:0895fa0a6ca4 74 scope.set(0,emg_value1); //Raw EMG signal biceps
jessekaiser 3:0895fa0a6ca4 75 scope.set(1,emg_value2); //Raw EMG signal Deltoid
jessekaiser 3:0895fa0a6ca4 76 scope.set(2,filtered_biceps); //processed float biceps
jessekaiser 3:0895fa0a6ca4 77 scope.set(3,filtered_deltoid); //processed float deltoid
jessekaiser 0:db396b9f4b4c 78 scope.send();
jessekaiser 0:db396b9f4b4c 79
jessekaiser 0:db396b9f4b4c 80 }
jessekaiser 0:db396b9f4b4c 81
jessekaiser 0:db396b9f4b4c 82 void BlinkRed(int n)
jessekaiser 0:db396b9f4b4c 83 {
jessekaiser 0:db396b9f4b4c 84 for (int i=0; i<n; i++) {
jessekaiser 0:db396b9f4b4c 85 myled1 = 1;
jessekaiser 0:db396b9f4b4c 86 myled2 = 1;
jessekaiser 0:db396b9f4b4c 87 myled3 = 1;
jessekaiser 3:0895fa0a6ca4 88 wait(0.1);
jessekaiser 0:db396b9f4b4c 89 myled1 = 0;
jessekaiser 0:db396b9f4b4c 90 myled2 = 1;
jessekaiser 0:db396b9f4b4c 91 myled3 = 1;
jessekaiser 3:0895fa0a6ca4 92 wait(0.1);
jessekaiser 0:db396b9f4b4c 93 }
jessekaiser 0:db396b9f4b4c 94 }
jessekaiser 0:db396b9f4b4c 95
jessekaiser 3:0895fa0a6ca4 96 void BlinkGreen ()
jessekaiser 3:0895fa0a6ca4 97 {
jessekaiser 3:0895fa0a6ca4 98
jessekaiser 3:0895fa0a6ca4 99 myled1 = 1;
jessekaiser 3:0895fa0a6ca4 100 myled2 = 1;
jessekaiser 3:0895fa0a6ca4 101 myled3 = 1;
jessekaiser 3:0895fa0a6ca4 102 wait(0.1);
jessekaiser 3:0895fa0a6ca4 103 myled1 = 1;
jessekaiser 3:0895fa0a6ca4 104 myled2 = 0;
jessekaiser 3:0895fa0a6ca4 105 myled3 = 1;
jessekaiser 3:0895fa0a6ca4 106 wait(0.1);
jessekaiser 3:0895fa0a6ca4 107 }
jessekaiser 3:0895fa0a6ca4 108
jessekaiser 3:0895fa0a6ca4 109
jessekaiser 3:0895fa0a6ca4 110 void BlinkBlue(int n)
jessekaiser 2:39e1bde54e73 111 {
jessekaiser 2:39e1bde54e73 112 for (int i=0; i<n; i++) {
jessekaiser 2:39e1bde54e73 113 myled1 = 1;
jessekaiser 2:39e1bde54e73 114 myled2 = 1;
jessekaiser 2:39e1bde54e73 115 myled3 = 1;
jessekaiser 3:0895fa0a6ca4 116 wait(0.1);
jessekaiser 2:39e1bde54e73 117 myled1 = 1;
jessekaiser 3:0895fa0a6ca4 118 myled2 = 1;
jessekaiser 3:0895fa0a6ca4 119 myled3 = 0;
jessekaiser 3:0895fa0a6ca4 120 wait(0.1);
jessekaiser 2:39e1bde54e73 121 }
jessekaiser 2:39e1bde54e73 122 }
jessekaiser 2:39e1bde54e73 123
jessekaiser 0:db396b9f4b4c 124 int main()
jessekaiser 1:099b19376f16 125 {
jessekaiser 0:db396b9f4b4c 126 pc.baud(115200);
jessekaiser 1:099b19376f16 127
jessekaiser 0:db396b9f4b4c 128 Ticker log_timer;
jessekaiser 1:099b19376f16 129 //set up filters. Use external array for constants
jessekaiser 0:db396b9f4b4c 130 arm_biquad_cascade_df1_init_f32(&lowpass,1 , lowpass_const, lowpass_states);
jessekaiser 0:db396b9f4b4c 131 arm_biquad_cascade_df1_init_f32(&highpass,1 ,highpass_const,highpass_states);
jessekaiser 0:db396b9f4b4c 132
jessekaiser 0:db396b9f4b4c 133 /**Here you attach the 'void looper(void)' function to the Ticker object
jessekaiser 0:db396b9f4b4c 134 * The looper() function will be called every 0.01 seconds.
jessekaiser 0:db396b9f4b4c 135 * Please mind that the parentheses after looper are omitted when using attach.
jessekaiser 0:db396b9f4b4c 136 */
jessekaiser 0:db396b9f4b4c 137 log_timer.attach(looper, 0.001);
jessekaiser 1:099b19376f16 138 while(1) { //Loop
jessekaiser 1:099b19376f16 139 /*Empty!*/
jessekaiser 1:099b19376f16 140 /*Everything is handled by the interrupt routine now!*/
jessekaiser 1:099b19376f16 141 {
jessekaiser 6:8f4138a811e0 142
jessekaiser 1:099b19376f16 143 while(1) {
jessekaiser 3:0895fa0a6ca4 144 pc.printf("Span de biceps aan om het instellen te starten");
jessekaiser 1:099b19376f16 145 do {
jessekaiser 3:0895fa0a6ca4 146 BlinkGreen();
jessekaiser 1:099b19376f16 147 }
jessekaiser 3:0895fa0a6ca4 148 while(filtered_biceps < 0.04);
jessekaiser 3:0895fa0a6ca4 149 while(filtered_biceps > 0.04) { //Wanneer het EMG signaal een piek geeft wordt het volgende uitgevoerd.
jessekaiser 4:40aa1fb60a24 150 BlinkRed(20);
jessekaiser 6:8f4138a811e0 151 if (filtered_deltoid > 0.04) {
jessekaiser 5:03105d8bf72c 152 BlinkBlue(20);
jessekaiser 4:40aa1fb60a24 153 } else if (filtered_biceps < 0.04 && filtered_deltoid < 0.04) {
jessekaiser 3:0895fa0a6ca4 154 break;
jessekaiser 3:0895fa0a6ca4 155 }
jessekaiser 0:db396b9f4b4c 156
jessekaiser 6:8f4138a811e0 157 if(filtered_biceps > 0.04) {
jessekaiser 3:0895fa0a6ca4 158 myled1 = 1;
jessekaiser 3:0895fa0a6ca4 159 myled2 = 0;
jessekaiser 3:0895fa0a6ca4 160 myled3 = 1;
jessekaiser 3:0895fa0a6ca4 161 wait(5); //Dit wordt de duur van het slaan en teruggaan naar de beginpositie totdat er opnieuw gemeten kan worden.
jessekaiser 6:8f4138a811e0 162
jessekaiser 3:0895fa0a6ca4 163 }
jessekaiser 0:db396b9f4b4c 164 }
jessekaiser 0:db396b9f4b4c 165 }
jessekaiser 0:db396b9f4b4c 166 }
jessekaiser 0:db396b9f4b4c 167 }
jessekaiser 1:099b19376f16 168 }