Aansturen van een LED script dmv twee EMG signalen

Dependencies:   HIDScope MODSERIAL mbed-dsp mbed

Committer:
jessekaiser
Date:
Thu Oct 16 12:51:13 2014 +0000
Revision:
2:39e1bde54e73
Parent:
1:099b19376f16
Child:
3:0895fa0a6ca4
Bezig omschrijven naar 2 emg signalen ;

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 2:39e1bde54e73 13 AnalogIn emg0(PTB1); //Analog input
jessekaiser 2:39e1bde54e73 14 AnalogIn emg1(PTB2); //Analog input
jessekaiser 2:39e1bde54e73 15 HIDScope scope(3);
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 2:39e1bde54e73 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 2:39e1bde54e73 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 2:39e1bde54e73 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 2:39e1bde54e73 70 filtered_biceps = fabs(filtered_biceps);
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 2:39e1bde54e73 74 scope.set(0,emg_value1); //uint value
jessekaiser 2:39e1bde54e73 75 scope.set(1,filtered_biceps); //processed float biceps
jessekaiser 2:39e1bde54e73 76 scope.set(2,filtered_deltoid); //processed float deltoid
jessekaiser 0:db396b9f4b4c 77 scope.send();
jessekaiser 0:db396b9f4b4c 78
jessekaiser 0:db396b9f4b4c 79 }
jessekaiser 0:db396b9f4b4c 80
jessekaiser 0:db396b9f4b4c 81 void BlinkRed(int n)
jessekaiser 0:db396b9f4b4c 82 {
jessekaiser 0:db396b9f4b4c 83 for (int i=0; i<n; i++) {
jessekaiser 0:db396b9f4b4c 84 myled1 = 1;
jessekaiser 0:db396b9f4b4c 85 myled2 = 1;
jessekaiser 0:db396b9f4b4c 86 myled3 = 1;
jessekaiser 0:db396b9f4b4c 87 wait(1);
jessekaiser 0:db396b9f4b4c 88 myled1 = 0;
jessekaiser 0:db396b9f4b4c 89 myled2 = 1;
jessekaiser 0:db396b9f4b4c 90 myled3 = 1;
jessekaiser 0:db396b9f4b4c 91 wait(1);
jessekaiser 0:db396b9f4b4c 92 }
jessekaiser 0:db396b9f4b4c 93 }
jessekaiser 0:db396b9f4b4c 94
jessekaiser 2:39e1bde54e73 95 void BlinkGreen (int n)
jessekaiser 2:39e1bde54e73 96 {
jessekaiser 2:39e1bde54e73 97 for (int i=0; i<n; i++) {
jessekaiser 2:39e1bde54e73 98 myled1 = 1;
jessekaiser 2:39e1bde54e73 99 myled2 = 1;
jessekaiser 2:39e1bde54e73 100 myled3 = 1;
jessekaiser 2:39e1bde54e73 101 wait(1);
jessekaiser 2:39e1bde54e73 102 myled1 = 1;
jessekaiser 2:39e1bde54e73 103 myled2 = 0;
jessekaiser 2:39e1bde54e73 104 myled3 = 1;
jessekaiser 2:39e1bde54e73 105 wait(1);
jessekaiser 2:39e1bde54e73 106 }
jessekaiser 2:39e1bde54e73 107 }
jessekaiser 2:39e1bde54e73 108
jessekaiser 0:db396b9f4b4c 109 int main()
jessekaiser 1:099b19376f16 110 {
jessekaiser 0:db396b9f4b4c 111 pc.baud(115200);
jessekaiser 1:099b19376f16 112
jessekaiser 0:db396b9f4b4c 113 Ticker log_timer;
jessekaiser 1:099b19376f16 114 //set up filters. Use external array for constants
jessekaiser 0:db396b9f4b4c 115 arm_biquad_cascade_df1_init_f32(&lowpass,1 , lowpass_const, lowpass_states);
jessekaiser 0:db396b9f4b4c 116 arm_biquad_cascade_df1_init_f32(&highpass,1 ,highpass_const,highpass_states);
jessekaiser 0:db396b9f4b4c 117
jessekaiser 0:db396b9f4b4c 118 /**Here you attach the 'void looper(void)' function to the Ticker object
jessekaiser 0:db396b9f4b4c 119 * The looper() function will be called every 0.01 seconds.
jessekaiser 0:db396b9f4b4c 120 * Please mind that the parentheses after looper are omitted when using attach.
jessekaiser 0:db396b9f4b4c 121 */
jessekaiser 0:db396b9f4b4c 122 log_timer.attach(looper, 0.001);
jessekaiser 1:099b19376f16 123 while(1) { //Loop
jessekaiser 1:099b19376f16 124 /*Empty!*/
jessekaiser 1:099b19376f16 125 /*Everything is handled by the interrupt routine now!*/
jessekaiser 1:099b19376f16 126 {
jessekaiser 1:099b19376f16 127 char c = '0';
jessekaiser 1:099b19376f16 128 while(1) {
jessekaiser 1:099b19376f16 129 pc.printf("Het programma blijft knipperen totdat er op '1' wordt gedrukt.\n");
jessekaiser 1:099b19376f16 130 do {
jessekaiser 1:099b19376f16 131 myled1 = 1;
jessekaiser 1:099b19376f16 132 myled2 = 0;
jessekaiser 1:099b19376f16 133 myled3 = 1;
jessekaiser 1:099b19376f16 134
jessekaiser 1:099b19376f16 135
jessekaiser 1:099b19376f16 136 }
jessekaiser 0:db396b9f4b4c 137 }
jessekaiser 2:39e1bde54e73 138 while(filtered_biceps < 0.04);
jessekaiser 1:099b19376f16 139 //c = pc.getc();
jessekaiser 2:39e1bde54e73 140 while(filtered_biceps > 0.04) { //Wanneer het EMG signaal een piek geeft wordt het volgende uitgevoerd.
jessekaiser 0:db396b9f4b4c 141 c = '0';
jessekaiser 1:099b19376f16 142 BlinkRed(2);
jessekaiser 1:099b19376f16 143
jessekaiser 1:099b19376f16 144 if (pc.readable()) { //Wanneer er binnen de vastgestelde tijd weer op 1 wordt gedrukt, gaat het lampje blauw knipperen, anders reset.
jessekaiser 1:099b19376f16 145 c = pc.getc();
jessekaiser 1:099b19376f16 146 c = '0';
jessekaiser 1:099b19376f16 147 myled1 = 1;
jessekaiser 1:099b19376f16 148 myled2 = 1;
jessekaiser 1:099b19376f16 149 myled3 = 1;
jessekaiser 1:099b19376f16 150 wait(1);
jessekaiser 1:099b19376f16 151 myled1 = 1;
jessekaiser 1:099b19376f16 152 myled2 = 1;
jessekaiser 1:099b19376f16 153 myled3 = 0;
jessekaiser 1:099b19376f16 154 wait(1);
jessekaiser 1:099b19376f16 155 myled1 = 1;
jessekaiser 1:099b19376f16 156 myled2 = 1;
jessekaiser 1:099b19376f16 157 myled3 = 1;
jessekaiser 1:099b19376f16 158 wait(1);
jessekaiser 1:099b19376f16 159 myled1 = 1;
jessekaiser 1:099b19376f16 160 myled2 = 1;
jessekaiser 1:099b19376f16 161 myled3 = 0;
jessekaiser 1:099b19376f16 162 wait(1);
jessekaiser 1:099b19376f16 163 } else if (c != '1') {
jessekaiser 1:099b19376f16 164 break;
jessekaiser 1:099b19376f16 165 }
jessekaiser 0:db396b9f4b4c 166
jessekaiser 0:db396b9f4b4c 167 if(pc.readable()) {
jessekaiser 0:db396b9f4b4c 168 c = pc.getc();
jessekaiser 0:db396b9f4b4c 169 myled1 = 1;
jessekaiser 0:db396b9f4b4c 170 myled2 = 0;
jessekaiser 0:db396b9f4b4c 171 myled3 = 1;
jessekaiser 0:db396b9f4b4c 172 wait(5); //Dit wordt de duur van het slaan en teruggaan naar de beginpositie totdat er opnieuw gemeten kan worden.
jessekaiser 0:db396b9f4b4c 173 c = '0';
jessekaiser 0:db396b9f4b4c 174 }
jessekaiser 0:db396b9f4b4c 175 }
jessekaiser 0:db396b9f4b4c 176 }
jessekaiser 0:db396b9f4b4c 177 }
jessekaiser 1:099b19376f16 178 }
jessekaiser 0:db396b9f4b4c 179 }
jessekaiser 0:db396b9f4b4c 180
jessekaiser 0:db396b9f4b4c 181 int i;
jessekaiser 0:db396b9f4b4c 182
jessekaiser 0:db396b9f4b4c 183 int a(void)
jessekaiser 0:db396b9f4b4c 184 {
jessekaiser 0:db396b9f4b4c 185 i=22;
jessekaiser 0:db396b9f4b4c 186 return i;
jessekaiser 0:db396b9f4b4c 187 }
jessekaiser 0:db396b9f4b4c 188
jessekaiser 0:db396b9f4b4c 189 void b (void)
jessekaiser 0:db396b9f4b4c 190 {
jessekaiser 0:db396b9f4b4c 191 int i;
jessekaiser 1:099b19376f16 192
jessekaiser 0:db396b9f4b4c 193 i=66;
jessekaiser 0:db396b9f4b4c 194 int j = a();
jessekaiser 0:db396b9f4b4c 195 pc.print(i);
jessekaiser 1:099b19376f16 196 }
jessekaiser 0:db396b9f4b4c 197
jessekaiser 0:db396b9f4b4c 198 b();