Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: HIDScope MODSERIAL biquadFilter mbed
main.cpp@1:83f7e225f7a4, 2016-11-01 (annotated)
- Committer:
- laurette
- Date:
- Tue Nov 01 14:44:00 2016 +0000
- Revision:
- 1:83f7e225f7a4
- Parent:
- 0:9033b790f263
- Child:
- 2:0c8c3ae5e1b7
Met printf, knopje werkt wel. Maar niet 5 seconde meting..
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| laurette | 0:9033b790f263 | 1 | #include "mbed.h" |
| laurette | 0:9033b790f263 | 2 | #include "HIDScope.h" |
| laurette | 0:9033b790f263 | 3 | #include "BiQuad.h" |
| laurette | 0:9033b790f263 | 4 | #include "math.h" |
| laurette | 0:9033b790f263 | 5 | #include "MODSERIAL.h" |
| laurette | 0:9033b790f263 | 6 | |
| laurette | 0:9033b790f263 | 7 | //Define EMG input |
| laurette | 0:9033b790f263 | 8 | AnalogIn emg0( A0 ); |
| laurette | 0:9033b790f263 | 9 | AnalogIn emg1( A1 ); |
| laurette | 0:9033b790f263 | 10 | AnalogIn emg2( A2 ); |
| laurette | 0:9033b790f263 | 11 | MODSERIAL pc (USBTX, USBRX); |
| laurette | 1:83f7e225f7a4 | 12 | InterruptIn knopje1 (SW2); |
| laurette | 0:9033b790f263 | 13 | |
| laurette | 0:9033b790f263 | 14 | Ticker sample_timer; |
| laurette | 0:9033b790f263 | 15 | HIDScope scope( 3 ); // 3-channel HIDScope object |
| laurette | 0:9033b790f263 | 16 | |
| laurette | 0:9033b790f263 | 17 | double signaal; |
| laurette | 0:9033b790f263 | 18 | double maximum; |
| laurette | 0:9033b790f263 | 19 | double Spier1Max; |
| laurette | 0:9033b790f263 | 20 | double Spier2Max; |
| laurette | 0:9033b790f263 | 21 | double Spier3Max; |
| laurette | 0:9033b790f263 | 22 | int x = 0; |
| laurette | 0:9033b790f263 | 23 | bool y = true; |
| laurette | 0:9033b790f263 | 24 | |
| laurette | 0:9033b790f263 | 25 | // Filter coordinates of lowpass/highpass filter before rectifier and lowpassfilter for the envelope |
| laurette | 0:9033b790f263 | 26 | const double b0_low = 0.2929, b1_low = 0.5858, b2_low = 0.2929, a1_low = 0, a2_low = 0.1716; |
| laurette | 0:9033b790f263 | 27 | const double b0_high = 0.9978, b1_high = -1.9956, b2_high = 0.9978, a1_high = -1.9956, a2_high = 0.9956; |
| laurette | 0:9033b790f263 | 28 | const double b0_envelope = 2.2059E-5, b1_envelope = 4.4119E-4, b2_envelope = 2.2059E-5, a1_envelope = -1.9867, a2_envelope = 0.9868; |
| laurette | 0:9033b790f263 | 29 | |
| laurette | 0:9033b790f263 | 30 | double Spier1, Spier2, Spier3; // Gefilterde output |
| laurette | 0:9033b790f263 | 31 | |
| laurette | 0:9033b790f263 | 32 | // Biquad filters (lowpass and highpass become a chain in the int main) |
| laurette | 0:9033b790f263 | 33 | BiQuad lowpass1(b0_low, b1_low , b2_low, a1_low, a2_low); |
| laurette | 0:9033b790f263 | 34 | BiQuad lowpass2(b0_low, b1_low , b2_low, a1_low, a2_low); |
| laurette | 0:9033b790f263 | 35 | BiQuad lowpass3(b0_low, b1_low , b2_low, a1_low, a2_low); |
| laurette | 0:9033b790f263 | 36 | BiQuad highpass1(b0_high, b1_high , b2_high, a1_high, a2_high); |
| laurette | 0:9033b790f263 | 37 | BiQuad highpass2(b0_high, b1_high , b2_high, a1_high, a2_high); |
| laurette | 0:9033b790f263 | 38 | BiQuad highpass3(b0_high, b1_high , b2_high, a1_high, a2_high); |
| laurette | 0:9033b790f263 | 39 | BiQuad envelope1(b0_envelope, b1_envelope , b2_envelope, a1_envelope, a2_envelope); |
| laurette | 0:9033b790f263 | 40 | BiQuad envelope2(b0_envelope, b1_envelope , b2_envelope, a1_envelope, a2_envelope); |
| laurette | 0:9033b790f263 | 41 | BiQuad envelope3(b0_envelope, b1_envelope , b2_envelope, a1_envelope, a2_envelope); |
| laurette | 0:9033b790f263 | 42 | BiQuadChain bandpass1; |
| laurette | 0:9033b790f263 | 43 | BiQuadChain bandpass2; |
| laurette | 0:9033b790f263 | 44 | BiQuadChain bandpass3; |
| laurette | 0:9033b790f263 | 45 | |
| laurette | 0:9033b790f263 | 46 | // Sample function, this function samples the emg and sends it to HIDScope |
| laurette | 0:9033b790f263 | 47 | void filtering() |
| laurette | 0:9033b790f263 | 48 | { |
| laurette | 0:9033b790f263 | 49 | Spier1 = bandpass1.step(emg0); |
| laurette | 0:9033b790f263 | 50 | Spier2 = bandpass2.step(emg1); |
| laurette | 0:9033b790f263 | 51 | Spier3 = bandpass3.step(emg2); |
| laurette | 0:9033b790f263 | 52 | Spier1 = fabs(Spier1); |
| laurette | 0:9033b790f263 | 53 | Spier2 = fabs(Spier2); |
| laurette | 0:9033b790f263 | 54 | Spier3 = fabs(Spier3); |
| laurette | 0:9033b790f263 | 55 | Spier1 = envelope1.step(Spier1); |
| laurette | 0:9033b790f263 | 56 | Spier2 = envelope2.step(Spier2); |
| laurette | 0:9033b790f263 | 57 | Spier3 = envelope3.step(Spier3); |
| laurette | 0:9033b790f263 | 58 | |
| laurette | 0:9033b790f263 | 59 | // Set the sampled and filtered emg values in channel 0/1/2 in the 'HIDScope' instance named 'scope' |
| laurette | 0:9033b790f263 | 60 | scope.set(0, Spier1 ); |
| laurette | 0:9033b790f263 | 61 | scope.set(1, Spier2 ); |
| laurette | 0:9033b790f263 | 62 | scope.set(2, Spier3 ); |
| laurette | 0:9033b790f263 | 63 | |
| laurette | 0:9033b790f263 | 64 | scope.send(); // Sends all channels to the PC at once |
| laurette | 0:9033b790f263 | 65 | } |
| laurette | 0:9033b790f263 | 66 | |
| laurette | 0:9033b790f263 | 67 | float GetMaximumSpier1() |
| laurette | 0:9033b790f263 | 68 | { |
| laurette | 0:9033b790f263 | 69 | maximum = Spier1; |
| laurette | 0:9033b790f263 | 70 | for(int i = 0; i<250000;i++) |
| laurette | 0:9033b790f263 | 71 | { |
| laurette | 0:9033b790f263 | 72 | signaal = Spier1; |
| laurette | 0:9033b790f263 | 73 | if(signaal>maximum) |
| laurette | 0:9033b790f263 | 74 | { |
| laurette | 0:9033b790f263 | 75 | maximum = signaal; |
| laurette | 0:9033b790f263 | 76 | } |
| laurette | 0:9033b790f263 | 77 | else |
| laurette | 0:9033b790f263 | 78 | { |
| laurette | 0:9033b790f263 | 79 | maximum = maximum; |
| laurette | 0:9033b790f263 | 80 | } |
| laurette | 0:9033b790f263 | 81 | } |
| laurette | 0:9033b790f263 | 82 | return maximum; |
| laurette | 0:9033b790f263 | 83 | } |
| laurette | 0:9033b790f263 | 84 | |
| laurette | 0:9033b790f263 | 85 | float GetMaximumSpier2() |
| laurette | 0:9033b790f263 | 86 | { |
| laurette | 0:9033b790f263 | 87 | maximum = Spier2; |
| laurette | 0:9033b790f263 | 88 | for(int i = 0; i<250000;i++) |
| laurette | 0:9033b790f263 | 89 | { |
| laurette | 0:9033b790f263 | 90 | signaal = Spier2; |
| laurette | 0:9033b790f263 | 91 | if(signaal>maximum) |
| laurette | 0:9033b790f263 | 92 | { |
| laurette | 0:9033b790f263 | 93 | maximum = signaal; |
| laurette | 0:9033b790f263 | 94 | } |
| laurette | 0:9033b790f263 | 95 | else |
| laurette | 0:9033b790f263 | 96 | { |
| laurette | 0:9033b790f263 | 97 | maximum = maximum; |
| laurette | 0:9033b790f263 | 98 | } |
| laurette | 0:9033b790f263 | 99 | } |
| laurette | 0:9033b790f263 | 100 | return maximum; |
| laurette | 0:9033b790f263 | 101 | } |
| laurette | 0:9033b790f263 | 102 | |
| laurette | 0:9033b790f263 | 103 | float GetMaximumSpier3() |
| laurette | 0:9033b790f263 | 104 | { |
| laurette | 0:9033b790f263 | 105 | maximum = Spier3; |
| laurette | 0:9033b790f263 | 106 | for(int i = 0; i<250000;i++) |
| laurette | 0:9033b790f263 | 107 | { |
| laurette | 0:9033b790f263 | 108 | signaal = Spier3; |
| laurette | 0:9033b790f263 | 109 | if(signaal>maximum) |
| laurette | 0:9033b790f263 | 110 | { |
| laurette | 0:9033b790f263 | 111 | maximum = signaal; |
| laurette | 0:9033b790f263 | 112 | } |
| laurette | 0:9033b790f263 | 113 | else |
| laurette | 0:9033b790f263 | 114 | { |
| laurette | 0:9033b790f263 | 115 | maximum = maximum; |
| laurette | 0:9033b790f263 | 116 | } |
| laurette | 0:9033b790f263 | 117 | } |
| laurette | 0:9033b790f263 | 118 | return maximum; |
| laurette | 0:9033b790f263 | 119 | } |
| laurette | 0:9033b790f263 | 120 | |
| laurette | 0:9033b790f263 | 121 | void GoOn() |
| laurette | 0:9033b790f263 | 122 | { |
| laurette | 0:9033b790f263 | 123 | x++; |
| laurette | 0:9033b790f263 | 124 | y = false; |
| laurette | 1:83f7e225f7a4 | 125 | pc.printf("GoOn x=%i en y=%i\n\r",x,y); |
| laurette | 0:9033b790f263 | 126 | } |
| laurette | 0:9033b790f263 | 127 | |
| laurette | 0:9033b790f263 | 128 | void StartMeting() |
| laurette | 0:9033b790f263 | 129 | { |
| laurette | 0:9033b790f263 | 130 | switch(x) |
| laurette | 0:9033b790f263 | 131 | { |
| laurette | 0:9033b790f263 | 132 | case 0: |
| laurette | 0:9033b790f263 | 133 | pc.printf("case 0\n\r"); |
| laurette | 0:9033b790f263 | 134 | y = true; |
| laurette | 1:83f7e225f7a4 | 135 | while(y == true) {pc.printf("%i",y);} |
| laurette | 1:83f7e225f7a4 | 136 | break; |
| laurette | 0:9033b790f263 | 137 | case 1: |
| laurette | 0:9033b790f263 | 138 | pc.printf("case 1\n\r"); |
| laurette | 0:9033b790f263 | 139 | Spier1Max = GetMaximumSpier1(); |
| laurette | 0:9033b790f263 | 140 | pc.printf("Spier1Max = %f\n\r",Spier1Max); |
| laurette | 0:9033b790f263 | 141 | y = true; |
| laurette | 1:83f7e225f7a4 | 142 | while(y == true) {pc.printf("%i",y);} |
| laurette | 1:83f7e225f7a4 | 143 | break; |
| laurette | 0:9033b790f263 | 144 | case 2: |
| laurette | 0:9033b790f263 | 145 | pc.printf("case 2\n\r"); |
| laurette | 0:9033b790f263 | 146 | Spier2Max = GetMaximumSpier2(); |
| laurette | 0:9033b790f263 | 147 | pc.printf("Spier2Max = %f\n\r",Spier2Max); |
| laurette | 0:9033b790f263 | 148 | y = true; |
| laurette | 1:83f7e225f7a4 | 149 | while (y == true) {pc.printf("%i",y);} |
| laurette | 1:83f7e225f7a4 | 150 | break; |
| laurette | 0:9033b790f263 | 151 | case 3: |
| laurette | 0:9033b790f263 | 152 | pc.printf("case 3\n\r"); |
| laurette | 0:9033b790f263 | 153 | Spier3Max = GetMaximumSpier3(); |
| laurette | 0:9033b790f263 | 154 | pc.printf("Spier3Max = %f\n\r",Spier3Max); |
| laurette | 0:9033b790f263 | 155 | y = true; |
| laurette | 1:83f7e225f7a4 | 156 | while (y == true) {pc.printf("%i",y);} |
| laurette | 1:83f7e225f7a4 | 157 | break; |
| laurette | 0:9033b790f263 | 158 | case 4: |
| laurette | 0:9033b790f263 | 159 | pc.printf("case 4\n\r"); |
| laurette | 0:9033b790f263 | 160 | break; |
| laurette | 0:9033b790f263 | 161 | } |
| laurette | 0:9033b790f263 | 162 | } |
| laurette | 0:9033b790f263 | 163 | |
| laurette | 0:9033b790f263 | 164 | int main() |
| laurette | 0:9033b790f263 | 165 | { |
| laurette | 0:9033b790f263 | 166 | bandpass1.add(&lowpass1).add(&highpass1); |
| laurette | 0:9033b790f263 | 167 | bandpass2.add(&lowpass2).add(&highpass2); |
| laurette | 0:9033b790f263 | 168 | bandpass3.add(&lowpass3).add(&highpass3); |
| laurette | 0:9033b790f263 | 169 | sample_timer.attach(&filtering, 0.001); // Attach the 'sample' function to the timer 'sample_timer'. This ensures that 'sample' is executed every 0.001 seconds = 1000 Hz |
| laurette | 0:9033b790f263 | 170 | |
| laurette | 0:9033b790f263 | 171 | pc.baud(115200); |
| laurette | 0:9033b790f263 | 172 | pc.printf("START\n\r"); |
| laurette | 0:9033b790f263 | 173 | knopje1.fall(GoOn); |
| laurette | 0:9033b790f263 | 174 | StartMeting(); |
| laurette | 1:83f7e225f7a4 | 175 | StartMeting(); |
| laurette | 1:83f7e225f7a4 | 176 | StartMeting(); |
| laurette | 1:83f7e225f7a4 | 177 | StartMeting(); |
| laurette | 0:9033b790f263 | 178 | pc.printf("Spiermax1 = %f\n\rSpiermax2 = %f\n\rSpier3max = %f\n\r\n\n",Spier1Max,Spier2Max,Spier3Max); |
| laurette | 0:9033b790f263 | 179 | |
| laurette | 0:9033b790f263 | 180 | while(1) {} // Empty loop, sample() is executed periodically |
| laurette | 0:9033b790f263 | 181 | } |