Aansturen van een LED script dmv twee EMG signalen

Dependencies:   HIDScope MODSERIAL mbed-dsp mbed

Committer:
jessekaiser
Date:
Wed Oct 15 14:11:33 2014 +0000
Revision:
1:099b19376f16
Parent:
0:db396b9f4b4c
Child:
2:39e1bde54e73
poging 1;

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