Aansturen van een LED script dmv twee EMG signalen

Dependencies:   HIDScope MODSERIAL mbed-dsp mbed

Committer:
jessekaiser
Date:
Wed Oct 15 14:07:03 2014 +0000
Revision:
0:db396b9f4b4c
Child:
1:099b19376f16
Begin met EMG implementeren;

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 0:db396b9f4b4c 10 PwmOut filtered_emg(PTD4);
jessekaiser 0:db396b9f4b4c 11
jessekaiser 0:db396b9f4b4c 12 //Define objects
jessekaiser 0:db396b9f4b4c 13 AnalogIn emg0(PTB1); //Analog input
jessekaiser 0:db396b9f4b4c 14 HIDScope scope(2);
jessekaiser 0:db396b9f4b4c 15
jessekaiser 0:db396b9f4b4c 16 arm_biquad_casd_df1_inst_f32 lowpass;
jessekaiser 0:db396b9f4b4c 17 //constants for 5Hz lowpass
jessekaiser 0:db396b9f4b4c 18 float lowpass_const[] = {0.8005910266528647, 1.6011820533057295, 0.8005910266528647, -1.5610153912536877, -0.6413487153577715};
jessekaiser 0:db396b9f4b4c 19 //state values
jessekaiser 0:db396b9f4b4c 20 float lowpass_states[4];
jessekaiser 0:db396b9f4b4c 21 arm_biquad_casd_df1_inst_f32 highpass;
jessekaiser 0:db396b9f4b4c 22 //constants for 0.5Hz highpass
jessekaiser 0:db396b9f4b4c 23 float highpass_const[] = {0.956542835577484, -1.913085671154968, 0.956542835577484, 1.911196288237583, -0.914975054072353};
jessekaiser 0:db396b9f4b4c 24 //state values
jessekaiser 0:db396b9f4b4c 25 float highpass_states[4];
jessekaiser 0:db396b9f4b4c 26
jessekaiser 0:db396b9f4b4c 27
jessekaiser 0:db396b9f4b4c 28 /** Looper function
jessekaiser 0:db396b9f4b4c 29 * functions used for Ticker and Timeout should be of type void <name>(void)
jessekaiser 0:db396b9f4b4c 30 * i.e. no input arguments, no output arguments.
jessekaiser 0:db396b9f4b4c 31 * if you want to change a variable that you use in other places (for example in main)
jessekaiser 0:db396b9f4b4c 32 * you will have to make that variable global in order to be able to reach it both from
jessekaiser 0:db396b9f4b4c 33 * the function called at interrupt time, and in the main function.
jessekaiser 0:db396b9f4b4c 34 * To make a variable global, define it under the includes.
jessekaiser 0:db396b9f4b4c 35 * variables that are changed in the interrupt routine (written to) should be made
jessekaiser 0:db396b9f4b4c 36 * 'volatile' to let the compiler know that those values may change outside the current context.
jessekaiser 0:db396b9f4b4c 37 * i.e.: "volatile uint16_t emg_value;" instead of "uint16_t emg_value"
jessekaiser 0:db396b9f4b4c 38 * in the example below, the variable is not re-used in the main function, and is thus declared
jessekaiser 0:db396b9f4b4c 39 * local in the looper function only.
jessekaiser 0:db396b9f4b4c 40 **/
jessekaiser 0:db396b9f4b4c 41 void looper()
jessekaiser 0:db396b9f4b4c 42 {
jessekaiser 0:db396b9f4b4c 43 /*variable to store value in*/
jessekaiser 0:db396b9f4b4c 44 uint16_t emg_value;
jessekaiser 0:db396b9f4b4c 45 float filtered_emg;
jessekaiser 0:db396b9f4b4c 46 float emg_value_f32;
jessekaiser 0:db396b9f4b4c 47 /*put raw emg value both in red and in emg_value*/
jessekaiser 0:db396b9f4b4c 48 emg_value = emg0.read_u16(); // read direct ADC result, converted to 16 bit integer (0..2^16 = 0..65536 = 0..3.3V)
jessekaiser 0:db396b9f4b4c 49 emg_value_f32 = emg0.read();
jessekaiser 0:db396b9f4b4c 50
jessekaiser 0:db396b9f4b4c 51 //process emg
jessekaiser 0:db396b9f4b4c 52 arm_biquad_cascade_df1_f32(&highpass, &emg_value_f32, &filtered_emg, 1 );
jessekaiser 0:db396b9f4b4c 53 filtered_emg = fabs(filtered_emg);
jessekaiser 0:db396b9f4b4c 54 arm_biquad_cascade_df1_f32(&lowpass, &filtered_emg, &filtered_emg, 1 );
jessekaiser 0:db396b9f4b4c 55
jessekaiser 0:db396b9f4b4c 56 /*send value to PC. */
jessekaiser 0:db396b9f4b4c 57 scope.set(0,emg_value); //uint value
jessekaiser 0:db396b9f4b4c 58 scope.set(1,filtered_emg); //processed float
jessekaiser 0:db396b9f4b4c 59 scope.send();
jessekaiser 0:db396b9f4b4c 60
jessekaiser 0:db396b9f4b4c 61 }
jessekaiser 0:db396b9f4b4c 62
jessekaiser 0:db396b9f4b4c 63 void BlinkRed(int n)
jessekaiser 0:db396b9f4b4c 64 {
jessekaiser 0:db396b9f4b4c 65 for (int i=0; i<n; i++) {
jessekaiser 0:db396b9f4b4c 66 myled1 = 1;
jessekaiser 0:db396b9f4b4c 67 myled2 = 1;
jessekaiser 0:db396b9f4b4c 68 myled3 = 1;
jessekaiser 0:db396b9f4b4c 69 wait(1);
jessekaiser 0:db396b9f4b4c 70 myled1 = 0;
jessekaiser 0:db396b9f4b4c 71 myled2 = 1;
jessekaiser 0:db396b9f4b4c 72 myled3 = 1;
jessekaiser 0:db396b9f4b4c 73 wait(1);
jessekaiser 0:db396b9f4b4c 74 }
jessekaiser 0:db396b9f4b4c 75 }
jessekaiser 0:db396b9f4b4c 76
jessekaiser 0:db396b9f4b4c 77 int main()
jessekaiser 0:db396b9f4b4c 78 {
jessekaiser 0:db396b9f4b4c 79 pc.baud(115200);
jessekaiser 0:db396b9f4b4c 80
jessekaiser 0:db396b9f4b4c 81 Ticker log_timer;
jessekaiser 0:db396b9f4b4c 82 //set up filters. Use external array for constants
jessekaiser 0:db396b9f4b4c 83 arm_biquad_cascade_df1_init_f32(&lowpass,1 , lowpass_const, lowpass_states);
jessekaiser 0:db396b9f4b4c 84 arm_biquad_cascade_df1_init_f32(&highpass,1 ,highpass_const,highpass_states);
jessekaiser 0:db396b9f4b4c 85
jessekaiser 0:db396b9f4b4c 86 /**Here you attach the 'void looper(void)' function to the Ticker object
jessekaiser 0:db396b9f4b4c 87 * The looper() function will be called every 0.01 seconds.
jessekaiser 0:db396b9f4b4c 88 * Please mind that the parentheses after looper are omitted when using attach.
jessekaiser 0:db396b9f4b4c 89 */
jessekaiser 0:db396b9f4b4c 90 log_timer.attach(looper, 0.001);
jessekaiser 0:db396b9f4b4c 91 while(1) //Loop
jessekaiser 0:db396b9f4b4c 92 {
jessekaiser 0:db396b9f4b4c 93 /*Empty!*/
jessekaiser 0:db396b9f4b4c 94 /*Everything is handled by the interrupt routine now!*/
jessekaiser 0:db396b9f4b4c 95 {
jessekaiser 0:db396b9f4b4c 96 char c = '0';
jessekaiser 0:db396b9f4b4c 97 while(1) {
jessekaiser 0:db396b9f4b4c 98 pc.printf("Het programma blijft knipperen totdat er op '1' wordt gedrukt.\n");
jessekaiser 0:db396b9f4b4c 99 do {
jessekaiser 0:db396b9f4b4c 100 myled1 = 1;
jessekaiser 0:db396b9f4b4c 101 myled2 = 1;
jessekaiser 0:db396b9f4b4c 102 myled3 = 1;
jessekaiser 0:db396b9f4b4c 103 wait(1);
jessekaiser 0:db396b9f4b4c 104 myled1 = 1;
jessekaiser 0:db396b9f4b4c 105 myled2 = 0;
jessekaiser 0:db396b9f4b4c 106 myled3 = 1;
jessekaiser 0:db396b9f4b4c 107 wait(1);
jessekaiser 0:db396b9f4b4c 108 if(pc.readable()) {
jessekaiser 0:db396b9f4b4c 109 c = pc.getc();
jessekaiser 0:db396b9f4b4c 110 }
jessekaiser 0:db396b9f4b4c 111 } while(filtered_emg < 0.04);
jessekaiser 0:db396b9f4b4c 112 //c = pc.getc();
jessekaiser 0:db396b9f4b4c 113 while(filtered_emg.read() > 0.04) { //Wanneer er op 1 wordt gedrukt gaat het lampje rood knipperen
jessekaiser 0:db396b9f4b4c 114 c = '0';
jessekaiser 0:db396b9f4b4c 115 BlinkRed(2);
jessekaiser 0:db396b9f4b4c 116
jessekaiser 0:db396b9f4b4c 117 if (pc.readable()) { //Wanneer er binnen de vastgestelde tijd weer op 1 wordt gedrukt, gaat het lampje blauw knipperen, anders reset.
jessekaiser 0:db396b9f4b4c 118 c = pc.getc();
jessekaiser 0:db396b9f4b4c 119 c = '0';
jessekaiser 0:db396b9f4b4c 120 myled1 = 1;
jessekaiser 0:db396b9f4b4c 121 myled2 = 1;
jessekaiser 0:db396b9f4b4c 122 myled3 = 1;
jessekaiser 0:db396b9f4b4c 123 wait(1);
jessekaiser 0:db396b9f4b4c 124 myled1 = 1;
jessekaiser 0:db396b9f4b4c 125 myled2 = 1;
jessekaiser 0:db396b9f4b4c 126 myled3 = 0;
jessekaiser 0:db396b9f4b4c 127 wait(1);
jessekaiser 0:db396b9f4b4c 128 myled1 = 1;
jessekaiser 0:db396b9f4b4c 129 myled2 = 1;
jessekaiser 0:db396b9f4b4c 130 myled3 = 1;
jessekaiser 0:db396b9f4b4c 131 wait(1);
jessekaiser 0:db396b9f4b4c 132 myled1 = 1;
jessekaiser 0:db396b9f4b4c 133 myled2 = 1;
jessekaiser 0:db396b9f4b4c 134 myled3 = 0;
jessekaiser 0:db396b9f4b4c 135 wait(1);}
jessekaiser 0:db396b9f4b4c 136 else if (c != '1') {
jessekaiser 0:db396b9f4b4c 137 break; }
jessekaiser 0:db396b9f4b4c 138
jessekaiser 0:db396b9f4b4c 139 if(pc.readable()) {
jessekaiser 0:db396b9f4b4c 140 c = pc.getc();
jessekaiser 0:db396b9f4b4c 141 myled1 = 1;
jessekaiser 0:db396b9f4b4c 142 myled2 = 0;
jessekaiser 0:db396b9f4b4c 143 myled3 = 1;
jessekaiser 0:db396b9f4b4c 144 wait(5); //Dit wordt de duur van het slaan en teruggaan naar de beginpositie totdat er opnieuw gemeten kan worden.
jessekaiser 0:db396b9f4b4c 145 c = '0';
jessekaiser 0:db396b9f4b4c 146 }
jessekaiser 0:db396b9f4b4c 147 }
jessekaiser 0:db396b9f4b4c 148 }
jessekaiser 0:db396b9f4b4c 149 }
jessekaiser 0:db396b9f4b4c 150 }
jessekaiser 0:db396b9f4b4c 151 }
jessekaiser 0:db396b9f4b4c 152
jessekaiser 0:db396b9f4b4c 153 int i;
jessekaiser 0:db396b9f4b4c 154
jessekaiser 0:db396b9f4b4c 155 int a(void)
jessekaiser 0:db396b9f4b4c 156 {
jessekaiser 0:db396b9f4b4c 157 i=22;
jessekaiser 0:db396b9f4b4c 158 return i;
jessekaiser 0:db396b9f4b4c 159 }
jessekaiser 0:db396b9f4b4c 160
jessekaiser 0:db396b9f4b4c 161 void b (void)
jessekaiser 0:db396b9f4b4c 162 {
jessekaiser 0:db396b9f4b4c 163 int i;
jessekaiser 0:db396b9f4b4c 164
jessekaiser 0:db396b9f4b4c 165 i=66;
jessekaiser 0:db396b9f4b4c 166 int j = a();
jessekaiser 0:db396b9f4b4c 167 pc.print(i);
jessekaiser 0:db396b9f4b4c 168 }
jessekaiser 0:db396b9f4b4c 169
jessekaiser 0:db396b9f4b4c 170 b();
jessekaiser 0:db396b9f4b4c 171