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 PID QEI biquadFilter mbed
Fork of cpfromralph by
main.cpp@28:ec0763106a2e, 2017-10-10 (annotated)
- Committer:
 - ralphg_92
 - Date:
 - Tue Oct 10 14:17:03 2017 +0000
 - Revision:
 - 28:ec0763106a2e
 - Parent:
 - 27:ca07f895f999
 - Child:
 - 29:09c1567d6148
 
nu nog onoverzichtelijker
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| vsluiter | 0:32bb76391d89 | 1 | #include "mbed.h" | 
| vsluiter | 11:ce72ec658a95 | 2 | #include "HIDScope.h" | 
| relvorelvo | 21:136a1ab8163c | 3 | #include "BiQuad.h" | 
| relvorelvo | 21:136a1ab8163c | 4 | #include "MODSERIAL.h" | 
| ralphg_92 | 28:ec0763106a2e | 5 | #include "Calibration.h" | 
| vsluiter | 0:32bb76391d89 | 6 | |
| vsluiter | 4:8b298dfada81 | 7 | //Define objects | 
| relvorelvo | 25:07187cf76863 | 8 | AnalogIn emg1_in( A0 ); /* read out the signal */ | 
| relvorelvo | 23:e5db011bd410 | 9 | AnalogIn emg2_in( A1 ); | 
| relvorelvo | 23:e5db011bd410 | 10 | AnalogIn emg3_in( A2 ); | 
| ralphg_92 | 27:ca07f895f999 | 11 | AnalogIn emg4_in( A3 ); | 
| ralphg_92 | 27:ca07f895f999 | 12 | DigitalIn max_reader12( SW2 ); | 
| ralphg_92 | 27:ca07f895f999 | 13 | DigitalIn max_reader34( SW3 ); | 
| relvorelvo | 23:e5db011bd410 | 14 | |
| relvorelvo | 23:e5db011bd410 | 15 | Ticker main_timer; | 
| relvorelvo | 23:e5db011bd410 | 16 | Ticker max_read1; | 
| relvorelvo | 23:e5db011bd410 | 17 | Ticker max_read3; | 
| ralphg_92 | 27:ca07f895f999 | 18 | HIDScope scope( 4 ); | 
| relvorelvo | 23:e5db011bd410 | 19 | DigitalOut red(LED_RED); | 
| relvorelvo | 23:e5db011bd410 | 20 | DigitalOut blue(LED_BLUE); | 
| relvorelvo | 23:e5db011bd410 | 21 | DigitalOut green(LED_GREEN); | 
| relvorelvo | 23:e5db011bd410 | 22 | MODSERIAL pc(USBTX, USBRX); | 
| relvorelvo | 21:136a1ab8163c | 23 | |
| relvorelvo | 21:136a1ab8163c | 24 | |
| relvorelvo | 21:136a1ab8163c | 25 | // EMG variables | 
| relvorelvo | 23:e5db011bd410 | 26 | //Right Biceps | 
| relvorelvo | 23:e5db011bd410 | 27 | double emg1; | 
| relvorelvo | 23:e5db011bd410 | 28 | double emg1highfilter; | 
| relvorelvo | 23:e5db011bd410 | 29 | double emg1notchfilter; | 
| relvorelvo | 23:e5db011bd410 | 30 | double emg1abs; | 
| relvorelvo | 23:e5db011bd410 | 31 | double emg1lowfilter; | 
| relvorelvo | 23:e5db011bd410 | 32 | double emg1peak; | 
| ralphg_92 | 27:ca07f895f999 | 33 | double max1; | 
| relvorelvo | 24:26659f1de039 | 34 | double maxpart1; | 
| relvorelvo | 23:e5db011bd410 | 35 | // Left Biceps | 
| relvorelvo | 23:e5db011bd410 | 36 | double emg2; | 
| relvorelvo | 23:e5db011bd410 | 37 | double emg2highfilter; | 
| relvorelvo | 23:e5db011bd410 | 38 | double emg2notchfilter; | 
| relvorelvo | 23:e5db011bd410 | 39 | double emg2abs; | 
| relvorelvo | 23:e5db011bd410 | 40 | double emg2lowfilter; | 
| relvorelvo | 23:e5db011bd410 | 41 | double emg2peak; | 
| ralphg_92 | 27:ca07f895f999 | 42 | double max2; | 
| relvorelvo | 24:26659f1de039 | 43 | double maxpart2; | 
| ralphg_92 | 27:ca07f895f999 | 44 | // Left Lower Arm | 
| relvorelvo | 23:e5db011bd410 | 45 | double emg3; | 
| relvorelvo | 23:e5db011bd410 | 46 | double emg3highfilter; | 
| relvorelvo | 23:e5db011bd410 | 47 | double emg3notchfilter; | 
| relvorelvo | 23:e5db011bd410 | 48 | double emg3abs; | 
| relvorelvo | 23:e5db011bd410 | 49 | double emg3lowfilter; | 
| relvorelvo | 23:e5db011bd410 | 50 | double emg3peak; | 
| relvorelvo | 23:e5db011bd410 | 51 | double max3; | 
| relvorelvo | 23:e5db011bd410 | 52 | double maxpart3; | 
| ralphg_92 | 27:ca07f895f999 | 53 | // Right Lower Arm | 
| ralphg_92 | 27:ca07f895f999 | 54 | double emg4; | 
| ralphg_92 | 27:ca07f895f999 | 55 | double emg4highfilter; | 
| ralphg_92 | 27:ca07f895f999 | 56 | double emg4notchfilter; | 
| ralphg_92 | 27:ca07f895f999 | 57 | double emg4abs; | 
| ralphg_92 | 27:ca07f895f999 | 58 | double emg4lowfilter; | 
| ralphg_92 | 27:ca07f895f999 | 59 | double emg4peak; | 
| ralphg_92 | 27:ca07f895f999 | 60 | double max4; | 
| ralphg_92 | 27:ca07f895f999 | 61 | double maxpart4; | 
| vsluiter | 2:e314bb3b2d99 | 62 | |
| relvorelvo | 25:07187cf76863 | 63 | // BiQuad Filter Settings | 
| relvorelvo | 23:e5db011bd410 | 64 | // Right Biceps | 
| relvorelvo | 23:e5db011bd410 | 65 | BiQuad filterhigh1(9.704e-01,-1.9408,9.704e-01,-1.9389,9.427e-01); /* Filter at 10 Hz */ | 
| relvorelvo | 23:e5db011bd410 | 66 | BiQuad filternotch1(9.495e-01,-1.8062,9.495e-01,-1.8062,8.992e-01); /* Filter at 50 Hz */ | 
| relvorelvo | 25:07187cf76863 | 67 | BiQuad filterpeak1(1.0033,-1.984,9.852e-01,-1.9838,9.8855e-01); /* 4dB Gain peak at 11 Hz */ | 
| relvorelvo | 24:26659f1de039 | 68 | BiQuad filterlow1(1.368e-03,2.737e-03,1.369e-03,-1.9219,9.274e-01); /* Filter at 15 Hz */ | 
| relvorelvo | 23:e5db011bd410 | 69 | // Left Biceps | 
| relvorelvo | 23:e5db011bd410 | 70 | BiQuad filterhigh2(9.704e-01,-1.9408,9.704e-01,-1.9389,9.427e-01); | 
| relvorelvo | 23:e5db011bd410 | 71 | BiQuad filternotch2(9.495e-01,-1.8062,9.495e-01,-1.8062,8.992e-01); | 
| relvorelvo | 24:26659f1de039 | 72 | BiQuad filterpeak2(1.0033,-1.984,9.852e-01,-1.9838,9.8855e-01); | 
| relvorelvo | 24:26659f1de039 | 73 | BiQuad filterlow2(1.368e-03,2.737e-03,1.369e-03,-1.9219,9.274e-01); | 
| relvorelvo | 23:e5db011bd410 | 74 | // Left Lower Arm OR Triceps | 
| relvorelvo | 23:e5db011bd410 | 75 | BiQuad filterhigh3(9.704e-01,-1.9408,9.704e-01,-1.9389,9.427e-01); | 
| relvorelvo | 23:e5db011bd410 | 76 | BiQuad filternotch3(9.495e-01,-1.8062,9.495e-01,-1.8062,8.992e-01); | 
| relvorelvo | 24:26659f1de039 | 77 | BiQuad filterpeak3(1.0033,-1.984,9.852e-01,-1.9838,9.8855e-01); | 
| relvorelvo | 24:26659f1de039 | 78 | BiQuad filterlow3(1.368e-03,2.737e-03,1.369e-03,-1.9219,9.274e-01); | 
| ralphg_92 | 27:ca07f895f999 | 79 | // Right Lower Arm OR Triceps | 
| ralphg_92 | 27:ca07f895f999 | 80 | BiQuad filterhigh4(9.704e-01,-1.9408,9.704e-01,-1.9389,9.427e-01); | 
| ralphg_92 | 27:ca07f895f999 | 81 | BiQuad filternotch4(9.495e-01,-1.8062,9.495e-01,-1.8062,8.992e-01); | 
| ralphg_92 | 27:ca07f895f999 | 82 | BiQuad filterpeak4(1.0033,-1.984,9.852e-01,-1.9838,9.8855e-01); | 
| ralphg_92 | 27:ca07f895f999 | 83 | BiQuad filterlow4(1.368e-03,2.737e-03,1.369e-03,-1.9219,9.274e-01); | 
| relvorelvo | 23:e5db011bd410 | 84 | // | 
| relvorelvo | 21:136a1ab8163c | 85 | |
| relvorelvo | 23:e5db011bd410 | 86 | void get_max3(){ | 
| ralphg_92 | 27:ca07f895f999 | 87 | if (max_reader34==0){ | 
| relvorelvo | 23:e5db011bd410 | 88 | green = 1; | 
| relvorelvo | 23:e5db011bd410 | 89 | blue = 1; | 
| relvorelvo | 23:e5db011bd410 | 90 | red = !red; | 
| relvorelvo | 23:e5db011bd410 | 91 | for(int n=0;n<2000;n++){ | 
| relvorelvo | 23:e5db011bd410 | 92 | |
| relvorelvo | 23:e5db011bd410 | 93 | emg3 = emg3_in.read(); | 
| relvorelvo | 23:e5db011bd410 | 94 | emg3highfilter = filterhigh3.step(emg3); | 
| relvorelvo | 23:e5db011bd410 | 95 | emg3notchfilter = filternotch3.step(emg3highfilter); | 
| relvorelvo | 23:e5db011bd410 | 96 | emg3abs = fabs(emg3notchfilter); | 
| relvorelvo | 23:e5db011bd410 | 97 | emg3lowfilter = filterlow3.step(emg3abs); | 
| relvorelvo | 23:e5db011bd410 | 98 | emg3peak = filterpeak3.step(emg3lowfilter); | 
| relvorelvo | 23:e5db011bd410 | 99 | |
| ralphg_92 | 27:ca07f895f999 | 100 | emg4 = emg4_in.read(); | 
| ralphg_92 | 27:ca07f895f999 | 101 | emg4highfilter = filterhigh4.step(emg4); | 
| ralphg_92 | 27:ca07f895f999 | 102 | emg4notchfilter = filternotch4.step(emg4highfilter); | 
| ralphg_92 | 27:ca07f895f999 | 103 | emg4abs = fabs(emg4notchfilter); | 
| ralphg_92 | 27:ca07f895f999 | 104 | emg4lowfilter = filterlow4.step(emg4abs); | 
| ralphg_92 | 27:ca07f895f999 | 105 | emg4peak = filterpeak4.step(emg4lowfilter); | 
| ralphg_92 | 27:ca07f895f999 | 106 | |
| relvorelvo | 23:e5db011bd410 | 107 | if (max3<emg3peak){ | 
| relvorelvo | 26:c9ba45bdd5c9 | 108 | max3 = emg3peak; /* set the max value at the highest measured value */ | 
| relvorelvo | 23:e5db011bd410 | 109 | } | 
| ralphg_92 | 27:ca07f895f999 | 110 | if (max4<emg4peak){ | 
| ralphg_92 | 27:ca07f895f999 | 111 | max4 = emg4peak; /* set the max value at the highest measured value */ | 
| ralphg_92 | 27:ca07f895f999 | 112 | } | 
| relvorelvo | 23:e5db011bd410 | 113 | wait(0.001f); | 
| relvorelvo | 23:e5db011bd410 | 114 | } | 
| relvorelvo | 23:e5db011bd410 | 115 | wait(0.2f); | 
| relvorelvo | 23:e5db011bd410 | 116 | red = 1; | 
| relvorelvo | 23:e5db011bd410 | 117 | } | 
| ralphg_92 | 28:ec0763106a2e | 118 | maxpart3 = 0.2*max3; /* set cut off voltage at 25% of max for left lower arm */ | 
| ralphg_92 | 28:ec0763106a2e | 119 | maxpart4 = 0.2*max4; /* set cut off voltage at 25% of max for right lower arm */ | 
| vsluiter | 2:e314bb3b2d99 | 120 | } | 
| vsluiter | 0:32bb76391d89 | 121 | |
| relvorelvo | 23:e5db011bd410 | 122 | // Filtering & Scope | 
| relvorelvo | 23:e5db011bd410 | 123 | void filter() { | 
| relvorelvo | 23:e5db011bd410 | 124 | // Right Biceps | 
| relvorelvo | 23:e5db011bd410 | 125 | emg1 = emg1_in.read(); | 
| relvorelvo | 23:e5db011bd410 | 126 | emg1highfilter = filterhigh1.step(emg1); | 
| relvorelvo | 23:e5db011bd410 | 127 | emg1notchfilter = filternotch1.step(emg1highfilter); | 
| relvorelvo | 23:e5db011bd410 | 128 | emg1abs = fabs(emg1notchfilter); | 
| relvorelvo | 23:e5db011bd410 | 129 | emg1lowfilter = filterlow1.step(emg1abs); | 
| relvorelvo | 26:c9ba45bdd5c9 | 130 | emg1peak = filterpeak1.step(emg1lowfilter); /* Final Right Biceps values to be sent */ | 
| relvorelvo | 23:e5db011bd410 | 131 | // Left Biceps | 
| relvorelvo | 23:e5db011bd410 | 132 | emg2 = emg2_in.read(); | 
| relvorelvo | 23:e5db011bd410 | 133 | emg2highfilter = filterhigh2.step(emg2); | 
| relvorelvo | 23:e5db011bd410 | 134 | emg2notchfilter = filternotch2.step(emg2highfilter); | 
| relvorelvo | 23:e5db011bd410 | 135 | emg2abs = fabs(emg2notchfilter); | 
| relvorelvo | 23:e5db011bd410 | 136 | emg2lowfilter = filterlow2.step(emg2abs); | 
| relvorelvo | 26:c9ba45bdd5c9 | 137 | emg2peak = filterpeak2.step(emg2lowfilter); /* Final Left Biceps values to be sent */ | 
| relvorelvo | 23:e5db011bd410 | 138 | // Left Lower Arm OR Triceps | 
| relvorelvo | 23:e5db011bd410 | 139 | emg3 = emg3_in.read(); | 
| relvorelvo | 23:e5db011bd410 | 140 | emg3highfilter = filterhigh3.step(emg3); | 
| relvorelvo | 23:e5db011bd410 | 141 | emg3notchfilter = filternotch3.step(emg3highfilter); | 
| relvorelvo | 23:e5db011bd410 | 142 | emg3abs = fabs(emg3notchfilter); | 
| relvorelvo | 23:e5db011bd410 | 143 | emg3lowfilter = filterlow3.step(emg3abs); | 
| relvorelvo | 26:c9ba45bdd5c9 | 144 | emg3peak = filterpeak3.step(emg3lowfilter); /* Final Lower Arm values to be sent */ | 
| ralphg_92 | 27:ca07f895f999 | 145 | // Right Lower Arm OR Triceps | 
| ralphg_92 | 27:ca07f895f999 | 146 | emg4 = emg4_in.read(); | 
| ralphg_92 | 27:ca07f895f999 | 147 | emg4highfilter = filterhigh4.step(emg4); | 
| ralphg_92 | 27:ca07f895f999 | 148 | emg4notchfilter = filternotch4.step(emg4highfilter); | 
| ralphg_92 | 27:ca07f895f999 | 149 | emg4abs = fabs(emg4notchfilter); | 
| ralphg_92 | 27:ca07f895f999 | 150 | emg4lowfilter = filterlow4.step(emg4abs); | 
| ralphg_92 | 27:ca07f895f999 | 151 | emg4peak = filterpeak4.step(emg4lowfilter); /* Final Lower Arm values to be sent */ | 
| relvorelvo | 23:e5db011bd410 | 152 | |
| relvorelvo | 23:e5db011bd410 | 153 | |
| relvorelvo | 23:e5db011bd410 | 154 | /* Compare measurement to the calibrated value to decide actions */ | 
| relvorelvo | 26:c9ba45bdd5c9 | 155 | if (maxpart1<emg1peak){ /* See if right biceps is contracting */ | 
| relvorelvo | 23:e5db011bd410 | 156 | red = 0; | 
| relvorelvo | 23:e5db011bd410 | 157 | blue = 1; | 
| relvorelvo | 23:e5db011bd410 | 158 | green = 1; | 
| relvorelvo | 23:e5db011bd410 | 159 | } | 
| relvorelvo | 23:e5db011bd410 | 160 | else { | 
| relvorelvo | 26:c9ba45bdd5c9 | 161 | if (maxpart2<emg2peak){ /* See if left biceps is contracting */ | 
| relvorelvo | 23:e5db011bd410 | 162 | red = 1; | 
| relvorelvo | 23:e5db011bd410 | 163 | blue = 0; | 
| relvorelvo | 23:e5db011bd410 | 164 | green = 1; | 
| relvorelvo | 23:e5db011bd410 | 165 | } | 
| relvorelvo | 23:e5db011bd410 | 166 | |
| relvorelvo | 23:e5db011bd410 | 167 | else { | 
| ralphg_92 | 27:ca07f895f999 | 168 | if (maxpart3<emg3peak){ /* See if lower left arm is contracting */ | 
| relvorelvo | 23:e5db011bd410 | 169 | red = 1; | 
| relvorelvo | 23:e5db011bd410 | 170 | blue = 1; | 
| relvorelvo | 23:e5db011bd410 | 171 | green = 0; | 
| relvorelvo | 23:e5db011bd410 | 172 | } | 
| ralphg_92 | 27:ca07f895f999 | 173 | else { | 
| ralphg_92 | 27:ca07f895f999 | 174 | if (maxpart4<emg3peak){ /* See if lower right arm is contracting */ | 
| ralphg_92 | 27:ca07f895f999 | 175 | red = 0; | 
| ralphg_92 | 27:ca07f895f999 | 176 | blue = 0; | 
| ralphg_92 | 27:ca07f895f999 | 177 | green = 0; | 
| ralphg_92 | 27:ca07f895f999 | 178 | } | 
| relvorelvo | 23:e5db011bd410 | 179 | else { | 
| relvorelvo | 26:c9ba45bdd5c9 | 180 | red = 1; /* Shut down all led colors if no movement is registered */ | 
| relvorelvo | 23:e5db011bd410 | 181 | blue = 1; | 
| relvorelvo | 23:e5db011bd410 | 182 | green = 1; | 
| relvorelvo | 23:e5db011bd410 | 183 | } | 
| relvorelvo | 23:e5db011bd410 | 184 | } | 
| relvorelvo | 23:e5db011bd410 | 185 | } | 
| ralphg_92 | 27:ca07f895f999 | 186 | } | 
| relvorelvo | 23:e5db011bd410 | 187 | /* Set the sampled emg values in channel 0 (the first channel) and 1 (the second channel) in the 'HIDScope' instance named 'scope' */ | 
| relvorelvo | 26:c9ba45bdd5c9 | 188 | scope.set(0, emg1peak ); /* plot Right biceps voltage */ | 
| relvorelvo | 26:c9ba45bdd5c9 | 189 | scope.set(1, emg2peak ); /* Plot Left biceps voltage */ | 
| ralphg_92 | 27:ca07f895f999 | 190 | scope.set(2, emg3peak ); /* Plot Lower Left Arm voltage */ | 
| ralphg_92 | 27:ca07f895f999 | 191 | scope.set(3, emg4peak ); /* Plot Lower Right Arm Voltage */ | 
| relvorelvo | 23:e5db011bd410 | 192 | |
| relvorelvo | 25:07187cf76863 | 193 | scope.send(); /* send everything to the HID scope */ | 
| relvorelvo | 23:e5db011bd410 | 194 | } | 
| tomlankhorst | 15:0da764eea774 | 195 | |
| relvorelvo | 23:e5db011bd410 | 196 | int main(){ | 
| relvorelvo | 22:68ab712b62b2 | 197 | |
| relvorelvo | 25:07187cf76863 | 198 | main_timer.attach(&filter, 0.001); /* set frequency for the filters at 1000Hz */ | 
| relvorelvo | 25:07187cf76863 | 199 | max_read1.attach(&get_max1, 2); /* set the frequency of the calibration loop at 0.5Hz */ | 
| relvorelvo | 23:e5db011bd410 | 200 | max_read3.attach(&get_max3, 2); | 
| tomlankhorst | 15:0da764eea774 | 201 | while(1) {} | 
| vsluiter | 0:32bb76391d89 | 202 | } | 
