Final version used at presentation. Working parts: idle, enccali, emgcali, brushingmode, demomode(potmeter).

Dependencies:   mbed QEI HIDScope biquadFilter MODSERIAL Encoder FastPWM

Committer:
dguru
Date:
Mon Nov 04 10:32:10 2019 +0000
Revision:
3:8eb1b9e0d676
Parent:
2:6ca30ccec353
Final Version, used for presentation.; ; Working state machine for [Idle, enc_cali, Emg_cali, demo, brushingmode]; all of these modes kind of function as well.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dguru 3:8eb1b9e0d676 1 #include <math.h>
RobertoO 0:67c50348f842 2 #include "mbed.h"
dguru 3:8eb1b9e0d676 3 #include "MODSERIAL.h"
linde101 2:6ca30ccec353 4 #include "QEI.h"
dguru 3:8eb1b9e0d676 5 #include "FastPWM.h"
dguru 3:8eb1b9e0d676 6 #include "HIDScope.h"
dguru 3:8eb1b9e0d676 7 #include <stdio.h> /* printf */
dguru 3:8eb1b9e0d676 8 #include <stdlib.h> /* abs */
dguru 3:8eb1b9e0d676 9 #include <complex>
dguru 3:8eb1b9e0d676 10 #include "BiQuad.h"
linde101 2:6ca30ccec353 11
dguru 3:8eb1b9e0d676 12
dguru 3:8eb1b9e0d676 13 const double PI = 3.1415926535897;
linde101 2:6ca30ccec353 14
dguru 3:8eb1b9e0d676 15 InterruptIn but1(D1);
dguru 3:8eb1b9e0d676 16 InterruptIn but2(D0);
dguru 3:8eb1b9e0d676 17 DigitalIn butsw2(SW3);
dguru 3:8eb1b9e0d676 18 DigitalIn butsw3(SW2);
dguru 3:8eb1b9e0d676 19 AnalogIn potMeter1(A5);
dguru 3:8eb1b9e0d676 20 AnalogIn potMeter2(A4);
linde101 2:6ca30ccec353 21
dguru 3:8eb1b9e0d676 22 DigitalOut motor1_direction(D4); //richting van motor1
dguru 3:8eb1b9e0d676 23 FastPWM motor1_pwm(D5); //Motor 1 PWM controle van de snelheid
dguru 3:8eb1b9e0d676 24 DigitalOut motor2_direction(D7); //richting van motor2
dguru 3:8eb1b9e0d676 25 FastPWM motor2_pwm(D6); //Motor 2 PWM controle van de snelheid
linde101 2:6ca30ccec353 26
dguru 3:8eb1b9e0d676 27 Ticker loop_ticker;
dguru 3:8eb1b9e0d676 28 // SERIAL COMMUNICATION WITH PC.................................................
linde101 2:6ca30ccec353 29 Serial pc(USBTX, USBRX);
linde101 2:6ca30ccec353 30
dguru 3:8eb1b9e0d676 31 enum States {s_idle, s_calibratie_encoder, s_demonstratie, s_EMGcalibratie, s_EMG};
dguru 3:8eb1b9e0d676 32 States state;
dguru 3:8eb1b9e0d676 33
dguru 3:8eb1b9e0d676 34 // ENCODER .....................................................................
dguru 3:8eb1b9e0d676 35 QEI enc1 (D13, D12, NC, 4200); //encoder 1 gebruiken
dguru 3:8eb1b9e0d676 36 QEI enc2 (D9, D8, NC, 4200); //encoder 2 gebruiken
dguru 3:8eb1b9e0d676 37
dguru 3:8eb1b9e0d676 38 const float dt = 0.001;
dguru 3:8eb1b9e0d676 39 double e_int = 0;
dguru 3:8eb1b9e0d676 40 double e_int2 = 0;
dguru 3:8eb1b9e0d676 41 double theta1;
dguru 3:8eb1b9e0d676 42 double theta2;
dguru 3:8eb1b9e0d676 43 int enc1_zero = 0;
dguru 3:8eb1b9e0d676 44 int enc2_zero = 0;
dguru 3:8eb1b9e0d676 45 int enc1_value;
dguru 3:8eb1b9e0d676 46 int enc2_value;
dguru 3:8eb1b9e0d676 47 const int maxwaarde = 400;
linde101 2:6ca30ccec353 48
dguru 3:8eb1b9e0d676 49 volatile double Huidigepositie1=0;
dguru 3:8eb1b9e0d676 50 volatile double Huidigepositie2=0;
dguru 3:8eb1b9e0d676 51 volatile double motorValue1;
dguru 3:8eb1b9e0d676 52 volatile double motorValue2;
dguru 3:8eb1b9e0d676 53 volatile double refP;
dguru 3:8eb1b9e0d676 54 volatile double refP2;
dguru 3:8eb1b9e0d676 55 volatile double error1;
dguru 3:8eb1b9e0d676 56 volatile double error2;
dguru 3:8eb1b9e0d676 57
dguru 3:8eb1b9e0d676 58 bool state_changed = false;
dguru 3:8eb1b9e0d676 59 volatile bool A=true;
dguru 3:8eb1b9e0d676 60 volatile bool B=true;
dguru 3:8eb1b9e0d676 61 volatile bool but1_pressed = false;
dguru 3:8eb1b9e0d676 62 volatile bool but2_pressed = false;
dguru 3:8eb1b9e0d676 63 volatile bool butsw2_pressed = false;
dguru 3:8eb1b9e0d676 64 volatile bool butsw3_pressed = false;
dguru 3:8eb1b9e0d676 65 volatile bool failure_occurred = false;
linde101 2:6ca30ccec353 66
dguru 3:8eb1b9e0d676 67 const bool clockwise1 = true;
dguru 3:8eb1b9e0d676 68 const bool clockwise2 = true;
dguru 3:8eb1b9e0d676 69 volatile bool direction1 = clockwise1;
dguru 3:8eb1b9e0d676 70 volatile bool direction2 = clockwise2;
dguru 3:8eb1b9e0d676 71
dguru 3:8eb1b9e0d676 72 // RKI VARIABELEN...............................................................
dguru 3:8eb1b9e0d676 73 // Lengtes zijn in meters
dguru 3:8eb1b9e0d676 74 // Vaste variabelen:
dguru 3:8eb1b9e0d676 75 const double L0 = 0.25; // lengte arm 1 --> moet nog goed worden opgemeten!
dguru 3:8eb1b9e0d676 76 const double L2 = 0.375; // Lengte arm 2 --> moet ook nog goed opgemeten worden!
dguru 3:8eb1b9e0d676 77 const double r_trans = 0.035; // gebruiken voor translation naar shaft rotation
dguru 3:8eb1b9e0d676 78 //const double gear1=1.0;
dguru 3:8eb1b9e0d676 79 const double gear2=1.25;
dguru 3:8eb1b9e0d676 80
dguru 3:8eb1b9e0d676 81
dguru 3:8eb1b9e0d676 82 // Variërende variabelen:
dguru 3:8eb1b9e0d676 83 double q1 = 0; // Motorhoek van joint 1 op beginpositie
dguru 3:8eb1b9e0d676 84 double q2 = PI/2; // Motorhoek van joint 2 op beginpositie
dguru 3:8eb1b9e0d676 85 double v_x; // Snelheid van end effector in x richting --> Door EMG signals
dguru 3:8eb1b9e0d676 86 double v_y; // Snelheid van end effector in y richting --> Door EMG signals
linde101 2:6ca30ccec353 87
dguru 3:8eb1b9e0d676 88 double Lq1; // Translatieafstand als gevolg van motor rotation joint 1
dguru 3:8eb1b9e0d676 89 double Cq2; // Joint angle van het systeem (gecorrigeerd voor gear ratio 1:1.1)
dguru 3:8eb1b9e0d676 90
dguru 3:8eb1b9e0d676 91 double q1_dot; // Benodigde hoeksnelheid van motor 1
dguru 3:8eb1b9e0d676 92 double q2_dot; // Benodigde hoeksnelheid van motor 2
dguru 3:8eb1b9e0d676 93
dguru 3:8eb1b9e0d676 94 double q1_ii; // Referentie signaal voor motorhoek q1
dguru 3:8eb1b9e0d676 95 double q2_ii; // Referentie signaal voor motorhoek q2
dguru 3:8eb1b9e0d676 96
dguru 3:8eb1b9e0d676 97 //PI VARIABELEN................................................................
dguru 3:8eb1b9e0d676 98 const double kp=0.01; // Soort van geschaald --> meer onderzoek nodig
dguru 3:8eb1b9e0d676 99 const double ki=0.0001;
dguru 3:8eb1b9e0d676 100 const double kp2=0.01;
dguru 3:8eb1b9e0d676 101 const double ki2=0.0001;
dguru 3:8eb1b9e0d676 102
dguru 3:8eb1b9e0d676 103
dguru 3:8eb1b9e0d676 104 double maxPWM1 = 0.2;
dguru 3:8eb1b9e0d676 105 double maxPWM2 = 0.2;
dguru 3:8eb1b9e0d676 106
dguru 3:8eb1b9e0d676 107 //FILTERS EMG...................................................................
linde101 2:6ca30ccec353 108
dguru 3:8eb1b9e0d676 109 //Filters EMG
dguru 3:8eb1b9e0d676 110 //Filters Linker Biceps
dguru 3:8eb1b9e0d676 111 //In de volgorde High pass, notch, low pass
dguru 3:8eb1b9e0d676 112 //BiQuad LBHP1(1, 2.000000023182220, 0.999999981993818, 1.893415601022358, 0.896255659548714);
dguru 3:8eb1b9e0d676 113 //BiQuad LBHP2(1, 1.999999976817780, 0.999999976817780, 1.778313488139574, 0.790599715524785);
dguru 3:8eb1b9e0d676 114 BiQuad LBHP1(0.995566972017647, -1.991133944035294, 0.995566972017647, 1.000000000000000, -1.991114292201654, 0.991153595868935);
dguru 3:8eb1b9e0d676 115 //BiQuad LBHP2([3.913020539916823e-05,7.826041079833645e-05,3.913020539916823e-05, -1.982228929792529,0.982385450614126]);
dguru 3:8eb1b9e0d676 116 BiQuad LBN1( 0.5, 0, 0.5, 0, 0);
dguru 3:8eb1b9e0d676 117 BiQuad LBLP1(0000.087655548754006, 0000.175311097508013, 0000.087655548754006, 1.000000000000000, -1.973344249781299, 0.973694871976315);
dguru 3:8eb1b9e0d676 118 //BiQuad LBLP2( 0.000155148423475721, 0.000310296846951441, 0.000155148423475721,-1.96446058020523, 0.965081173899135);
dguru 3:8eb1b9e0d676 119 BiQuadChain LeftBicepHP;
dguru 3:8eb1b9e0d676 120 BiQuadChain LeftBicepN;
dguru 3:8eb1b9e0d676 121 BiQuadChain LeftBicepLP;
dguru 3:8eb1b9e0d676 122
dguru 3:8eb1b9e0d676 123 //Filters Rechter Biceps
dguru 3:8eb1b9e0d676 124 //In de volgorde High pass, notch, low pass
dguru 3:8eb1b9e0d676 125 //BiQuad RBHP1(1, 2.000000023182220, 0.999999981993818, 1.893415601022358, 0.896255659548714);
dguru 3:8eb1b9e0d676 126 //BiQuad RBHP2(1, 1.999999976817780, 0.999999976817780, 1.778313488139574, 0.790599715524785);
dguru 3:8eb1b9e0d676 127 BiQuad RBHP1(0.995566972017647, -1.991133944035294, 0.995566972017647, 1.000000000000000, -1.991114292201654, 0.991153595868935);
dguru 3:8eb1b9e0d676 128 //BiQuad RBHP2([3.913020539916823e-05,7.826041079833645e-05,3.913020539916823e-05, -1.982228929792529,0.982385450614126]);
dguru 3:8eb1b9e0d676 129 BiQuad RBN1( 0.5, 0, 0.5, 0, 0);
dguru 3:8eb1b9e0d676 130 BiQuad RBLP1(0000.087655548754006, 0000.175311097508013, 0000.087655548754006, 1.000000000000000, -1.973344249781299, 0.973694871976315);
dguru 3:8eb1b9e0d676 131 //BiQuad RBLP2( 0.000155148423475721, 0.000310296846951441, 0.000155148423475721,-1.96446058020523, 0.965081173899135);
dguru 3:8eb1b9e0d676 132 BiQuadChain RightBicepHP;
dguru 3:8eb1b9e0d676 133 BiQuadChain RightBicepN;
dguru 3:8eb1b9e0d676 134 BiQuadChain RightBicepLP;
dguru 3:8eb1b9e0d676 135
dguru 3:8eb1b9e0d676 136
dguru 3:8eb1b9e0d676 137 //Filters Rechter Quadriceps
dguru 3:8eb1b9e0d676 138 //In de volgorde High pass, notch, low pass
dguru 3:8eb1b9e0d676 139 //BiQuad RTHP1(1, 2.000000023182220, 0.999999981993818, 1.893415601022358, 0.896255659548714);
dguru 3:8eb1b9e0d676 140 //BiQuad RTHP2(1, 1.999999976817780, 0.999999976817780, 1.778313488139574, 0.790599715524785);
dguru 3:8eb1b9e0d676 141 BiQuad RTHP1(0.995566972017647, -1.991133944035294 , 0.995566972017647 ,1.000000000000000, -1.991114292201654 , 0.991153595868935);
dguru 3:8eb1b9e0d676 142 //BiQuad RTHP2(1, 1.999999966458334, 0.999999966458334, -1.988418014198592, 0.988451549797368);
dguru 3:8eb1b9e0d676 143 BiQuad RTN1( 0.5, 0, 0.5, 0, 0);
dguru 3:8eb1b9e0d676 144 BiQuad RTLP1(0000.087655548754006 , 0.175311097508013 , 0.087655548754006, 1.000000000000000 , -1.973344249781299 , 0.973694871976315);
dguru 3:8eb1b9e0d676 145 //BiQuad RTLP2( 0.000155148423475721, 0.000310296846951441, 0.000155148423475721,-1.96446058020523, 0.965081173899135);
dguru 3:8eb1b9e0d676 146 BiQuadChain RightLegHP;
dguru 3:8eb1b9e0d676 147 BiQuadChain RightLegN;
dguru 3:8eb1b9e0d676 148 BiQuadChain RightLegLP;
linde101 2:6ca30ccec353 149
dguru 3:8eb1b9e0d676 150 double emgLBHP;
dguru 3:8eb1b9e0d676 151 double emgLBN;
dguru 3:8eb1b9e0d676 152 double emgLBA;
dguru 3:8eb1b9e0d676 153 //double emgLBLP;
dguru 3:8eb1b9e0d676 154 //double emgAbsLBNotch;
dguru 3:8eb1b9e0d676 155
dguru 3:8eb1b9e0d676 156 double emgRBHP;
dguru 3:8eb1b9e0d676 157 double emgRBN;
dguru 3:8eb1b9e0d676 158 double emgRBA;
dguru 3:8eb1b9e0d676 159 double emgRBLP;
dguru 3:8eb1b9e0d676 160 double emgAbsRBNotch;
dguru 3:8eb1b9e0d676 161
dguru 3:8eb1b9e0d676 162 double emgRTN;
dguru 3:8eb1b9e0d676 163 double emgRTHP;
dguru 3:8eb1b9e0d676 164 double emgRTA;
dguru 3:8eb1b9e0d676 165 //double emgRTLP;
dguru 3:8eb1b9e0d676 166 //double emgAbsRTNotch;
dguru 3:8eb1b9e0d676 167
dguru 3:8eb1b9e0d676 168 double emgLBfiltered;
dguru 3:8eb1b9e0d676 169 double emgRBfiltered;
dguru 3:8eb1b9e0d676 170 double emgRTfiltered;
dguru 3:8eb1b9e0d676 171 double emgLBraw;
dguru 3:8eb1b9e0d676 172 double emgRBraw;
dguru 3:8eb1b9e0d676 173 double emgRTraw;
dguru 3:8eb1b9e0d676 174
dguru 3:8eb1b9e0d676 175
dguru 3:8eb1b9e0d676 176 double threshold_emgLB;
dguru 3:8eb1b9e0d676 177 double threshold_emgRB;
dguru 3:8eb1b9e0d676 178 double threshold_emgRT;
dguru 3:8eb1b9e0d676 179 double threshold = 0.5;
dguru 3:8eb1b9e0d676 180 double emgLB_max = 0.000;
dguru 3:8eb1b9e0d676 181 double emgRB_max = 0.000;
dguru 3:8eb1b9e0d676 182 double emgRT_max = 0.000;
dguru 3:8eb1b9e0d676 183 double emgLB_maxrust = 0.000;
dguru 3:8eb1b9e0d676 184 double emgRB_maxrust = 0.000;
dguru 3:8eb1b9e0d676 185 double emgRT_maxrust = 0.000;
dguru 3:8eb1b9e0d676 186 volatile int tijd = 0;
dguru 3:8eb1b9e0d676 187 double timecalibration;
dguru 3:8eb1b9e0d676 188
dguru 3:8eb1b9e0d676 189 double emgsumLB;
dguru 3:8eb1b9e0d676 190 double emgsumRB;
dguru 3:8eb1b9e0d676 191 double emgsumRT;
dguru 3:8eb1b9e0d676 192 double restmeanLB = 0.000;
dguru 3:8eb1b9e0d676 193 double restmeanRB = 0.000;
dguru 3:8eb1b9e0d676 194 double restmeanRT = 0.000;
dguru 3:8eb1b9e0d676 195 //double emgmeansubLB;
dguru 3:8eb1b9e0d676 196 //double emgmeansubRB;
dguru 3:8eb1b9e0d676 197 //double emgmeansubRT;
dguru 3:8eb1b9e0d676 198 double LBvalue;
dguru 3:8eb1b9e0d676 199 double RBvalue;
dguru 3:8eb1b9e0d676 200 double RTvalue;
dguru 3:8eb1b9e0d676 201 double emgLBrust;
dguru 3:8eb1b9e0d676 202 double emgRBrust;
dguru 3:8eb1b9e0d676 203 double emgRTrust;
dguru 3:8eb1b9e0d676 204 double RestmeanLB;
dguru 3:8eb1b9e0d676 205 double RestmeanRB;
dguru 3:8eb1b9e0d676 206 double RestmeanRT;
dguru 3:8eb1b9e0d676 207
dguru 3:8eb1b9e0d676 208
dguru 3:8eb1b9e0d676 209 DigitalOut ledr(LED_RED);
dguru 3:8eb1b9e0d676 210 DigitalOut ledg(LED_GREEN);
dguru 3:8eb1b9e0d676 211 DigitalOut ledb(LED_BLUE);
dguru 3:8eb1b9e0d676 212
dguru 3:8eb1b9e0d676 213
dguru 3:8eb1b9e0d676 214 AnalogIn emgLB(A0); //read EMG left bicep
dguru 3:8eb1b9e0d676 215 AnalogIn emgRB(A1); //read EMG right bicep
dguru 3:8eb1b9e0d676 216 AnalogIn emgRT(A2); //read EMG right quadriceps
dguru 3:8eb1b9e0d676 217
dguru 3:8eb1b9e0d676 218 //HIDScope scope(6); //aantal kanalen HIDScope (voor test 5, voor echt 6)
dguru 3:8eb1b9e0d676 219
dguru 3:8eb1b9e0d676 220 void rest()
dguru 3:8eb1b9e0d676 221 // Rust. Hier wordt niets uitgevoerd. Wanneer button1
dguru 3:8eb1b9e0d676 222 {
dguru 3:8eb1b9e0d676 223 // wordt ingedrukt gaan we naar de volgende state waar
dguru 3:8eb1b9e0d676 224 if (but1_pressed) { // de encoders worden gekalibreerd.
dguru 3:8eb1b9e0d676 225 state_changed = true;
dguru 3:8eb1b9e0d676 226 state = s_calibratie_encoder;
dguru 3:8eb1b9e0d676 227 but1_pressed = false;
linde101 2:6ca30ccec353 228 }
linde101 2:6ca30ccec353 229 }
linde101 2:6ca30ccec353 230
dguru 3:8eb1b9e0d676 231 void calibratie_encoder() // calibratie encoder. Hier worden de encoders gekalibreerd en op
dguru 3:8eb1b9e0d676 232 {
dguru 3:8eb1b9e0d676 233 // 0 gezet. Wanneer op button 1 wordt gedrukt gaan we naar de
dguru 3:8eb1b9e0d676 234 if (state_changed) { // demo modus, wanneer op button 2 wordt gedruk gaan we naar
dguru 3:8eb1b9e0d676 235 pc.printf("Started encoder calibration\r\n"); // de EMG calibratie
dguru 3:8eb1b9e0d676 236 state_changed = false;
dguru 3:8eb1b9e0d676 237 }
dguru 3:8eb1b9e0d676 238 else if (but1_pressed) {
dguru 3:8eb1b9e0d676 239 pc.printf("Encoder has been calibrated \r\n");
dguru 3:8eb1b9e0d676 240 enc1_value = enc1.getPulses();
dguru 3:8eb1b9e0d676 241 enc2_value = enc2.getPulses();
dguru 3:8eb1b9e0d676 242 //enc1_value -= enc1_zero;
dguru 3:8eb1b9e0d676 243 //enc2_value -= enc2_zero;
dguru 3:8eb1b9e0d676 244 theta1 = (float)(enc1_value)/(float)(4200)*2*PI; // First arm rotated fully ccw
dguru 3:8eb1b9e0d676 245 theta2 = (float)(enc2_value)/(float)(4200)*2*PI; // second arm fully clockwise --> looks like a Z
dguru 3:8eb1b9e0d676 246 enc1_zero = enc1_value;
dguru 3:8eb1b9e0d676 247 enc2_zero = enc2_value;
dguru 3:8eb1b9e0d676 248
dguru 3:8eb1b9e0d676 249
dguru 3:8eb1b9e0d676 250 pc.printf("enc01: %i\r\n", enc1_zero);
dguru 3:8eb1b9e0d676 251 pc.printf("enc1value: %i\r\n", enc1_value);
dguru 3:8eb1b9e0d676 252 pc.printf("enc02: %i\r\n",enc2_zero);
dguru 3:8eb1b9e0d676 253 pc.printf("enc2value: %i\r\n", enc2_value);
dguru 3:8eb1b9e0d676 254 pc.printf("hoek 1: %f\r\n",theta1);
dguru 3:8eb1b9e0d676 255 pc.printf("hoek 2: %f\r\n",theta2);
dguru 3:8eb1b9e0d676 256 but1_pressed = false;
dguru 3:8eb1b9e0d676 257 state_changed = true;
dguru 3:8eb1b9e0d676 258 state = s_demonstratie;
dguru 3:8eb1b9e0d676 259 }
linde101 2:6ca30ccec353 260
dguru 3:8eb1b9e0d676 261 else if (but2_pressed) {
dguru 3:8eb1b9e0d676 262 pc.printf("Encoder has been calibrated \r\n");
dguru 3:8eb1b9e0d676 263 enc1_value = enc1.getPulses();
dguru 3:8eb1b9e0d676 264 enc2_value = enc2.getPulses();
dguru 3:8eb1b9e0d676 265 //enc1_value -= enc1_zero;
dguru 3:8eb1b9e0d676 266 //enc2_value -= enc2_zero;
dguru 3:8eb1b9e0d676 267 theta1 = (float)(enc1_value)/(float)(4200)*2*PI;
dguru 3:8eb1b9e0d676 268 theta2 = (float)(enc2_value)/(float)(4200)*2*PI;
dguru 3:8eb1b9e0d676 269 enc1_zero = enc1_value;
dguru 3:8eb1b9e0d676 270 enc2_zero = enc2_value;
dguru 3:8eb1b9e0d676 271
dguru 3:8eb1b9e0d676 272
dguru 3:8eb1b9e0d676 273 pc.printf("enc01: %i\r\n", enc1_zero);
dguru 3:8eb1b9e0d676 274 pc.printf("enc1value: %i\r\n", enc1_value);
dguru 3:8eb1b9e0d676 275 pc.printf("enc02: %i\r\n",enc2_zero);
dguru 3:8eb1b9e0d676 276 pc.printf("enc2value: %i\r\n", enc2_value);
dguru 3:8eb1b9e0d676 277 pc.printf("hoek 1: %f\r\n",theta1);
dguru 3:8eb1b9e0d676 278 pc.printf("hoek 2: %f\r\n",theta2);
dguru 3:8eb1b9e0d676 279
dguru 3:8eb1b9e0d676 280 but2_pressed = false;
dguru 3:8eb1b9e0d676 281 state_changed = true;
dguru 3:8eb1b9e0d676 282 state = s_EMGcalibratie;
dguru 3:8eb1b9e0d676 283
dguru 3:8eb1b9e0d676 284 }
linde101 2:6ca30ccec353 285 }
linde101 2:6ca30ccec353 286
dguru 3:8eb1b9e0d676 287 void filteren()
dguru 3:8eb1b9e0d676 288 {
dguru 3:8eb1b9e0d676 289 //linkerbicep
dguru 3:8eb1b9e0d676 290 emgLBraw= emgLB.read(); //dit wordt: emgLBoffset
dguru 3:8eb1b9e0d676 291 emgLBHP=LeftBicepHP.step(emgLBraw);
dguru 3:8eb1b9e0d676 292 emgLBN=LeftBicepN.step(emgLBHP);
dguru 3:8eb1b9e0d676 293 //emgmeansubLB = emgLBN - RestmeanLB;
dguru 3:8eb1b9e0d676 294 emgLBA= fabs(emgLBN);
dguru 3:8eb1b9e0d676 295 emgLBfiltered=LeftBicepLP.step(emgLBA);
dguru 3:8eb1b9e0d676 296 //LBvalue = emgLBfiltered/emgLB_max;
dguru 3:8eb1b9e0d676 297
dguru 3:8eb1b9e0d676 298 /* //to show if filter is working
dguru 3:8eb1b9e0d676 299 scope.set(0, emgLBraw);
dguru 3:8eb1b9e0d676 300 scope.set(1, emgLBfiltered);
dguru 3:8eb1b9e0d676 301 scope.set(2, emgRBraw);
dguru 3:8eb1b9e0d676 302 scope.set(3, emgRBfiltered);
dguru 3:8eb1b9e0d676 303 scope.set(4, emgRTraw);
dguru 3:8eb1b9e0d676 304 scope.set(5, emgRTfiltered);
dguru 3:8eb1b9e0d676 305 scope.send();
dguru 3:8eb1b9e0d676 306 */
dguru 3:8eb1b9e0d676 307 //rechterbicep
dguru 3:8eb1b9e0d676 308 emgRBraw= emgRB.read();
dguru 3:8eb1b9e0d676 309 emgRBHP= RightBicepHP.step(emgRBraw);
dguru 3:8eb1b9e0d676 310 emgRBN=RightBicepN.step(emgRBHP);
dguru 3:8eb1b9e0d676 311 //emgmeansubRB = emgRBN - RestmeanRB;
dguru 3:8eb1b9e0d676 312 emgRBA= fabs(emgRBN);
dguru 3:8eb1b9e0d676 313 emgRBfiltered=RightBicepLP.step(emgRBA);
dguru 3:8eb1b9e0d676 314 //RBvalue = emgRBfiltered/emgRB_max;
dguru 3:8eb1b9e0d676 315
dguru 3:8eb1b9e0d676 316 //Right Quadriceps
dguru 3:8eb1b9e0d676 317 emgRTraw= emgRT.read();
dguru 3:8eb1b9e0d676 318 emgRTHP= RightLegHP.step(emgRTraw);
dguru 3:8eb1b9e0d676 319 emgRTN= RightLegN.step(emgRTHP);
dguru 3:8eb1b9e0d676 320 // emgmeansubRT = emgRTHP - RestmeanRT;
dguru 3:8eb1b9e0d676 321 emgRTA= fabs(emgRTN);
dguru 3:8eb1b9e0d676 322 emgRTfiltered=RightLegLP.step(emgRTA);
dguru 3:8eb1b9e0d676 323 //RTvalue = emgRTfiltered/emgRT_max;
dguru 3:8eb1b9e0d676 324
linde101 2:6ca30ccec353 325
linde101 2:6ca30ccec353 326 }
linde101 2:6ca30ccec353 327
dguru 3:8eb1b9e0d676 328 void EMGcalibration()
dguru 3:8eb1b9e0d676 329 {
dguru 3:8eb1b9e0d676 330
dguru 3:8eb1b9e0d676 331 emgLBraw= emgLB.read(); //dit wordt: emgLBoffset
dguru 3:8eb1b9e0d676 332 emgLBHP=LeftBicepHP.step(emgLBraw);
dguru 3:8eb1b9e0d676 333 emgLBN=LeftBicepN.step(emgLBHP);
dguru 3:8eb1b9e0d676 334 emgLBA= fabs(emgLBN);
dguru 3:8eb1b9e0d676 335 emgLBfiltered=LeftBicepLP.step(emgLBA);
dguru 3:8eb1b9e0d676 336
dguru 3:8eb1b9e0d676 337 emgRBraw= emgRB.read();
dguru 3:8eb1b9e0d676 338 emgRBHP= RightBicepHP.step(emgRBraw);
dguru 3:8eb1b9e0d676 339 emgRBN=RightBicepN.step(emgRBHP);
dguru 3:8eb1b9e0d676 340 emgRBA= fabs(emgRBN);
dguru 3:8eb1b9e0d676 341 emgRBfiltered=RightBicepLP.step(emgRBA);
dguru 3:8eb1b9e0d676 342
dguru 3:8eb1b9e0d676 343
dguru 3:8eb1b9e0d676 344 emgRTraw= emgRT.read();
dguru 3:8eb1b9e0d676 345 emgRTHP= RightLegHP.step(emgRTraw);
dguru 3:8eb1b9e0d676 346 emgRTN= RightLegN.step(emgRTHP);
dguru 3:8eb1b9e0d676 347 emgRTA= fabs(emgRTN);
dguru 3:8eb1b9e0d676 348 emgRTfiltered=RightLegLP.step(emgRTA);
dguru 3:8eb1b9e0d676 349
dguru 3:8eb1b9e0d676 350 if (tijd > 1000 && tijd < 6000) {
dguru 3:8eb1b9e0d676 351 emgLBraw= emgLB.read();
dguru 3:8eb1b9e0d676 352 emgLBHP=LeftBicepHP.step(emgLBraw);
dguru 3:8eb1b9e0d676 353 emgLBN=LeftBicepN.step(emgLBHP);
dguru 3:8eb1b9e0d676 354 //emgmeansubLB = emgLBN - restmeanLB;
dguru 3:8eb1b9e0d676 355 emgLBA= fabs(emgLBN);
dguru 3:8eb1b9e0d676 356 emgLBfiltered=LeftBicepLP.step(emgLBA);
dguru 3:8eb1b9e0d676 357 if (emgLBfiltered > emgLB_max) {
dguru 3:8eb1b9e0d676 358 emgLB_max = emgLBfiltered;
dguru 3:8eb1b9e0d676 359 }
dguru 3:8eb1b9e0d676 360 //pc.baud(115200);
dguru 3:8eb1b9e0d676 361 //pc.printf("emgLB_max = %f \r\n", emgLB_max);// geen tekst printen in ticker want dat gaat mis xjes
dguru 3:8eb1b9e0d676 362 ledr=0; //led gaat aan zodra je linkerbicep moet aanspannen
dguru 3:8eb1b9e0d676 363 }
dguru 3:8eb1b9e0d676 364
dguru 3:8eb1b9e0d676 365 else if (tijd > 7000 && tijd < 12000) {
dguru 3:8eb1b9e0d676 366 emgRBraw= emgRB.read();
dguru 3:8eb1b9e0d676 367 emgRBHP= RightBicepHP.step(emgRBraw);
dguru 3:8eb1b9e0d676 368 emgRBN=RightBicepN.step(emgRBHP);
dguru 3:8eb1b9e0d676 369 //emgmeansubRB = emgRBN - RestmeanRB;
dguru 3:8eb1b9e0d676 370 emgRBA= fabs(emgRBN);
dguru 3:8eb1b9e0d676 371 emgRBfiltered=RightBicepLP.step(emgRBA);
dguru 3:8eb1b9e0d676 372 if (emgRBfiltered > emgRB_max) {
dguru 3:8eb1b9e0d676 373 emgRB_max = emgRBfiltered;
dguru 3:8eb1b9e0d676 374 }
dguru 3:8eb1b9e0d676 375 //pc.printf("emgRB_max = %f \r\n", emgRB_max);
dguru 3:8eb1b9e0d676 376 ledr=0; //led gaat uit zodra je rechterbicep moet aanspannen
dguru 3:8eb1b9e0d676 377 }
dguru 3:8eb1b9e0d676 378
dguru 3:8eb1b9e0d676 379
dguru 3:8eb1b9e0d676 380 else if (tijd > 13000 && tijd < 18000) {
dguru 3:8eb1b9e0d676 381 emgRTraw= emgRT.read();
dguru 3:8eb1b9e0d676 382 emgRTHP= RightLegHP.step(emgRTraw);
dguru 3:8eb1b9e0d676 383 emgRTN= RightLegN.step(emgRTHP);
dguru 3:8eb1b9e0d676 384 //emgmeansubRT = emgRTHP - RestmeanRT;
dguru 3:8eb1b9e0d676 385 emgRTA= fabs(emgRTN);
dguru 3:8eb1b9e0d676 386 emgRTfiltered=RightLegLP.step(emgRTA);
dguru 3:8eb1b9e0d676 387 if (emgRTfiltered > emgRT_max) {
dguru 3:8eb1b9e0d676 388 emgRT_max = emgRTfiltered;
dguru 3:8eb1b9e0d676 389 }
dguru 3:8eb1b9e0d676 390 //pc.printf("emgRT_max = %f \r\n", emgRT_max);
dguru 3:8eb1b9e0d676 391 ledr=0; //led gaat aan zodra je rechterbeenspier moet aanspannen
dguru 3:8eb1b9e0d676 392 } else if (tijd > 18000) {
dguru 3:8eb1b9e0d676 393 ledr=1; //led gaat uit zodra kalibratie voltooid
dguru 3:8eb1b9e0d676 394 state=s_EMG;
dguru 3:8eb1b9e0d676 395 state_changed=true;
dguru 3:8eb1b9e0d676 396
dguru 3:8eb1b9e0d676 397 //pc.printf("Calibration finished!");
dguru 3:8eb1b9e0d676 398 } else {
dguru 3:8eb1b9e0d676 399 ledr=1;
dguru 3:8eb1b9e0d676 400 }
dguru 3:8eb1b9e0d676 401
dguru 3:8eb1b9e0d676 402 pc.printf("%i", tijd);
dguru 3:8eb1b9e0d676 403 tijd++;
dguru 3:8eb1b9e0d676 404 threshold_emgLB = threshold*emgLB_max; //bepaal threshold, nu op 0.15*maximale waarde.
dguru 3:8eb1b9e0d676 405 threshold_emgRB = threshold*emgRB_max;
dguru 3:8eb1b9e0d676 406 threshold_emgRT = threshold*emgRT_max;
dguru 3:8eb1b9e0d676 407
dguru 3:8eb1b9e0d676 408
dguru 3:8eb1b9e0d676 409 // if threshold_emgx is reached, brushingmodes activated
dguru 3:8eb1b9e0d676 410 }
linde101 2:6ca30ccec353 411
dguru 3:8eb1b9e0d676 412
linde101 2:6ca30ccec353 413
dguru 3:8eb1b9e0d676 414 void SetMotor1(float motorValue1)
dguru 3:8eb1b9e0d676 415 {
dguru 3:8eb1b9e0d676 416 // gegeven motorValue1 <=1, schrijft snelheid naar pwm.
dguru 3:8eb1b9e0d676 417 // MotorValues buiten range worden afgekapt dat ze binnen de range vallen.
dguru 3:8eb1b9e0d676 418 motor1_pwm.write(fabs(motorValue1) > 1 ? 1 : fabs(motorValue1));
dguru 3:8eb1b9e0d676 419 }
dguru 3:8eb1b9e0d676 420
dguru 3:8eb1b9e0d676 421 void SetMotor2(float motorValue2)
dguru 3:8eb1b9e0d676 422 {
dguru 3:8eb1b9e0d676 423 motor2_pwm.write(fabs(motorValue2) > 1 ? 1 : fabs(motorValue2));
linde101 2:6ca30ccec353 424 }
linde101 2:6ca30ccec353 425
dguru 3:8eb1b9e0d676 426 void brushingmode()
dguru 3:8eb1b9e0d676 427 {
dguru 3:8eb1b9e0d676 428
dguru 3:8eb1b9e0d676 429 //boven draait arm 1 aan, dus motor 1
dguru 3:8eb1b9e0d676 430 //onder draait arm 2 aan, dus motor 2
dguru 3:8eb1b9e0d676 431 if (emgLBfiltered > threshold_emgLB){ //tandenborstel naar links (cw/ccw) //direction1/2 = cw/ccw
dguru 3:8eb1b9e0d676 432
dguru 3:8eb1b9e0d676 433 motor2_direction.write(direction1); //motor 2 gaat cw
dguru 3:8eb1b9e0d676 434 //motor2_direction.write(direction1 = !direction1); //is counterclockwise
dguru 3:8eb1b9e0d676 435 motor2_pwm.write(maxPWM2);
dguru 3:8eb1b9e0d676 436 ledr=0;
dguru 3:8eb1b9e0d676 437
dguru 3:8eb1b9e0d676 438
dguru 3:8eb1b9e0d676 439 }else if (emgRBfiltered > threshold_emgRB){
dguru 3:8eb1b9e0d676 440 motor2_pwm.write(maxPWM2);
dguru 3:8eb1b9e0d676 441 motor2_direction.write(direction1 = !direction1); //is counterclockwise
dguru 3:8eb1b9e0d676 442 //tandenborstel naar rechts
dguru 3:8eb1b9e0d676 443 ledg=0;
dguru 3:8eb1b9e0d676 444
dguru 3:8eb1b9e0d676 445
dguru 3:8eb1b9e0d676 446 }else if (emgRTfiltered > threshold_emgRT){
dguru 3:8eb1b9e0d676 447 motor1_direction.write(direction1 = !direction1);
dguru 3:8eb1b9e0d676 448 motor1_pwm.write(maxPWM1);
dguru 3:8eb1b9e0d676 449 //tandenborstel naar achter
dguru 3:8eb1b9e0d676 450 ledb=0;
dguru 3:8eb1b9e0d676 451
dguru 3:8eb1b9e0d676 452 }else if (emgRBfiltered > threshold_emgRB && emgLBfiltered > threshold_emgLB){
dguru 3:8eb1b9e0d676 453 motor1_direction.write(direction1); //motor 1 gaat cw
dguru 3:8eb1b9e0d676 454 motor1_pwm.write(maxPWM1);
dguru 3:8eb1b9e0d676 455 //tandenborstel naar voren
dguru 3:8eb1b9e0d676 456 ledg=0;
dguru 3:8eb1b9e0d676 457 ledr=0;
dguru 3:8eb1b9e0d676 458 }
dguru 3:8eb1b9e0d676 459 }
dguru 3:8eb1b9e0d676 460
dguru 3:8eb1b9e0d676 461 void demonstratie()
dguru 3:8eb1b9e0d676 462 {
dguru 3:8eb1b9e0d676 463 if (state_changed) { //
dguru 3:8eb1b9e0d676 464 pc.printf("Demonstratie gestart\r\n") ; //
dguru 3:8eb1b9e0d676 465 state_changed = false;
dguru 3:8eb1b9e0d676 466 }
dguru 3:8eb1b9e0d676 467 }
dguru 3:8eb1b9e0d676 468
dguru 3:8eb1b9e0d676 469
dguru 3:8eb1b9e0d676 470 void RKI()
linde101 2:6ca30ccec353 471 {
dguru 3:8eb1b9e0d676 472 Lq1 = q1*r_trans;
dguru 3:8eb1b9e0d676 473 Cq2 = q2/gear2; //1.25 is gear ratio voor q2
dguru 3:8eb1b9e0d676 474
dguru 3:8eb1b9e0d676 475 q1_dot = (v_x + (v_y*(L2*sin(q2/gear2)))/(L0 + q1*r_trans + L2*cos(q2/gear2)))/r_trans;
dguru 3:8eb1b9e0d676 476 q2_dot = (gear2*v_y)/(L0 + q1*r_trans + L2*cos(q2/gear2));
dguru 3:8eb1b9e0d676 477
dguru 3:8eb1b9e0d676 478 q1_ii = q1 + q1_dot*dt;
dguru 3:8eb1b9e0d676 479 q2_ii = q2 + q2_dot*dt;
dguru 3:8eb1b9e0d676 480
dguru 3:8eb1b9e0d676 481 q1 = q1_ii;
dguru 3:8eb1b9e0d676 482 q2 = q2_ii;
dguru 3:8eb1b9e0d676 483
dguru 3:8eb1b9e0d676 484 }
dguru 3:8eb1b9e0d676 485
dguru 3:8eb1b9e0d676 486 double GetReferencePosition()
dguru 3:8eb1b9e0d676 487 {
dguru 3:8eb1b9e0d676 488 double Potmeterwaarde = potMeter2.read();
dguru 3:8eb1b9e0d676 489
dguru 3:8eb1b9e0d676 490 double refP = Potmeterwaarde*maxwaarde;
dguru 3:8eb1b9e0d676 491 return refP;
dguru 3:8eb1b9e0d676 492 }
linde101 2:6ca30ccec353 493
dguru 3:8eb1b9e0d676 494 double GetReferencePosition2()
dguru 3:8eb1b9e0d676 495 {
dguru 3:8eb1b9e0d676 496 double potmeterwaarde2 = potMeter1.read();
dguru 3:8eb1b9e0d676 497 double refP2 = potmeterwaarde2*maxwaarde;
dguru 3:8eb1b9e0d676 498 return refP2;
dguru 3:8eb1b9e0d676 499 }
dguru 3:8eb1b9e0d676 500
dguru 3:8eb1b9e0d676 501 double FeedBackControl(double error, double &e_int)
linde101 2:6ca30ccec353 502 {
dguru 3:8eb1b9e0d676 503 //double Proportional= kp*error1;
dguru 3:8eb1b9e0d676 504 double motorValue1= kp*error1;
dguru 3:8eb1b9e0d676 505 //e_int = e_int+dt*error1;
dguru 3:8eb1b9e0d676 506 //double Integrator = ki*e_int;
dguru 3:8eb1b9e0d676 507
dguru 3:8eb1b9e0d676 508 // motorValue1 = Proportional + Integrator ;
dguru 3:8eb1b9e0d676 509 return motorValue1;
dguru 3:8eb1b9e0d676 510 }
dguru 3:8eb1b9e0d676 511
dguru 3:8eb1b9e0d676 512 double FeedBackControl2(double error2, double &e_int2)
dguru 3:8eb1b9e0d676 513 {
dguru 3:8eb1b9e0d676 514 //double Proportional2= kp2*error2;
dguru 3:8eb1b9e0d676 515 double motorValue2= kp2*error2;
dguru 3:8eb1b9e0d676 516 //e_int2 = e_int2+dt*error2;
dguru 3:8eb1b9e0d676 517 //double Integrator2 = ki2*e_int2;
dguru 3:8eb1b9e0d676 518
dguru 3:8eb1b9e0d676 519 //double motorValue2 = Proportional2 + Integrator2 ;
dguru 3:8eb1b9e0d676 520 return motorValue2;
dguru 3:8eb1b9e0d676 521 }
linde101 2:6ca30ccec353 522
dguru 3:8eb1b9e0d676 523 void MeasureAndControl()
dguru 3:8eb1b9e0d676 524 {
dguru 3:8eb1b9e0d676 525 // RKI aanroepen
dguru 3:8eb1b9e0d676 526 //RKI();
dguru 3:8eb1b9e0d676 527 // hier the control of the 1st control system
dguru 3:8eb1b9e0d676 528 refP = GetReferencePosition(); //moet eigenlijk nog met RKI
dguru 3:8eb1b9e0d676 529 Huidigepositie1 = enc1.getPulses()*4200;
dguru 3:8eb1b9e0d676 530 //error1 = (refP - Huidigepositie1);// make an error
dguru 3:8eb1b9e0d676 531 error1 = refP ;// ffwd
dguru 3:8eb1b9e0d676 532 motorValue1 = FeedBackControl(error1, e_int);
dguru 3:8eb1b9e0d676 533 SetMotor1(motorValue1);
dguru 3:8eb1b9e0d676 534 // hier the control of the 2nd control system
dguru 3:8eb1b9e0d676 535 refP2 = GetReferencePosition2();
dguru 3:8eb1b9e0d676 536 Huidigepositie2 = enc2.getPulses();
dguru 3:8eb1b9e0d676 537 //error2 = (refP2 - Huidigepositie2);// make an error
dguru 3:8eb1b9e0d676 538 error2 = refP2;// ffwd
dguru 3:8eb1b9e0d676 539 motorValue2 = FeedBackControl2(error2, e_int2);
dguru 3:8eb1b9e0d676 540 SetMotor2(motorValue2);
dguru 3:8eb1b9e0d676 541 //pc.printf("refP = %d, huidigepos = %d, motorvalue = %d, refP2 = %d, huidigepos2 = %d, motorvalue2 = %d \r\n", refP, Huidigepositie1, motorValue1, refP2, Huidigepositie2, Huidigepositie2);
dguru 3:8eb1b9e0d676 542
dguru 3:8eb1b9e0d676 543 }
dguru 3:8eb1b9e0d676 544
dguru 3:8eb1b9e0d676 545 void direction()
dguru 3:8eb1b9e0d676 546 {
dguru 3:8eb1b9e0d676 547 if (butsw2==0) {
dguru 3:8eb1b9e0d676 548 if (A==true) { // zodat het knopje 1 x wordt afgelezen
dguru 3:8eb1b9e0d676 549 // richting veranderen
dguru 3:8eb1b9e0d676 550 motor1_direction.write(direction1 = !direction1);
dguru 3:8eb1b9e0d676 551 pc.printf("direction: %s\r\n\n", direction1 ? "clockwise" : "counter clockwise");
dguru 3:8eb1b9e0d676 552 A=false;
dguru 3:8eb1b9e0d676 553 }
dguru 3:8eb1b9e0d676 554 } else {
dguru 3:8eb1b9e0d676 555 A=true;
dguru 3:8eb1b9e0d676 556 }
dguru 3:8eb1b9e0d676 557
dguru 3:8eb1b9e0d676 558 if (butsw3==0) {
dguru 3:8eb1b9e0d676 559 if (B==true) {
dguru 3:8eb1b9e0d676 560 motor2_direction.write(direction2 = !direction2);
dguru 3:8eb1b9e0d676 561 pc.printf("direction: %s\r\n\n", direction2 ? "clockwise" : "counter clockwise");
dguru 3:8eb1b9e0d676 562 B=false;
dguru 3:8eb1b9e0d676 563 }
dguru 3:8eb1b9e0d676 564 } else {
dguru 3:8eb1b9e0d676 565 B=true;
dguru 3:8eb1b9e0d676 566 }
dguru 3:8eb1b9e0d676 567
dguru 3:8eb1b9e0d676 568 }
dguru 3:8eb1b9e0d676 569
dguru 3:8eb1b9e0d676 570 void but1_interrupt()
dguru 3:8eb1b9e0d676 571 {
dguru 3:8eb1b9e0d676 572 /*if(but2.read()) {//both buttons are pressed
dguru 3:8eb1b9e0d676 573 failure_occurred = true;
dguru 3:8eb1b9e0d676 574 }*/
dguru 3:8eb1b9e0d676 575 but1_pressed = true;
dguru 3:8eb1b9e0d676 576 pc.printf("Button 1 interrupt active \n\r");
dguru 3:8eb1b9e0d676 577 }
dguru 3:8eb1b9e0d676 578
dguru 3:8eb1b9e0d676 579 void but2_interrupt()
dguru 3:8eb1b9e0d676 580 {
dguru 3:8eb1b9e0d676 581 /*if(but1.read()) {//both buttons are pressed
dguru 3:8eb1b9e0d676 582 failure_occurred = true;
dguru 3:8eb1b9e0d676 583 }*/
dguru 3:8eb1b9e0d676 584 but2_pressed = true;
dguru 3:8eb1b9e0d676 585 pc.printf("Button 2 interrupt active \n\r");
dguru 3:8eb1b9e0d676 586 }
linde101 2:6ca30ccec353 587
dguru 3:8eb1b9e0d676 588 void state_machine()
dguru 3:8eb1b9e0d676 589 {
dguru 3:8eb1b9e0d676 590 //run current state
dguru 3:8eb1b9e0d676 591 switch (state) {
dguru 3:8eb1b9e0d676 592 case s_idle: // in deze state gebeurd niets. Als op knop 1 wordt gedrukt
dguru 3:8eb1b9e0d676 593 rest(); // gaan we over naar s_calibratie_encoder
dguru 3:8eb1b9e0d676 594 break;
dguru 3:8eb1b9e0d676 595 case s_calibratie_encoder: // in deze state worden de encoders gekalibreerd. knop 1 -> s_demonstratie
dguru 3:8eb1b9e0d676 596 calibratie_encoder(); // knop 2 -> s_EMGcalibratie
dguru 3:8eb1b9e0d676 597 break;
dguru 3:8eb1b9e0d676 598 case s_demonstratie: // in deze state kunnen de motors worden bestuurd met de potmeters
dguru 3:8eb1b9e0d676 599 demonstratie();
dguru 3:8eb1b9e0d676 600 MeasureAndControl(); // en switch 2 en 3( pot1,sw2->motor1 / pot2,sw3->motor2
dguru 3:8eb1b9e0d676 601 direction(); // als op knop 2 wordt gedrukt komen we in de s_idle state
dguru 3:8eb1b9e0d676 602 if (but2_pressed) {
dguru 3:8eb1b9e0d676 603 pc.printf("fail. \r\n");
dguru 3:8eb1b9e0d676 604 but2_pressed = false;
dguru 3:8eb1b9e0d676 605 state_changed = true;
dguru 3:8eb1b9e0d676 606 state = s_idle;
dguru 3:8eb1b9e0d676 607 }
dguru 3:8eb1b9e0d676 608 break;
dguru 3:8eb1b9e0d676 609
dguru 3:8eb1b9e0d676 610 case s_EMGcalibratie:
dguru 3:8eb1b9e0d676 611 EMGcalibration();
dguru 3:8eb1b9e0d676 612 break;
dguru 3:8eb1b9e0d676 613
dguru 3:8eb1b9e0d676 614 case s_EMG:
dguru 3:8eb1b9e0d676 615 ledg=1;
dguru 3:8eb1b9e0d676 616 ledr=1;
dguru 3:8eb1b9e0d676 617 ledb=1;
dguru 3:8eb1b9e0d676 618 state_changed=false;
dguru 3:8eb1b9e0d676 619 filteren();
dguru 3:8eb1b9e0d676 620 brushingmode();
dguru 3:8eb1b9e0d676 621 if (but2_pressed) {
dguru 3:8eb1b9e0d676 622 pc.printf("fail. \r\n");
dguru 3:8eb1b9e0d676 623 but2_pressed = false;
dguru 3:8eb1b9e0d676 624 state_changed = true;
dguru 3:8eb1b9e0d676 625 state = s_idle;
dguru 3:8eb1b9e0d676 626 }
dguru 3:8eb1b9e0d676 627 break;
dguru 3:8eb1b9e0d676 628
dguru 3:8eb1b9e0d676 629 }
dguru 3:8eb1b9e0d676 630 }
dguru 3:8eb1b9e0d676 631
RobertoO 0:67c50348f842 632 int main()
RobertoO 0:67c50348f842 633 {
RobertoO 0:67c50348f842 634 pc.baud(115200);
dguru 3:8eb1b9e0d676 635 pc.printf("Executing main()... \r\n");
dguru 3:8eb1b9e0d676 636 state = s_idle;
dguru 3:8eb1b9e0d676 637 ledg=1;
dguru 3:8eb1b9e0d676 638 ledr=1;
dguru 3:8eb1b9e0d676 639 ledb=1;
dguru 3:8eb1b9e0d676 640
dguru 3:8eb1b9e0d676 641 LeftBicepHP.add( &LBHP1 ); //BiQuadChain bqc; //bqc.add( &bq1 ).add( &bq2 );
dguru 3:8eb1b9e0d676 642 LeftBicepN.add( &LBN1 );
dguru 3:8eb1b9e0d676 643 LeftBicepLP.add( &LBLP1 );
dguru 3:8eb1b9e0d676 644
dguru 3:8eb1b9e0d676 645
dguru 3:8eb1b9e0d676 646 RightBicepHP.add( &RBHP1 );
dguru 3:8eb1b9e0d676 647 RightBicepN.add( &RBN1 );
dguru 3:8eb1b9e0d676 648 RightBicepLP.add( &RBLP1 );
dguru 3:8eb1b9e0d676 649
dguru 3:8eb1b9e0d676 650 RightLegHP.add( &RTHP1 );
dguru 3:8eb1b9e0d676 651 RightLegN.add( &RTN1 );
dguru 3:8eb1b9e0d676 652 RightLegLP.add( &RTLP1 );
dguru 3:8eb1b9e0d676 653
dguru 3:8eb1b9e0d676 654 but1.fall(&but1_interrupt);
dguru 3:8eb1b9e0d676 655 but2.fall(&but2_interrupt);
dguru 3:8eb1b9e0d676 656 loop_ticker.attach(&state_machine, dt);
dguru 3:8eb1b9e0d676 657 pc.printf("state_machine active!\n\r");
dguru 3:8eb1b9e0d676 658
dguru 3:8eb1b9e0d676 659 }
dguru 3:8eb1b9e0d676 660
dguru 3:8eb1b9e0d676 661
dguru 3:8eb1b9e0d676 662