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:
irisl
Date:
Mon Oct 20 13:37:36 2014 +0000
Revision:
11:bc24a271e6cf
Parent:
9:f7ec578a17c0
Child:
12:9e6e49af9304
2 losse signalen, deltoid rood, biceps blauwe LED bij aanspannen boven 0.05

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