Script 15-10-2019
Dependencies: Servoaansturing mbed QEI HIDScope biquadFilter MODSERIAL FastPWM
main.cpp@28:7c7508bdb21f, 2019-10-29 (annotated)
- Committer:
- Renate
- Date:
- Tue Oct 29 14:14:15 2019 +0000
- Revision:
- 28:7c7508bdb21f
- Parent:
- 23:4572750a5c59
- Child:
- 29:8e0a7c33e4e7
Mogelijk werkende operation mode, voordat de statechanged wordt aangepast;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
RobertoO | 0:67c50348f842 | 1 | #include "mbed.h" |
Rosalie | 3:6ee0b20c23b0 | 2 | #include "HIDScope.h" |
Rosalie | 3:6ee0b20c23b0 | 3 | #include "QEI.h" |
RobertoO | 1:b862262a9d14 | 4 | #include "MODSERIAL.h" |
Rosalie | 3:6ee0b20c23b0 | 5 | #include "BiQuad.h" |
Rosalie | 3:6ee0b20c23b0 | 6 | #include "FastPWM.h" |
Renate | 21:456acc79726c | 7 | #define M_PI 3.14159265358979323846 /* pi */ |
WiesjeRoskamp | 2:aee655d11b6d | 8 | #include <math.h> |
Rosalie | 5:9f1260408ef2 | 9 | #include "Servo.h" |
Renate | 21:456acc79726c | 10 | #include <cmath> |
RobertoO | 0:67c50348f842 | 11 | |
WiesjeRoskamp | 2:aee655d11b6d | 12 | Serial pc(USBTX, USBRX); |
Rosalie | 3:6ee0b20c23b0 | 13 | |
Renate | 23:4572750a5c59 | 14 | // TICKERS |
Renate | 23:4572750a5c59 | 15 | Ticker loop_ticker; |
Renate | 15:ad065ab92d11 | 16 | |
Renate | 23:4572750a5c59 | 17 | // BENODIGD VOOR PROCESS STATE MACHINE |
Renate | 23:4572750a5c59 | 18 | enum states {Motors_off, Calib_motor, Calib_EMG, Homing, Operation_mode}; |
Renate | 28:7c7508bdb21f | 19 | states currentState = Motors_off; |
Renate | 23:4572750a5c59 | 20 | bool stateChanged = true; // Make sure the initialization of first state is executed |
Renate | 23:4572750a5c59 | 21 | |
Renate | 23:4572750a5c59 | 22 | // INPUTS |
Renate | 14:54343b9fd708 | 23 | DigitalIn Power_button_pressed(D1); // Geen InterruptIn gebruiken! |
Renate | 9:4de589636f50 | 24 | DigitalIn Emergency_button_pressed(D2); |
Renate | 22:8585d41a670b | 25 | DigitalIn Motor_calib_button_pressed(SW2); |
WiesjeRoskamp | 2:aee655d11b6d | 26 | |
Renate | 15:ad065ab92d11 | 27 | AnalogIn EMG_biceps_right_raw (A0); |
Renate | 15:ad065ab92d11 | 28 | AnalogIn EMG_biceps_left_raw (A1); |
Renate | 19:1fd39a2afc30 | 29 | AnalogIn EMG_calf_raw (A2); |
Renate | 15:ad065ab92d11 | 30 | |
Renate | 23:4572750a5c59 | 31 | QEI Encoder1(D12, D13, NC, 8400, QEI::X4_ENCODING); //Checken of die D12, D9 etc wel kloppen, 8400= gear ratio x 64 |
Renate | 28:7c7508bdb21f | 32 | QEI Encoder2(D9, D10, NC, 8400, QEI::X4_ENCODING); |
Renate | 21:456acc79726c | 33 | |
Renate | 23:4572750a5c59 | 34 | // OUTPUTS |
Renate | 28:7c7508bdb21f | 35 | PwmOut motor1(D6); // Misschien moeten we hiervoor DigitalOut gebruiken, moet |
Renate | 23:4572750a5c59 | 36 | PwmOut motor2(D5); // samen kunnen gaan met de servo motor |
Renate | 21:456acc79726c | 37 | |
Renate | 23:4572750a5c59 | 38 | DigitalOut motor1_dir(D7); |
Renate | 23:4572750a5c59 | 39 | DigitalOut motor2_dir(D4); |
Renate | 23:4572750a5c59 | 40 | |
Renate | 23:4572750a5c59 | 41 | // VARIABELEN VOOR ENCODER, MOTORHOEK ETC. |
Renate | 21:456acc79726c | 42 | int counts1; |
Renate | 21:456acc79726c | 43 | int counts2; |
Renate | 21:456acc79726c | 44 | const int CPR = 64; // Counts per revolution |
Renate | 21:456acc79726c | 45 | const int full_degrees = 360; |
Renate | 21:456acc79726c | 46 | const int half_degrees = 180; |
Renate | 21:456acc79726c | 47 | double theta_h_1_deg; |
Renate | 21:456acc79726c | 48 | double theta_h_2_deg; |
Renate | 21:456acc79726c | 49 | double theta_h_1_rad; |
Renate | 21:456acc79726c | 50 | double theta_h_2_rad; |
Renate | 21:456acc79726c | 51 | |
Renate | 23:4572750a5c59 | 52 | // DEFINITIES VOOR FILTERS |
Renate | 20:a6a5bdd7d118 | 53 | |
Renate | 21:456acc79726c | 54 | // BICEPS-RECHTS |
Renate | 28:7c7508bdb21f | 55 | // Definities voor eerste BiQuadChain (High-pass en Notch) |
Renate | 28:7c7508bdb21f | 56 | BiQuadChain bqcbr; |
Renate | 28:7c7508bdb21f | 57 | BiQuad bqbr1(0.8006, -1.6012, 0.8006, -1.5610, 0.6414); // High-pass |
Renate | 21:456acc79726c | 58 | BiQuad bqbr2(1, -1.6180, 1, -1.6019, 0.9801); // Notch |
Renate | 21:456acc79726c | 59 | // Na het nemen van de absolute waarde moet de tweede BiQuadChain worden toegepast. |
Renate | 28:7c7508bdb21f | 60 | // Definieer (twee Low-pass -> vierde orde verkrijgen): |
Renate | 21:456acc79726c | 61 | BiQuadChain bqcbr2; |
Renate | 21:456acc79726c | 62 | BiQuad bqbr3(1.5515e-4, 3.1030e-4, 1.5515e-4, -1.9645, 0.9651); // Low-pass |
Renate | 21:456acc79726c | 63 | BiQuad bqbr4(1.5515e-4, 3.1030e-4, 1.5515e-4, -1.9645, 0.9651); // Low-pass |
Renate | 20:a6a5bdd7d118 | 64 | |
Renate | 21:456acc79726c | 65 | // BICEPS-LINKS |
Renate | 28:7c7508bdb21f | 66 | // Definities voor eerste BiQuadChain (High-pass en Notch) |
Renate | 28:7c7508bdb21f | 67 | BiQuadChain bqcbl; |
Renate | 28:7c7508bdb21f | 68 | BiQuad bqbl1(0.8006, -1.6012, 0.8006, -1.5610, 0.6414); // High-pass |
Renate | 21:456acc79726c | 69 | BiQuad bqbl2(1, -1.6180, 1, -1.6019, 0.9801); // Notch |
Renate | 20:a6a5bdd7d118 | 70 | // Na het nemen van de absolute waarde moet de tweede BiQuadChain worden toegepast. |
Renate | 28:7c7508bdb21f | 71 | // Definieer (twee Low-pass -> vierde orde verkrijgen): |
Renate | 21:456acc79726c | 72 | BiQuadChain bqcbl2; |
Renate | 21:456acc79726c | 73 | BiQuad bqbl3(1.5515e-4, 3.1030e-4, 1.5515e-4, -1.9645, 0.9651); // Low-pass |
Renate | 21:456acc79726c | 74 | BiQuad bqbl4(1.5515e-4, 3.1030e-4, 1.5515e-4, -1.9645, 0.9651); // Low-pass |
Renate | 21:456acc79726c | 75 | |
Renate | 21:456acc79726c | 76 | // KUIT |
Renate | 28:7c7508bdb21f | 77 | // Definities voor eerste BiQuadChain (High-pass en Notch) |
Renate | 28:7c7508bdb21f | 78 | BiQuadChain bqck; |
Renate | 28:7c7508bdb21f | 79 | BiQuad bqk1(0.8006, -1.6012, 0.8006, -1.5610, 0.6414); // High-pass |
Renate | 21:456acc79726c | 80 | BiQuad bqk2(1, -1.6180, 1, -1.6019, 0.9801); // Notch |
Renate | 21:456acc79726c | 81 | // Na het nemen van de absolute waarde moet de tweede BiQuadChain worden toegepast. |
Renate | 28:7c7508bdb21f | 82 | // Definieer (twee Low-pass -> vierde orde verkrijgen): |
Renate | 21:456acc79726c | 83 | BiQuadChain bqck2; |
Renate | 21:456acc79726c | 84 | BiQuad bqk3(1.5515e-4, 3.1030e-4, 1.5515e-4, -1.9645, 0.9651); // Low-pass |
Renate | 21:456acc79726c | 85 | BiQuad bqk4(1.5515e-4, 3.1030e-4, 1.5515e-4, -1.9645, 0.9651); // Low-pass |
Renate | 20:a6a5bdd7d118 | 86 | |
Renate | 28:7c7508bdb21f | 87 | // VARIABELEN VOOR EMG + FILTEREN |
Renate | 23:4572750a5c59 | 88 | double filtered_EMG_biceps_right; |
Renate | 23:4572750a5c59 | 89 | double filtered_EMG_biceps_left; |
Renate | 23:4572750a5c59 | 90 | double filtered_EMG_calf; |
Renate | 23:4572750a5c59 | 91 | |
Renate | 23:4572750a5c59 | 92 | double filtered_EMG_biceps_right_1; |
Renate | 23:4572750a5c59 | 93 | double filtered_EMG_biceps_left_1; |
Renate | 23:4572750a5c59 | 94 | double filtered_EMG_calf_1; |
Renate | 23:4572750a5c59 | 95 | |
Renate | 23:4572750a5c59 | 96 | double filtered_EMG_biceps_right_abs; |
Renate | 23:4572750a5c59 | 97 | double filtered_EMG_biceps_left_abs; |
Renate | 23:4572750a5c59 | 98 | double filtered_EMG_calf_abs; |
Renate | 23:4572750a5c59 | 99 | |
Renate | 28:7c7508bdb21f | 100 | double filtered_EMG_biceps_right_total; |
Renate | 23:4572750a5c59 | 101 | double filtered_EMG_biceps_left_total; |
Renate | 23:4572750a5c59 | 102 | double filtered_EMG_calf_total; |
Renate | 19:1fd39a2afc30 | 103 | |
Renate | 23:4572750a5c59 | 104 | // Variabelen voor HIDScope |
Renate | 23:4572750a5c59 | 105 | HIDScope scope(3); |
Renate | 23:4572750a5c59 | 106 | |
Renate | 23:4572750a5c59 | 107 | // VARIABELEN VOOR (INITIATIE VAN) EMG KALIBRATIE LOOP |
Renate | 28:7c7508bdb21f | 108 | bool calib = false; |
Renate | 23:4572750a5c59 | 109 | static int i_calib = 0; |
Renate | 21:456acc79726c | 110 | |
Renate | 23:4572750a5c59 | 111 | double mean_EMG_biceps_right; |
Renate | 23:4572750a5c59 | 112 | double mean_EMG_biceps_left; |
Renate | 23:4572750a5c59 | 113 | double mean_EMG_calf; |
Renate | 23:4572750a5c59 | 114 | |
Renate | 23:4572750a5c59 | 115 | // VARIABELEN VOOR OPERATION MODE |
Renate | 23:4572750a5c59 | 116 | double normalized_EMG_biceps_right; |
Renate | 23:4572750a5c59 | 117 | double normalized_EMG_biceps_left; |
Renate | 23:4572750a5c59 | 118 | double normalized_EMG_calf; |
Renate | 23:4572750a5c59 | 119 | |
Renate | 23:4572750a5c59 | 120 | // VOIDS |
Renate | 23:4572750a5c59 | 121 | |
Renate | 23:4572750a5c59 | 122 | // Noodfunctie waarbij alles uitgaat (evt. nog een rood LEDje laten branden). |
Renate | 28:7c7508bdb21f | 123 | // Enige optie is resetten, dan wordt het script opnieuw opgestart. |
Renate | 8:c7d3b67346db | 124 | void emergency() |
Renate | 28:7c7508bdb21f | 125 | { |
Renate | 28:7c7508bdb21f | 126 | loop_ticker.detach(); |
Renate | 28:7c7508bdb21f | 127 | motor1.write(0); |
Renate | 28:7c7508bdb21f | 128 | motor2.write(0); |
Renate | 28:7c7508bdb21f | 129 | pc.printf("Ik ga exploderen!!!\r\n"); |
Renate | 28:7c7508bdb21f | 130 | } |
Renate | 11:4bc0304978e2 | 131 | |
Renate | 28:7c7508bdb21f | 132 | // Motoren uitzetten |
Renate | 8:c7d3b67346db | 133 | void motors_off() |
Renate | 28:7c7508bdb21f | 134 | { |
Renate | 28:7c7508bdb21f | 135 | motor1.write(0); |
Renate | 28:7c7508bdb21f | 136 | motor2.write(0); |
Renate | 28:7c7508bdb21f | 137 | pc.printf("Motoren uit functie\r\n"); |
Renate | 28:7c7508bdb21f | 138 | } |
Renate | 28:7c7508bdb21f | 139 | |
Renate | 14:54343b9fd708 | 140 | // Motoren aanzetten |
Renate | 15:ad065ab92d11 | 141 | void motors_on() |
Renate | 28:7c7508bdb21f | 142 | { |
Renate | 28:7c7508bdb21f | 143 | motor1.write(0.9); |
Renate | 28:7c7508bdb21f | 144 | motor1_dir.write(1); |
Renate | 28:7c7508bdb21f | 145 | motor2.write(0.1); |
Renate | 28:7c7508bdb21f | 146 | motor2_dir.write(1); |
Renate | 28:7c7508bdb21f | 147 | pc.printf("Motoren aan functie\r\n"); |
Renate | 28:7c7508bdb21f | 148 | } |
Rosalie | 3:6ee0b20c23b0 | 149 | |
Renate | 6:64146e16e10c | 150 | // Finite state machine programming (calibration servo motor?) |
Renate | 28:7c7508bdb21f | 151 | void ProcessStateMachine(void) |
Renate | 28:7c7508bdb21f | 152 | { |
Renate | 23:4572750a5c59 | 153 | // Berekenen van de motorhoeken (in radialen) |
Renate | 28:7c7508bdb21f | 154 | counts1 = Encoder1.getPulses(); |
Renate | 28:7c7508bdb21f | 155 | counts2 = Encoder2.getPulses(); |
Renate | 23:4572750a5c59 | 156 | theta_h_1_deg=(counts1/(double)CPR)*(double)full_degrees; |
Renate | 23:4572750a5c59 | 157 | theta_h_2_deg=(counts2/(double)CPR)*(double)full_degrees; |
Renate | 23:4572750a5c59 | 158 | theta_h_1_rad=(theta_h_1_deg/half_degrees)*M_PI; |
Renate | 23:4572750a5c59 | 159 | theta_h_2_rad=(theta_h_2_deg/half_degrees)*M_PI; |
Renate | 28:7c7508bdb21f | 160 | |
Renate | 23:4572750a5c59 | 161 | // Eerste deel van de filters (High-pass + Notch) over het ruwe EMG signaal |
Renate | 28:7c7508bdb21f | 162 | // doen. Het ruwe signaal wordt gelezen binnen een ticker en wordt daardoor 'gesampled' |
Renate | 23:4572750a5c59 | 163 | filtered_EMG_biceps_right_1=bqbr1.step(EMG_biceps_right_raw.read()); |
Renate | 23:4572750a5c59 | 164 | filtered_EMG_biceps_left_1=bqcbl.step(EMG_biceps_left_raw.read()); |
Renate | 23:4572750a5c59 | 165 | filtered_EMG_calf_1=bqck.step(EMG_calf_raw.read()); |
Renate | 28:7c7508bdb21f | 166 | |
Renate | 23:4572750a5c59 | 167 | // Vervolgens wordt de absolute waarde hiervan genomen |
Renate | 23:4572750a5c59 | 168 | filtered_EMG_biceps_right_abs=abs(filtered_EMG_biceps_right_1); |
Renate | 23:4572750a5c59 | 169 | filtered_EMG_biceps_left_abs=abs(filtered_EMG_biceps_left_1); |
Renate | 23:4572750a5c59 | 170 | filtered_EMG_calf_abs=abs(filtered_EMG_calf_1); |
Renate | 28:7c7508bdb21f | 171 | |
Renate | 23:4572750a5c59 | 172 | // Tenslotte wordt het tweede deel van de filters (twee low-pass, voor 4e orde filter) |
Renate | 23:4572750a5c59 | 173 | // over het signaal gedaan |
Renate | 23:4572750a5c59 | 174 | filtered_EMG_biceps_right=bqcbr2.step(filtered_EMG_biceps_right_abs); |
Renate | 23:4572750a5c59 | 175 | filtered_EMG_biceps_left=bqcbl2.step(filtered_EMG_biceps_left_abs); |
Renate | 23:4572750a5c59 | 176 | filtered_EMG_calf=bqck2.step(filtered_EMG_calf_abs); |
Renate | 28:7c7508bdb21f | 177 | |
Renate | 28:7c7508bdb21f | 178 | // De gefilterde EMG-signalen kunnen tevens visueel worden weergegeven in de HIDScope |
Renate | 28:7c7508bdb21f | 179 | scope.set(0, normalized_EMG_biceps_right); |
Renate | 28:7c7508bdb21f | 180 | scope.set(1, normalized_EMG_biceps_left); |
Renate | 28:7c7508bdb21f | 181 | scope.set(2, normalized_EMG_calf); |
Renate | 23:4572750a5c59 | 182 | scope.send(); |
Renate | 28:7c7508bdb21f | 183 | |
Renate | 28:7c7508bdb21f | 184 | // Tijdens de kalibratie moet vervolgens een maximale spierspanning worden bepaald, die |
Renate | 28:7c7508bdb21f | 185 | // later kan worden gebruikt voor een normalisatie. De spieren worden hiertoe gedurende |
Renate | 23:4572750a5c59 | 186 | // 5 seconden maximaal aangespannen. De EMG waarden worden bij elkaar opgeteld, |
Renate | 28:7c7508bdb21f | 187 | // waarna het gemiddelde wordt bepaald. |
Renate | 28:7c7508bdb21f | 188 | if (calib) { |
Renate | 28:7c7508bdb21f | 189 | if (i_calib == 0) { |
Renate | 28:7c7508bdb21f | 190 | filtered_EMG_biceps_right_total=0; |
Renate | 28:7c7508bdb21f | 191 | filtered_EMG_biceps_left_total=0; |
Renate | 28:7c7508bdb21f | 192 | filtered_EMG_calf_total=0; |
Renate | 28:7c7508bdb21f | 193 | } |
Renate | 28:7c7508bdb21f | 194 | if (i_calib <= 2500) { |
Renate | 28:7c7508bdb21f | 195 | filtered_EMG_biceps_right_total+=filtered_EMG_biceps_right; |
Renate | 28:7c7508bdb21f | 196 | filtered_EMG_biceps_left_total+=filtered_EMG_biceps_left; |
Renate | 28:7c7508bdb21f | 197 | filtered_EMG_calf_total+=filtered_EMG_calf; |
Renate | 28:7c7508bdb21f | 198 | i_calib++; |
Renate | 28:7c7508bdb21f | 199 | } |
Renate | 28:7c7508bdb21f | 200 | if (i_calib > 2500) { |
Renate | 28:7c7508bdb21f | 201 | mean_EMG_biceps_right=filtered_EMG_biceps_right_total/2500.0; |
Renate | 28:7c7508bdb21f | 202 | mean_EMG_biceps_left=filtered_EMG_biceps_left_total/2500.0; |
Renate | 28:7c7508bdb21f | 203 | mean_EMG_calf=filtered_EMG_calf_total/2500.0; |
Renate | 28:7c7508bdb21f | 204 | pc.printf("Ontspan spieren\r\n"); |
Renate | 28:7c7508bdb21f | 205 | pc.printf("Rechterbiceps_max = %f, Linkerbiceps_max = %f, Kuit_max = %f\r\n", mean_EMG_biceps_right, mean_EMG_biceps_left, mean_EMG_calf); |
Renate | 28:7c7508bdb21f | 206 | calib = false; |
Renate | 28:7c7508bdb21f | 207 | } |
Renate | 28:7c7508bdb21f | 208 | } |
Renate | 28:7c7508bdb21f | 209 | |
Renate | 23:4572750a5c59 | 210 | // Genormaliseerde EMG's berekenen |
Renate | 23:4572750a5c59 | 211 | normalized_EMG_biceps_right=filtered_EMG_biceps_right/mean_EMG_biceps_right; |
Renate | 23:4572750a5c59 | 212 | normalized_EMG_biceps_left=filtered_EMG_biceps_left/mean_EMG_biceps_left; |
Renate | 23:4572750a5c59 | 213 | normalized_EMG_calf=filtered_EMG_calf/mean_EMG_calf; |
Renate | 28:7c7508bdb21f | 214 | |
Renate | 28:7c7508bdb21f | 215 | // Finite state machine |
Renate | 28:7c7508bdb21f | 216 | switch (currentState) { |
Renate | 6:64146e16e10c | 217 | case Motors_off: |
Renate | 28:7c7508bdb21f | 218 | |
Renate | 28:7c7508bdb21f | 219 | if (stateChanged) { |
Renate | 8:c7d3b67346db | 220 | motors_off(); // functie waarbij motoren uitgaan |
Renate | 11:4bc0304978e2 | 221 | stateChanged = false; |
Renate | 9:4de589636f50 | 222 | pc.printf("Motors off state\r\n"); |
Renate | 28:7c7508bdb21f | 223 | } |
Renate | 28:7c7508bdb21f | 224 | if (Power_button_pressed.read() == false) { // Normaal waarde 1 bij indrukken, nu nul -> false |
Renate | 15:ad065ab92d11 | 225 | motors_on(); |
Renate | 9:4de589636f50 | 226 | currentState = Calib_motor; |
Renate | 11:4bc0304978e2 | 227 | stateChanged = true; |
Renate | 11:4bc0304978e2 | 228 | pc.printf("Moving to Calib_motor state\r\n"); |
Renate | 6:64146e16e10c | 229 | } |
Renate | 28:7c7508bdb21f | 230 | if (Emergency_button_pressed.read() == false) { // Normaal waarde 1 bij indrukken, nu nul -> false |
Renate | 10:83f3cec8dd1c | 231 | emergency(); |
Renate | 28:7c7508bdb21f | 232 | } |
Renate | 6:64146e16e10c | 233 | break; |
Renate | 28:7c7508bdb21f | 234 | |
Renate | 9:4de589636f50 | 235 | case Calib_motor: |
Renate | 28:7c7508bdb21f | 236 | |
Renate | 28:7c7508bdb21f | 237 | if (stateChanged && Motor_calib_button_pressed.read() == false) { |
Renate | 21:456acc79726c | 238 | theta_h_1_rad = 0; |
Renate | 21:456acc79726c | 239 | theta_h_2_rad = 0; |
Renate | 21:456acc79726c | 240 | pc.printf("Huidige hoek in radialen motor 1:%f en motor 2: %f (moet 0 zijn) \r\n", theta_h_1_rad, theta_h_2_rad); |
Renate | 11:4bc0304978e2 | 241 | currentState = Calib_EMG; |
Renate | 11:4bc0304978e2 | 242 | stateChanged = true; |
Renate | 9:4de589636f50 | 243 | pc.printf("Moving to Calib_EMG state\r\n"); |
Renate | 28:7c7508bdb21f | 244 | } |
Renate | 28:7c7508bdb21f | 245 | if (Emergency_button_pressed.read() == false) { |
Renate | 11:4bc0304978e2 | 246 | emergency(); |
Renate | 28:7c7508bdb21f | 247 | } |
Renate | 11:4bc0304978e2 | 248 | break; |
Renate | 28:7c7508bdb21f | 249 | |
Renate | 28:7c7508bdb21f | 250 | case Calib_EMG: |
Renate | 28:7c7508bdb21f | 251 | |
Renate | 28:7c7508bdb21f | 252 | if (stateChanged) { |
Renate | 28:7c7508bdb21f | 253 | motors_off(); |
Renate | 28:7c7508bdb21f | 254 | i_calib = 0; |
Renate | 28:7c7508bdb21f | 255 | calib = true; |
Renate | 28:7c7508bdb21f | 256 | pc.printf("Span spieren aan\r\n"); |
Renate | 28:7c7508bdb21f | 257 | stateChanged = false; |
Renate | 28:7c7508bdb21f | 258 | } |
Renate | 28:7c7508bdb21f | 259 | |
Renate | 28:7c7508bdb21f | 260 | if (i_calib > 2500) { |
Renate | 28:7c7508bdb21f | 261 | calib = false; |
Renate | 28:7c7508bdb21f | 262 | currentState = Homing; |
Renate | 28:7c7508bdb21f | 263 | stateChanged = true; |
Renate | 28:7c7508bdb21f | 264 | pc.printf("Moving to Homing state\r\n"); |
Renate | 28:7c7508bdb21f | 265 | } |
Renate | 28:7c7508bdb21f | 266 | |
Renate | 28:7c7508bdb21f | 267 | if (Emergency_button_pressed.read() == false) { |
Renate | 11:4bc0304978e2 | 268 | emergency(); |
Renate | 28:7c7508bdb21f | 269 | } |
Renate | 28:7c7508bdb21f | 270 | break; |
Renate | 28:7c7508bdb21f | 271 | |
Renate | 28:7c7508bdb21f | 272 | case Homing: // NOG NAAR KIJKEN |
Renate | 28:7c7508bdb21f | 273 | |
Renate | 28:7c7508bdb21f | 274 | if (stateChanged) { |
Renate | 28:7c7508bdb21f | 275 | // Ervoor zorgen dat de motoren zo bewegen dat de robotarm |
Renate | 11:4bc0304978e2 | 276 | // (inclusief de end-effector) in de juiste home positie wordt gezet |
Renate | 21:456acc79726c | 277 | motors_on(); |
Renate | 28:7c7508bdb21f | 278 | |
Renate | 28:7c7508bdb21f | 279 | stateChanged = false; |
Renate | 28:7c7508bdb21f | 280 | motors_off(); |
Renate | 12:93ad9781eeef | 281 | pc.printf("Moving to operation mode \r\n"); |
Renate | 11:4bc0304978e2 | 282 | } |
Renate | 28:7c7508bdb21f | 283 | if (Emergency_button_pressed.read() == false) { |
Renate | 10:83f3cec8dd1c | 284 | emergency(); |
Renate | 28:7c7508bdb21f | 285 | } |
Renate | 28:7c7508bdb21f | 286 | |
Renate | 28:7c7508bdb21f | 287 | //... |
Renate | 11:4bc0304978e2 | 288 | |
Renate | 28:7c7508bdb21f | 289 | if (homing done) |
Renate | 28:7c7508bdb21f | 290 | { |
Renate | 28:7c7508bdb21f | 291 | currentState = Operation_mode; |
Renate | 28:7c7508bdb21f | 292 | stateChanged = true; |
Renate | 28:7c7508bdb21f | 293 | } |
Renate | 21:456acc79726c | 294 | |
Renate | 28:7c7508bdb21f | 295 | break; |
Renate | 28:7c7508bdb21f | 296 | |
Renate | 28:7c7508bdb21f | 297 | case Operation_mode: // Overgaan tot emergency wanneer referentie niet |
Renate | 28:7c7508bdb21f | 298 | // overeenkomt met werkelijkheid |
Renate | 28:7c7508bdb21f | 299 | |
Renate | 23:4572750a5c59 | 300 | // pc.printf("normalized_EMG_biceps_right= %f, mean_EMG_biceps_right = %f, filtered_EMG_biceps_right = %f\r\n", normalized_EMG_biceps_right, mean_EMG_biceps_right, filtered_EMG_biceps_right); |
Renate | 11:4bc0304978e2 | 301 | if (stateChanged) |
Renate | 28:7c7508bdb21f | 302 | |
Renate | 28:7c7508bdb21f | 303 | // Hier moet een functie worden aangeroepen die ervoor zorgt dat |
Renate | 28:7c7508bdb21f | 304 | // aan de hand van EMG-signalen de motoren kunnen worden aangestuurd, |
Renate | 28:7c7508bdb21f | 305 | // zodat de robotarm kan bewegen |
Renate | 28:7c7508bdb21f | 306 | |
Renate | 28:7c7508bdb21f | 307 | { |
Renate | 28:7c7508bdb21f | 308 | if (normalized_EMG_biceps_right >= 0.3) { |
Renate | 28:7c7508bdb21f | 309 | motor1.write(0.3); |
Renate | 28:7c7508bdb21f | 310 | motor2.write(0.3); |
Renate | 28:7c7508bdb21f | 311 | motor1_dir.write(0); |
Renate | 28:7c7508bdb21f | 312 | motor2_dir.write(0); |
Renate | 28:7c7508bdb21f | 313 | //if (normalized_EMG_calf >= 0.3) |
Renate | 28:7c7508bdb21f | 314 | //{ |
Renate | 28:7c7508bdb21f | 315 | //motor1.write(0.1); |
Renate | 28:7c7508bdb21f | 316 | //motor1_dir = !motor1_dir; |
Renate | 28:7c7508bdb21f | 317 | //} |
Renate | 28:7c7508bdb21f | 318 | |
Renate | 28:7c7508bdb21f | 319 | } else if (normalized_EMG_biceps_left >= 0.3) { |
Renate | 28:7c7508bdb21f | 320 | motor2.write(0.9); |
Renate | 28:7c7508bdb21f | 321 | motor1.write(0.9); |
Renate | 28:7c7508bdb21f | 322 | motor1_dir.write(1); |
Renate | 28:7c7508bdb21f | 323 | motor2_dir.write(1); |
Renate | 28:7c7508bdb21f | 324 | //if (normalized_EMG_calf >= 0.3) |
Renate | 28:7c7508bdb21f | 325 | //{ |
Renate | 28:7c7508bdb21f | 326 | // motor1_dir = !motor1_dir; |
Renate | 28:7c7508bdb21f | 327 | // pc.printf("Richting zou om moeten draaien"); |
Renate | 28:7c7508bdb21f | 328 | // motor2_dir = !motor2_dir; |
Renate | 28:7c7508bdb21f | 329 | //} |
Renate | 28:7c7508bdb21f | 330 | } else { |
Renate | 28:7c7508bdb21f | 331 | motor1.write(0); |
Renate | 28:7c7508bdb21f | 332 | motor2.write(0); |
Renate | 23:4572750a5c59 | 333 | } |
Renate | 28:7c7508bdb21f | 334 | //if (normalized_EMG_calf >= 0.3) |
Renate | 28:7c7508bdb21f | 335 | //{ |
Renate | 28:7c7508bdb21f | 336 | // motor1_dir = !motor1_dir; |
Renate | 28:7c7508bdb21f | 337 | // pc.printf("Richting zou om moeten draaien"); |
Renate | 28:7c7508bdb21f | 338 | // motor2_dir = !motor2_dir; |
Renate | 28:7c7508bdb21f | 339 | //} |
Renate | 28:7c7508bdb21f | 340 | |
Renate | 28:7c7508bdb21f | 341 | } |
Renate | 28:7c7508bdb21f | 342 | |
Renate | 28:7c7508bdb21f | 343 | if (Power_button_pressed.read() == false) { // Normaal waarde 1 bij indrukken, nu nul -> false |
Renate | 28:7c7508bdb21f | 344 | motors_off(); |
Renate | 28:7c7508bdb21f | 345 | currentState = Motors_off; |
Renate | 28:7c7508bdb21f | 346 | stateChanged = true; |
Renate | 28:7c7508bdb21f | 347 | pc.printf("Terug naar de state Motors_off\r\n"); |
Renate | 28:7c7508bdb21f | 348 | } |
Renate | 28:7c7508bdb21f | 349 | if (Emergency_button_pressed.read() == false) { |
Renate | 28:7c7508bdb21f | 350 | emergency(); |
Renate | 28:7c7508bdb21f | 351 | } |
Renate | 21:456acc79726c | 352 | // wait(25); |
Renate | 28:7c7508bdb21f | 353 | // else |
Renate | 28:7c7508bdb21f | 354 | // { |
Renate | 28:7c7508bdb21f | 355 | // currentState = Homing; |
Renate | 28:7c7508bdb21f | 356 | // stateChanged = true; |
Renate | 28:7c7508bdb21f | 357 | // pc.printf("Terug naar de state Homing\r\n"); |
Renate | 28:7c7508bdb21f | 358 | // } |
Renate | 21:456acc79726c | 359 | break; |
Renate | 28:7c7508bdb21f | 360 | |
Renate | 7:1d57463393c6 | 361 | default: |
Renate | 7:1d57463393c6 | 362 | // Zelfde functie als die eerder is toegepast om motoren uit te schakelen -> safety! |
Renate | 14:54343b9fd708 | 363 | motors_off(); |
Renate | 9:4de589636f50 | 364 | pc.printf("Unknown or uninplemented state reached!\r\n"); |
Renate | 28:7c7508bdb21f | 365 | |
WiesjeRoskamp | 2:aee655d11b6d | 366 | } |
Renate | 11:4bc0304978e2 | 367 | } |
WiesjeRoskamp | 2:aee655d11b6d | 368 | |
Renate | 8:c7d3b67346db | 369 | int main(void) |
Renate | 28:7c7508bdb21f | 370 | { |
Renate | 28:7c7508bdb21f | 371 | pc.printf("Opstarten\r\n"); |
Renate | 23:4572750a5c59 | 372 | |
Renate | 28:7c7508bdb21f | 373 | // Chain voor rechter biceps |
Renate | 28:7c7508bdb21f | 374 | bqcbr.add(&bqbr1).add(&bqbr2); |
Renate | 28:7c7508bdb21f | 375 | bqcbr2.add(&bqbr3).add(&bqbr4); |
Renate | 28:7c7508bdb21f | 376 | // Chain voor linker biceps |
Renate | 28:7c7508bdb21f | 377 | bqcbl.add(&bqbl1).add(&bqbl2); |
Renate | 28:7c7508bdb21f | 378 | bqcbl2.add(&bqbl3).add(&bqbl4); |
Renate | 28:7c7508bdb21f | 379 | // Chain voor kuit |
Renate | 28:7c7508bdb21f | 380 | bqck.add(&bqk1).add(&bqk2); |
Renate | 28:7c7508bdb21f | 381 | bqck2.add(&bqk3).add(&bqk4); |
Renate | 28:7c7508bdb21f | 382 | |
Renate | 28:7c7508bdb21f | 383 | loop_ticker.attach(&ProcessStateMachine, 0.002f); |
Renate | 28:7c7508bdb21f | 384 | |
Renate | 28:7c7508bdb21f | 385 | while(true) { |
Renate | 28:7c7508bdb21f | 386 | // wait(0.2); |
Renate | 28:7c7508bdb21f | 387 | /* do nothing */ |
Renate | 28:7c7508bdb21f | 388 | } |
Renate | 28:7c7508bdb21f | 389 | } |