![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
2014-10-15 Arm 1 naar thuispositie. Eerste poging, fout in keep_in_range
Dependencies: Encoder MODSERIAL TextLCD mbed mbed-dsp
main.cpp@16:c34c5d9dfe1a, 2014-10-28 (annotated)
- Committer:
- JKleinRot
- Date:
- Tue Oct 28 18:19:08 2014 +0000
- Revision:
- 16:c34c5d9dfe1a
- Parent:
- 15:3ebd0e666a9c
- Child:
- 17:c694a0e63a89
2014-10-28 LCD scherm pinnen aangepast en de printf voor lcd gemaakt. Comments tot halverwege af
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JKleinRot | 0:859c89785d3f | 1 | #include "mbed.h" //Mbed bibliotheek inladen, standaard functies |
JKleinRot | 0:859c89785d3f | 2 | #include "MODSERIAL.h" //MODSERIAL bibliotheek inladen, communicatie met PC |
JKleinRot | 0:859c89785d3f | 3 | #include "encoder.h" //Encoder bibliotheek inladen, communicatie met encoder |
JKleinRot | 0:859c89785d3f | 4 | #include "TextLCD.h" //LCD scherm bibliotheek inladen, communicatie met LCD scherm |
JKleinRot | 15:3ebd0e666a9c | 5 | #include "arm_math.h" //Filter bibliotheek inladen, makkelijk de filters maken, minder grote lappen tekst |
JKleinRot | 0:859c89785d3f | 6 | |
JKleinRot | 0:859c89785d3f | 7 | //Constanten definiëren en waarde geven |
JKleinRot | 11:e9b906b5f572 | 8 | #define SAMPLETIME_REGELAAR 0.005 //Sampletijd ticker regelaar motor |
JKleinRot | 16:c34c5d9dfe1a | 9 | #define KP_arm1 0.01 //Factor proprotionele regelaar arm 1 |
JKleinRot | 16:c34c5d9dfe1a | 10 | #define KI_arm1 0 //Factor integraal regelaar arm 1 |
JKleinRot | 16:c34c5d9dfe1a | 11 | #define KD_arm1 0 //Factor afgeleide regelaar arm 1 |
JKleinRot | 16:c34c5d9dfe1a | 12 | #define KP_arm2 0.01 //Factor proprotionele regelaar arm 2 |
JKleinRot | 13:54ee98850a15 | 13 | #define KI_arm2 0 //Factor integraal regelaar arm 2 |
JKleinRot | 16:c34c5d9dfe1a | 14 | #define KD_arm2 0 //Factor afgeleide regelaar arm 2 |
JKleinRot | 11:e9b906b5f572 | 15 | #define SAMPLETIME_EMG 0.005 //Sampletijd ticker EMG meten |
JKleinRot | 11:e9b906b5f572 | 16 | #define PULS_ARM1_HOME_KALIBRATIE 180 //Aantal pulsen die de encoder moet tellen voordat de arm de goede positie heeft |
JKleinRot | 11:e9b906b5f572 | 17 | #define PULS_ARM2_HOME_KALIBRATIE 393 //Aantal pulsen die de encoder moet tellen voordat de arm de goede positie heeft |
JKleinRot | 0:859c89785d3f | 18 | |
JKleinRot | 16:c34c5d9dfe1a | 19 | //Filtercoëfficiënten per filter, allemaal 2e orde filters, zo cascade van hogere orde mogelijk |
JKleinRot | 16:c34c5d9dfe1a | 20 | //High Pass filter |
JKleinRot | 15:3ebd0e666a9c | 21 | #define A1 1 |
JKleinRot | 15:3ebd0e666a9c | 22 | #define A2 -1.5610 |
JKleinRot | 15:3ebd0e666a9c | 23 | #define A3 0.6414 |
JKleinRot | 15:3ebd0e666a9c | 24 | #define B1 0.0201 |
JKleinRot | 15:3ebd0e666a9c | 25 | #define B2 0.0402 |
JKleinRot | 15:3ebd0e666a9c | 26 | #define B3 0.0201 |
JKleinRot | 13:54ee98850a15 | 27 | |
JKleinRot | 16:c34c5d9dfe1a | 28 | //Notch filter |
JKleinRot | 13:54ee98850a15 | 29 | #define C1 1 |
JKleinRot | 13:54ee98850a15 | 30 | #define C2 -1.1873E-16 |
JKleinRot | 13:54ee98850a15 | 31 | #define C3 0.9391 |
JKleinRot | 13:54ee98850a15 | 32 | #define D1 0.9695 |
JKleinRot | 13:54ee98850a15 | 33 | #define D2 -1.1873E-16 |
JKleinRot | 13:54ee98850a15 | 34 | #define D3 0.9695 |
JKleinRot | 13:54ee98850a15 | 35 | |
JKleinRot | 16:c34c5d9dfe1a | 36 | //Low pass filter |
JKleinRot | 13:54ee98850a15 | 37 | #define E1 1 |
JKleinRot | 15:3ebd0e666a9c | 38 | #define E2 -1.9645 |
JKleinRot | 15:3ebd0e666a9c | 39 | #define E3 0.9651 |
JKleinRot | 15:3ebd0e666a9c | 40 | #define F1 1.5515E-4 |
JKleinRot | 15:3ebd0e666a9c | 41 | #define F2 3.1030E-4 |
JKleinRot | 15:3ebd0e666a9c | 42 | #define F3 1.5515E-4 |
JKleinRot | 15:3ebd0e666a9c | 43 | |
JKleinRot | 0:859c89785d3f | 44 | //Pinverdeling en naamgeving variabelen |
JKleinRot | 16:c34c5d9dfe1a | 45 | TextLCD lcd(PTD2, PTA12, PTB2, PTB3, PTC2, PTA13, TextLCD::LCD16x2); //LCD scherm |
JKleinRot | 16:c34c5d9dfe1a | 46 | MODSERIAL pc(USBTX, USBRX); //PC |
JKleinRot | 0:859c89785d3f | 47 | |
JKleinRot | 16:c34c5d9dfe1a | 48 | PwmOut pwm_motor_arm1(PTA5); //PWM naar motor arm 1 |
JKleinRot | 16:c34c5d9dfe1a | 49 | DigitalOut dir_motor_arm1(PTA4); //Richting van motor arm 1 |
JKleinRot | 16:c34c5d9dfe1a | 50 | Encoder puls_motor_arm1(PTD0, PTD2); //Encoder pulsen tellen van motor arm 1, (geel, wit) |
JKleinRot | 16:c34c5d9dfe1a | 51 | PwmOut pwm_motor_arm2(PTC8); //PWM naar motor arm 2 |
JKleinRot | 16:c34c5d9dfe1a | 52 | DigitalOut dir_motor_arm2(PTC9); //Ricting van motor arm 2 |
JKleinRot | 16:c34c5d9dfe1a | 53 | Encoder puls_motor_arm2(PTD5, PTA13); //Encoder pulsen tellen van motor arm 2, (geel, wit) |
JKleinRot | 16:c34c5d9dfe1a | 54 | AnalogIn EMG_bi(PTB1); //Uitlezen EMG signaal biceps |
JKleinRot | 16:c34c5d9dfe1a | 55 | AnalogIn EMG_tri(PTB2); //Uitlezen EMG signaal triceps |
JKleinRot | 16:c34c5d9dfe1a | 56 | //Blauw op 3,3 V en groen op GND, voeding beide encoders |
JKleinRot | 1:e5e1eb9d0025 | 57 | |
JKleinRot | 6:3b6fad529520 | 58 | Ticker ticker_regelaar; //Ticker voor regelaar motor |
JKleinRot | 6:3b6fad529520 | 59 | Ticker ticker_EMG; //Ticker voor EMG meten |
JKleinRot | 16:c34c5d9dfe1a | 60 | Timer biceps_kalibratie; //Timer voor kalibratiemeting EMG biceps |
JKleinRot | 16:c34c5d9dfe1a | 61 | Timer triceps_kalibratie; //Timer voor kalibratiemeting EMG triceps |
JKleinRot | 1:e5e1eb9d0025 | 62 | |
JKleinRot | 9:454e7da8ab65 | 63 | //States definiëren |
JKleinRot | 16:c34c5d9dfe1a | 64 | enum pipostate {RUST, KALIBRATIE_ARM1, KALIBRATIE_ARM2, EMG_KALIBRATIE_BICEPS, EMG_KALIBRATIE_TRICEPS, BEGIN_METEN, B, T, BB, BT, TB, TT}; //Alle states benoemen, ieder krijgt een getal beginnend met 0 |
JKleinRot | 9:454e7da8ab65 | 65 | uint8_t state = RUST; //State is rust aan het begin |
JKleinRot | 9:454e7da8ab65 | 66 | |
JKleinRot | 6:3b6fad529520 | 67 | //Gedefinieerde datatypen en naamgeving en beginwaarden |
JKleinRot | 11:e9b906b5f572 | 68 | float pwm_to_motor_arm1; //PWM output naar motor arm 1 |
JKleinRot | 11:e9b906b5f572 | 69 | float pwm_to_motor_arm2; //PWM output naar motor arm 2 |
JKleinRot | 13:54ee98850a15 | 70 | float error_arm1_kalibratie; //Error in pulsen arm 1 |
JKleinRot | 13:54ee98850a15 | 71 | float vorige_error_arm1 = 0; //Derivative actie van regelaar arm 1 |
JKleinRot | 13:54ee98850a15 | 72 | float integraal_arm1 = 0; //Integraal actie van regelaar arm 1 |
JKleinRot | 13:54ee98850a15 | 73 | float afgeleide_arm1; //Afgeleide actie van regelaar arm 1 |
JKleinRot | 13:54ee98850a15 | 74 | float error_arm2_kalibratie; //Error in pulsen arm 2 |
JKleinRot | 13:54ee98850a15 | 75 | float vorige_error_arm2 = 0; //Derivative actie van regelaar arm 2 |
JKleinRot | 13:54ee98850a15 | 76 | float integraal_arm2 = 0; //Integraal actie van regelaar arm 2 |
JKleinRot | 13:54ee98850a15 | 77 | float afgeleide_arm2; //Afgeleide actie van regelaar arm 2 |
JKleinRot | 13:54ee98850a15 | 78 | float xb; //Gemeten EMG waarde biceps |
JKleinRot | 16:c34c5d9dfe1a | 79 | float xt; //Gemeten EMG waarde triceps |
JKleinRot | 15:3ebd0e666a9c | 80 | |
JKleinRot | 16:c34c5d9dfe1a | 81 | arm_biquad_casd_df1_inst_f32 highpass_biceps; //Highpass_biceps IIR filter in direct form 1 |
JKleinRot | 16:c34c5d9dfe1a | 82 | float highpass_biceps_const[] = {B1, B2, B3, -A2, -A3}; //Filtercoëfficiënten van het filter |
JKleinRot | 16:c34c5d9dfe1a | 83 | float highpass_biceps_states[4]; //Aantal states van het filter, het aantal y(n-x) en x(n-x) |
JKleinRot | 13:54ee98850a15 | 84 | |
JKleinRot | 16:c34c5d9dfe1a | 85 | arm_biquad_casd_df1_inst_f32 notch_biceps; //Notch_biceps IIR filter in direct form 1 |
JKleinRot | 16:c34c5d9dfe1a | 86 | float notch_biceps_const[] = {D1, D2, D3, -C2, -C3}; //Filtercoëfficiënten van het filter |
JKleinRot | 16:c34c5d9dfe1a | 87 | float notch_biceps_states[4]; //Aantal states van het filter |
JKleinRot | 15:3ebd0e666a9c | 88 | |
JKleinRot | 16:c34c5d9dfe1a | 89 | arm_biquad_casd_df1_inst_f32 lowpass_biceps; //Lowpass_biceps IIR filter in direct form 1 |
JKleinRot | 16:c34c5d9dfe1a | 90 | float lowpass_biceps_const[] = {F1, F2, F3, -E2, -E3}; //Filtercoëfficiënten van het filter |
JKleinRot | 16:c34c5d9dfe1a | 91 | float lowpass_biceps_states[4]; //Aantal states van het filter |
JKleinRot | 15:3ebd0e666a9c | 92 | |
JKleinRot | 16:c34c5d9dfe1a | 93 | float xbf; //Gefilterde EMG waarde biceps |
JKleinRot | 16:c34c5d9dfe1a | 94 | float xbfmax = 0; //Maximale gefilterde EMG waarde biceps |
JKleinRot | 13:54ee98850a15 | 95 | |
JKleinRot | 16:c34c5d9dfe1a | 96 | arm_biquad_casd_df1_inst_f32 highpass_triceps; //Highpass_triceps IIR filter in direct form 1, waarde wordt opgeslagen in een float |
JKleinRot | 16:c34c5d9dfe1a | 97 | float highpass_triceps_const[] = {B1, B2, B3, -A2, -A3}; //Filtercoëfficiënten van het filter |
JKleinRot | 16:c34c5d9dfe1a | 98 | float highpass_triceps_states[4]; //Aantal states van het filter |
JKleinRot | 13:54ee98850a15 | 99 | |
JKleinRot | 16:c34c5d9dfe1a | 100 | arm_biquad_casd_df1_inst_f32 notch_triceps; //Notch_triceps IIR filter in direct form 1, waarde wordt opgeslagen in een float |
JKleinRot | 16:c34c5d9dfe1a | 101 | float notch_triceps_const[] = {D1, D2, D3, -C2, -C3}; //Filtercoëfficiënten van het filter |
JKleinRot | 16:c34c5d9dfe1a | 102 | float notch_triceps_states[4]; //Aantal states van het filter |
JKleinRot | 13:54ee98850a15 | 103 | |
JKleinRot | 16:c34c5d9dfe1a | 104 | arm_biquad_casd_df1_inst_f32 lowpass_triceps; //Lowpass_biceps IIR filter in direct form 1, waarde wordt opgeslagen in een float |
JKleinRot | 16:c34c5d9dfe1a | 105 | float lowpass_triceps_const[] = {F1, F2, F3, -E2, -E3}; //Filtercoëfficiënten van het filter |
JKleinRot | 16:c34c5d9dfe1a | 106 | float lowpass_triceps_states[4]; //Aantal states van het filter |
JKleinRot | 13:54ee98850a15 | 107 | |
JKleinRot | 16:c34c5d9dfe1a | 108 | float xtf; //Gefilterde EMG waarde triceps |
JKleinRot | 16:c34c5d9dfe1a | 109 | float xtfmax = 0; //Maximale gefilterde EMG waarde triceps |
JKleinRot | 15:3ebd0e666a9c | 110 | |
JKleinRot | 16:c34c5d9dfe1a | 111 | float xbt; //Thresholdwaarde EMG biceps |
JKleinRot | 16:c34c5d9dfe1a | 112 | float xtt; //Thresholdwaarde EMG triceps |
JKleinRot | 7:dd3cba61b34b | 113 | |
JKleinRot | 6:3b6fad529520 | 114 | volatile bool regelaar_ticker_flag; //Definiëren flag als bool die verandert kan worden in programma |
JKleinRot | 10:52b22bff409a | 115 | void setregelaar_ticker_flag() //Setregelaar_ticker_flag zet de regelaar_ticker_flag op true |
JKleinRot | 10:52b22bff409a | 116 | { |
JKleinRot | 10:52b22bff409a | 117 | regelaar_ticker_flag = true; |
JKleinRot | 1:e5e1eb9d0025 | 118 | } |
JKleinRot | 1:e5e1eb9d0025 | 119 | |
JKleinRot | 6:3b6fad529520 | 120 | volatile bool regelaar_EMG_flag; //Definiëren flag als bool die verandert kan worden in programma |
JKleinRot | 10:52b22bff409a | 121 | void setregelaar_EMG_flag() //Setregelaar_EMG_flag zet de regelaar_EMG_flag op true |
JKleinRot | 10:52b22bff409a | 122 | { |
JKleinRot | 10:52b22bff409a | 123 | regelaar_EMG_flag = true; |
JKleinRot | 4:69540b9c0646 | 124 | } |
JKleinRot | 4:69540b9c0646 | 125 | |
JKleinRot | 10:52b22bff409a | 126 | void keep_in_range(float * in, float min, float max) //Zorgt ervoor dat een getal niet buiten een bepaald minimum en maximum komt |
JKleinRot | 10:52b22bff409a | 127 | { |
JKleinRot | 16:c34c5d9dfe1a | 128 | if (*in < min) //Als de waarde kleiner is als het minimum wordt de waarde het minimum |
JKleinRot | 16:c34c5d9dfe1a | 129 | { |
JKleinRot | 2:0cb899f2800a | 130 | *in = min; |
JKleinRot | 2:0cb899f2800a | 131 | } |
JKleinRot | 16:c34c5d9dfe1a | 132 | if (*in > max) //Als de waarde groter is dan het maximum is de waarde het maximum |
JKleinRot | 16:c34c5d9dfe1a | 133 | { |
JKleinRot | 2:0cb899f2800a | 134 | *in = max; |
JKleinRot | 16:c34c5d9dfe1a | 135 | } |
JKleinRot | 16:c34c5d9dfe1a | 136 | else //In alle andere gevallen is de waarde de waarde zelf |
JKleinRot | 16:c34c5d9dfe1a | 137 | { |
JKleinRot | 2:0cb899f2800a | 138 | *in = *in; |
JKleinRot | 2:0cb899f2800a | 139 | } |
JKleinRot | 2:0cb899f2800a | 140 | } |
JKleinRot | 1:e5e1eb9d0025 | 141 | |
JKleinRot | 16:c34c5d9dfe1a | 142 | void arm1_naar_thuispositie() //Brengt arm 1 naar de beginpositie |
JKleinRot | 10:52b22bff409a | 143 | { |
JKleinRot | 16:c34c5d9dfe1a | 144 | error_arm1_kalibratie = (PULS_ARM1_HOME_KALIBRATIE - puls_motor_arm1.getPosition()); //PWM naar motor is het verschil tussen het voorgestelde aantal pulsen en de huidige positie maal een factor |
JKleinRot | 16:c34c5d9dfe1a | 145 | integraal_arm1 = integraal_arm1 + error_arm1_kalibratie*SAMPLETIME_REGELAAR; //Integraal deel van regelaar |
JKleinRot | 16:c34c5d9dfe1a | 146 | afgeleide_arm1 = (error_arm1_kalibratie - vorige_error_arm1)/SAMPLETIME_REGELAAR; //Afgeleide deel van regelaar |
JKleinRot | 16:c34c5d9dfe1a | 147 | pwm_to_motor_arm1 = error_arm1_kalibratie*KP_arm1 + integraal_arm1*KI_arm1 + afgeleide_arm1*KD_arm1;//Output naar motor na PID regelaar |
JKleinRot | 16:c34c5d9dfe1a | 148 | keep_in_range(&pwm_to_motor_arm1, -1, 1); //PWM moet tussen 1 en -1 blijven (niet meer dan 100% dutycycle) |
JKleinRot | 10:52b22bff409a | 149 | |
JKleinRot | 16:c34c5d9dfe1a | 150 | if (pwm_to_motor_arm1 > 0) //Als PWM is positief, dan richting 1 |
JKleinRot | 16:c34c5d9dfe1a | 151 | { |
JKleinRot | 10:52b22bff409a | 152 | dir_motor_arm1.write(1); |
JKleinRot | 16:c34c5d9dfe1a | 153 | } |
JKleinRot | 16:c34c5d9dfe1a | 154 | else //Anders richting nul |
JKleinRot | 16:c34c5d9dfe1a | 155 | { |
JKleinRot | 7:dd3cba61b34b | 156 | dir_motor_arm1.write(0); |
JKleinRot | 7:dd3cba61b34b | 157 | } |
JKleinRot | 11:e9b906b5f572 | 158 | pwm_motor_arm1.write(fabs(pwm_to_motor_arm1)); //Output PWM naar motor is de absolute waarde van de berekende PWM |
JKleinRot | 16:c34c5d9dfe1a | 159 | pc.printf("pulsmotorgetposition %d ", puls_motor_arm1.getPosition()); //Huidig aantal getelde pulsen van de encoder naar pc sturen |
JKleinRot | 16:c34c5d9dfe1a | 160 | pc.printf("pwmmotor %f\n\r", pwm_to_motor_arm1); //Huidige PWM waarde naar motor naar pc sturen |
JKleinRot | 10:52b22bff409a | 161 | |
JKleinRot | 16:c34c5d9dfe1a | 162 | if (pwm_to_motor_arm1 == 0) //Als het verschil tussen de voorgestelde en huidige positie nul is wordt de while loop gestopt (condities kloppen niet meer) |
JKleinRot | 16:c34c5d9dfe1a | 163 | { |
JKleinRot | 11:e9b906b5f572 | 164 | state = KALIBRATIE_ARM2; //State wordt kalibratie arm 2, zo daar naar volgende onderdeel |
JKleinRot | 16:c34c5d9dfe1a | 165 | pc.printf("KALIBRATIE_ARM1 afgerond\n"); //Tekst voor controle Arm 1 naar thuispositie |
JKleinRot | 10:52b22bff409a | 166 | } |
JKleinRot | 10:52b22bff409a | 167 | } |
JKleinRot | 7:dd3cba61b34b | 168 | |
JKleinRot | 16:c34c5d9dfe1a | 169 | void arm2_naar_thuispositie() //Brengt arm 2 naar beginpositie |
JKleinRot | 10:52b22bff409a | 170 | { |
JKleinRot | 16:c34c5d9dfe1a | 171 | error_arm2_kalibratie = (PULS_ARM2_HOME_KALIBRATIE - puls_motor_arm2.getPosition()); //PWM naar motor is het verschil tussen het voorgestelde aantal pulsen en de huidige positie maal een factor |
JKleinRot | 16:c34c5d9dfe1a | 172 | integraal_arm2 = integraal_arm2 + error_arm2_kalibratie*SAMPLETIME_REGELAAR; //Integraal deel van regelaar |
JKleinRot | 16:c34c5d9dfe1a | 173 | afgeleide_arm2 = (error_arm2_kalibratie - vorige_error_arm2)/SAMPLETIME_REGELAAR; //Afgeleide deel van regelaar |
JKleinRot | 16:c34c5d9dfe1a | 174 | pwm_to_motor_arm2 = error_arm2_kalibratie*KP_arm2 + integraal_arm2*KI_arm2 + afgeleide_arm2*KD_arm2;//Output naar motor na PID regelaar |
JKleinRot | 16:c34c5d9dfe1a | 175 | keep_in_range(&pwm_to_motor_arm2, -1, 1); //PWM moet tussen 1 en -1 blijven (niet meer dan 100% dutycycle) |
JKleinRot | 10:52b22bff409a | 176 | |
JKleinRot | 16:c34c5d9dfe1a | 177 | if (pwm_to_motor_arm2 > 0) //Als PWM is positief, dan richting 1 |
JKleinRot | 16:c34c5d9dfe1a | 178 | { |
JKleinRot | 7:dd3cba61b34b | 179 | dir_motor_arm2.write(1); |
JKleinRot | 16:c34c5d9dfe1a | 180 | } |
JKleinRot | 16:c34c5d9dfe1a | 181 | else //Anders richting nul |
JKleinRot | 16:c34c5d9dfe1a | 182 | { |
JKleinRot | 7:dd3cba61b34b | 183 | dir_motor_arm2.write(0); |
JKleinRot | 7:dd3cba61b34b | 184 | } |
JKleinRot | 11:e9b906b5f572 | 185 | pwm_motor_arm2.write(fabs(pwm_to_motor_arm2)); //Output PWM naar motor is de absolute waarde van de berekende PWM |
JKleinRot | 16:c34c5d9dfe1a | 186 | pc.printf("pulsmotorgetposition %d ", puls_motor_arm2.getPosition()); //Huidig aantal getelde pulsen van de encoder naar pc sturen |
JKleinRot | 16:c34c5d9dfe1a | 187 | pc.printf("pwmmotor %f\n\r", pwm_to_motor_arm2); //Huidige PWM waarde naar pc sturen |
JKleinRot | 10:52b22bff409a | 188 | |
JKleinRot | 16:c34c5d9dfe1a | 189 | if (pwm_to_motor_arm2 == 0) //Als het verschil tussen de voorgestelde en huidige positie nul is wordt de while loop gestopt (condities kloppen niet meer) |
JKleinRot | 16:c34c5d9dfe1a | 190 | { |
JKleinRot | 16:c34c5d9dfe1a | 191 | state = EMG_KALIBRATIE_BICEPS; //State wordt kalibratie arm 2, zo daar naar volgende onderdeel |
JKleinRot | 16:c34c5d9dfe1a | 192 | pc.printf("KALIBRATIE_ARM2 afgerond\n\r"); //Tekst voor controle Arm 2 naar thuispositie |
JKleinRot | 7:dd3cba61b34b | 193 | } |
JKleinRot | 7:dd3cba61b34b | 194 | } |
JKleinRot | 0:859c89785d3f | 195 | |
JKleinRot | 16:c34c5d9dfe1a | 196 | void filter_biceps() //Filtert het EMG signaal van de biceps |
JKleinRot | 13:54ee98850a15 | 197 | { |
JKleinRot | 16:c34c5d9dfe1a | 198 | arm_biquad_cascade_df1_f32(&highpass_biceps, &xb, &xbf, 1); //Highpass filter voor het EMG signaal van de biceps, filtert de xb en schrijft het over in de xbf, 1 EMG waarde filteren per keer |
JKleinRot | 15:3ebd0e666a9c | 199 | |
JKleinRot | 16:c34c5d9dfe1a | 200 | arm_biquad_cascade_df1_f32(¬ch_biceps, &xbf, &xbf, 1); //Notch filter voor het EMG signaal van de biceps, filtert de xbf uit de highpass en schrijft het opnieuw in de xbf, 1 EMG waarde filteren per keer |
JKleinRot | 16:c34c5d9dfe1a | 201 | |
JKleinRot | 16:c34c5d9dfe1a | 202 | xbf = fabs(xbf); //Rectifier, schrijft de absolute waarde van de xbf uit de notch opnieuw in de xbf, fabs omdat het een float is |
JKleinRot | 15:3ebd0e666a9c | 203 | |
JKleinRot | 16:c34c5d9dfe1a | 204 | arm_biquad_cascade_df1_f32(&lowpass_biceps, &xbf, &xbf, 1); //Lowpass filter voor het EMG signaal van de biceps, filtert de xbf uit de rectifier en schrijft het opnieuw in de xbf, 1 EMG waarde filteren per keer |
JKleinRot | 16:c34c5d9dfe1a | 205 | |
JKleinRot | 16:c34c5d9dfe1a | 206 | pc.printf("xbf is %f\n\r", xbf); //De gefilterde EMG waarde van de biceps naar pc sturen |
JKleinRot | 16:c34c5d9dfe1a | 207 | } |
JKleinRot | 15:3ebd0e666a9c | 208 | |
JKleinRot | 16:c34c5d9dfe1a | 209 | void filter_triceps() //Filtert het EMG signaal van de triceps |
JKleinRot | 16:c34c5d9dfe1a | 210 | { |
JKleinRot | 16:c34c5d9dfe1a | 211 | arm_biquad_cascade_df1_f32(&highpass_triceps, &xt, &xtf, 1); //Highpass filter voor het EMG signaal van de triceps, filtert de xt en schrijft het over in de xtf, 1 EMG waarde filteren per keer |
JKleinRot | 16:c34c5d9dfe1a | 212 | |
JKleinRot | 16:c34c5d9dfe1a | 213 | arm_biquad_cascade_df1_f32(¬ch_triceps, &xtf, &xtf, 1); //Notch filter voor het EMG signaal van de triceps, filtert de xtf uit de highpass en schrijft het opnieuw in de xtf, 1 EMG waarde filteren per keer |
JKleinRot | 15:3ebd0e666a9c | 214 | |
JKleinRot | 16:c34c5d9dfe1a | 215 | xtf = fabs(xtf); //Rectifier, schrijft de absolute waarde van de xtf uit de notch opnieuw in de xtf, fabs omdat het een float is |
JKleinRot | 16:c34c5d9dfe1a | 216 | |
JKleinRot | 16:c34c5d9dfe1a | 217 | arm_biquad_cascade_df1_f32(&lowpass_triceps, &xtf, &xtf, 1); //Lowpass filter voor het EMG signaal van de triceps, filtert de xtf uit de rectifier en schrijft het opnieuw in de xtf, 1 EMG waarde filteren per keer |
JKleinRot | 16:c34c5d9dfe1a | 218 | |
JKleinRot | 16:c34c5d9dfe1a | 219 | pc.printf("xtf is %f\n\r", xtf); //De gefilterde EMG waarde van de triceps naar pc sturen |
JKleinRot | 15:3ebd0e666a9c | 220 | |
JKleinRot | 13:54ee98850a15 | 221 | } |
JKleinRot | 13:54ee98850a15 | 222 | |
JKleinRot | 16:c34c5d9dfe1a | 223 | int main() //Main script |
JKleinRot | 15:3ebd0e666a9c | 224 | { |
JKleinRot | 16:c34c5d9dfe1a | 225 | while(1) //Oneindige while loop, anders wordt er na het uitvoeren van de eerste case niets meer gedaan |
JKleinRot | 16:c34c5d9dfe1a | 226 | { |
JKleinRot | 10:52b22bff409a | 227 | pc.baud(38400); //PC baud rate is 38400 bits/seconde |
JKleinRot | 10:52b22bff409a | 228 | |
JKleinRot | 16:c34c5d9dfe1a | 229 | switch(state) //Switch benoemen, zorgt ervoor dat in de goede volgorde de dingen worden doorlopen, aan einde een case wordt de state de naam van de nieuwe case |
JKleinRot | 16:c34c5d9dfe1a | 230 | { |
JKleinRot | 10:52b22bff409a | 231 | |
JKleinRot | 16:c34c5d9dfe1a | 232 | case RUST: //Aanzetten |
JKleinRot | 16:c34c5d9dfe1a | 233 | { |
JKleinRot | 16:c34c5d9dfe1a | 234 | pc.printf("RUST\n\r"); //Begin RUST naar pc sturen |
JKleinRot | 16:c34c5d9dfe1a | 235 | lcd.locate(0,0); //Zet de tekst op de eerste regel |
JKleinRot | 16:c34c5d9dfe1a | 236 | lcd.printf(" BMT K9 GR. 4 "); //Tekst op LCD scherm |
JKleinRot | 16:c34c5d9dfe1a | 237 | lcd.locate(0,1); //Zet de tekst op de tweede regel |
JKleinRot | 16:c34c5d9dfe1a | 238 | lcd.printf("HOI! IK BEN PIPO"); //Tekst op LCD scherm |
JKleinRot | 16:c34c5d9dfe1a | 239 | wait(2); //Twee seconden wachten |
JKleinRot | 16:c34c5d9dfe1a | 240 | lcd.cls(); //Maak LCD scherm leeg |
JKleinRot | 14:e1816efa712d | 241 | pc.printf("RUST afgerond\n\r"); //Tekst voor controle Aanzetten |
JKleinRot | 16:c34c5d9dfe1a | 242 | state = KALIBRATIE_ARM1; //State wordt kalibratie arm 1, zo door naar volgende onderdeel |
JKleinRot | 16:c34c5d9dfe1a | 243 | break; //Stopt acties in deze case |
JKleinRot | 10:52b22bff409a | 244 | } |
JKleinRot | 10:52b22bff409a | 245 | |
JKleinRot | 16:c34c5d9dfe1a | 246 | case KALIBRATIE_ARM1: //Arm 1 naar thuispositie |
JKleinRot | 16:c34c5d9dfe1a | 247 | { |
JKleinRot | 16:c34c5d9dfe1a | 248 | pc.printf("KALIBRATIE_ARM1\n\r"); //Begin KALIBRATIE_ARM1 naar pc sturen |
JKleinRot | 16:c34c5d9dfe1a | 249 | wait(1); //Een seconde wachten |
JKleinRot | 15:3ebd0e666a9c | 250 | |
JKleinRot | 10:52b22bff409a | 251 | ticker_regelaar.attach(setregelaar_ticker_flag,SAMPLETIME_REGELAAR); //Ticker iedere zoveel seconde de flag op laten steken |
JKleinRot | 10:52b22bff409a | 252 | |
JKleinRot | 16:c34c5d9dfe1a | 253 | while(state == KALIBRATIE_ARM1) |
JKleinRot | 16:c34c5d9dfe1a | 254 | { |
JKleinRot | 16:c34c5d9dfe1a | 255 | while(regelaar_ticker_flag != true); //Als geen flag opgestoken, dan niks doen, wel flag, dan uit de while loop en door naar volgende regel |
JKleinRot | 10:52b22bff409a | 256 | regelaar_ticker_flag = false; //Flag weer naar beneden, zodat deze straks weer omhoog kan |
JKleinRot | 10:52b22bff409a | 257 | |
JKleinRot | 10:52b22bff409a | 258 | arm1_naar_thuispositie(); //Voer acties uit om arm 1 naar thuispositie te krijgen |
JKleinRot | 10:52b22bff409a | 259 | } |
JKleinRot | 10:52b22bff409a | 260 | wait(1); //Een seconde wachten |
JKleinRot | 11:e9b906b5f572 | 261 | break; //Stopt acties in deze case |
JKleinRot | 10:52b22bff409a | 262 | } |
JKleinRot | 10:52b22bff409a | 263 | |
JKleinRot | 16:c34c5d9dfe1a | 264 | case KALIBRATIE_ARM2: //Arm 2 naar thuispositie |
JKleinRot | 16:c34c5d9dfe1a | 265 | { |
JKleinRot | 16:c34c5d9dfe1a | 266 | pc.printf("KALIBRATIE_ARM1\n\r"); //Begin KALIBRATIE_ARM2 naar pc sturen |
JKleinRot | 16:c34c5d9dfe1a | 267 | wait(1); //Een seconde wachten |
JKleinRot | 10:52b22bff409a | 268 | |
JKleinRot | 10:52b22bff409a | 269 | //ticker_regelaar.attach(setregelaar_ticker_flag,SAMPLETIME_REGELAAR); //Ticker iedere zoveel seconde de flag op laten steken |
JKleinRot | 10:52b22bff409a | 270 | |
JKleinRot | 16:c34c5d9dfe1a | 271 | while(state == KALIBRATIE_ARM2) |
JKleinRot | 16:c34c5d9dfe1a | 272 | { |
JKleinRot | 16:c34c5d9dfe1a | 273 | while(regelaar_ticker_flag != true); //Als geen flag opgestoken, dan niks doen, wel flag, dan uit de while loop en door naar volgende regel |
JKleinRot | 10:52b22bff409a | 274 | regelaar_ticker_flag = false; //Flag weer naar beneden, zodat deze straks weer omhoog kan |
JKleinRot | 10:52b22bff409a | 275 | |
JKleinRot | 10:52b22bff409a | 276 | arm2_naar_thuispositie(); //Voer acties uit om arm 2 naar thuispositie te krijgen |
JKleinRot | 10:52b22bff409a | 277 | } |
JKleinRot | 11:e9b906b5f572 | 278 | wait(1); //Een seconde wachten |
JKleinRot | 11:e9b906b5f572 | 279 | ticker_regelaar.detach(); //Ticker detachten, ticker doet nu niks meer |
JKleinRot | 16:c34c5d9dfe1a | 280 | break; //Stopt acties in deze case |
JKleinRot | 10:52b22bff409a | 281 | } |
JKleinRot | 15:3ebd0e666a9c | 282 | |
JKleinRot | 16:c34c5d9dfe1a | 283 | case EMG_KALIBRATIE_BICEPS: //Kalibratie biceps voor bepalen threshold |
JKleinRot | 16:c34c5d9dfe1a | 284 | { |
JKleinRot | 16:c34c5d9dfe1a | 285 | pc.printf("EMG__KALIBRATIE_BICEPS\n\r"); //Begin EMG_KALIBRATIE_BICEPS naar pc sturen |
JKleinRot | 16:c34c5d9dfe1a | 286 | |
JKleinRot | 16:c34c5d9dfe1a | 287 | lcd.locate(0,0); //Zet tekst op eerste regel |
JKleinRot | 16:c34c5d9dfe1a | 288 | lcd.printf(" SPAN IN 5 SEC. "); //Tekst op LCD scherm |
JKleinRot | 16:c34c5d9dfe1a | 289 | lcd.locate(0,1); //Zet tekst op tweede regel |
JKleinRot | 16:c34c5d9dfe1a | 290 | lcd.printf(" 2 X BICEPS AAN "); //Tekst op LCD scherm |
JKleinRot | 15:3ebd0e666a9c | 291 | |
JKleinRot | 16:c34c5d9dfe1a | 292 | arm_biquad_cascade_df1_init_f32(&highpass_biceps, 1, highpass_biceps_const, highpass_biceps_states); //Highpassfilter biceps met bijbehorende filtercoëfficiënten en states definiëren |
JKleinRot | 16:c34c5d9dfe1a | 293 | arm_biquad_cascade_df1_init_f32(¬ch_biceps, 1, notch_biceps_const, notch_biceps_states); //Notchfilter biceps met bijbehorende filtercoëfficiënten en states definiëren |
JKleinRot | 16:c34c5d9dfe1a | 294 | arm_biquad_cascade_df1_init_f32(&lowpass_biceps, 1, lowpass_biceps_const, lowpass_biceps_states); //Lowpassfilter biceps met bijbehorende filtercoëfficiënten en states definiëren |
JKleinRot | 15:3ebd0e666a9c | 295 | |
JKleinRot | 16:c34c5d9dfe1a | 296 | ticker_EMG.attach(setregelaar_EMG_flag,SAMPLETIME_EMG); //Ticker iedere zoveel seconde de flag op laten steken |
JKleinRot | 16:c34c5d9dfe1a | 297 | biceps_kalibratie.start(); //Timer aanzetten die de tijd meet vanaf dit punt |
JKleinRot | 15:3ebd0e666a9c | 298 | |
JKleinRot | 16:c34c5d9dfe1a | 299 | while(biceps_kalibratie.read() <= 5) //Zolang de timer nog geen 5 seconden heeft gemeten |
JKleinRot | 16:c34c5d9dfe1a | 300 | { |
JKleinRot | 13:54ee98850a15 | 301 | |
JKleinRot | 15:3ebd0e666a9c | 302 | while(regelaar_EMG_flag != true) ; //Als geen flag opgestoken, dan niks doen, wel flag, dan uit de while loop en door naar volgende regel |
JKleinRot | 15:3ebd0e666a9c | 303 | regelaar_EMG_flag = false; //Flag weer naar beneden, zodat deze straks weer omhoog kan |
JKleinRot | 15:3ebd0e666a9c | 304 | |
JKleinRot | 15:3ebd0e666a9c | 305 | xb = EMG_bi.read(); //EMG meten van biceps |
JKleinRot | 15:3ebd0e666a9c | 306 | |
JKleinRot | 15:3ebd0e666a9c | 307 | filter_biceps(); |
JKleinRot | 15:3ebd0e666a9c | 308 | |
JKleinRot | 15:3ebd0e666a9c | 309 | if(int(biceps_kalibratie.read()) == 1) { |
JKleinRot | 16:c34c5d9dfe1a | 310 | lcd.locate(0,0); |
JKleinRot | 16:c34c5d9dfe1a | 311 | lcd.printf(" 4 "); |
JKleinRot | 15:3ebd0e666a9c | 312 | pc.printf("4"); |
JKleinRot | 14:e1816efa712d | 313 | } |
JKleinRot | 16:c34c5d9dfe1a | 314 | if(int(biceps_kalibratie.read()) == 2) { |
JKleinRot | 16:c34c5d9dfe1a | 315 | lcd.locate(0,0); |
JKleinRot | 16:c34c5d9dfe1a | 316 | lcd.printf(" 3 "); |
JKleinRot | 15:3ebd0e666a9c | 317 | pc.printf("3"); |
JKleinRot | 14:e1816efa712d | 318 | } |
JKleinRot | 16:c34c5d9dfe1a | 319 | if(int(biceps_kalibratie.read()) == 3) { |
JKleinRot | 16:c34c5d9dfe1a | 320 | lcd.locate(0,0); |
JKleinRot | 16:c34c5d9dfe1a | 321 | lcd.printf(" 2 "); |
JKleinRot | 15:3ebd0e666a9c | 322 | pc.printf("2"); |
JKleinRot | 14:e1816efa712d | 323 | } |
JKleinRot | 16:c34c5d9dfe1a | 324 | if(int(biceps_kalibratie.read()) == 4) { |
JKleinRot | 16:c34c5d9dfe1a | 325 | lcd.locate(0,0); |
JKleinRot | 16:c34c5d9dfe1a | 326 | lcd.printf(" 1 "); |
JKleinRot | 15:3ebd0e666a9c | 327 | pc.printf("1"); |
JKleinRot | 15:3ebd0e666a9c | 328 | } |
JKleinRot | 15:3ebd0e666a9c | 329 | |
JKleinRot | 15:3ebd0e666a9c | 330 | } |
JKleinRot | 15:3ebd0e666a9c | 331 | if(xbf >= xbfmax) { |
JKleinRot | 15:3ebd0e666a9c | 332 | xbfmax = xbf; |
JKleinRot | 15:3ebd0e666a9c | 333 | } |
JKleinRot | 15:3ebd0e666a9c | 334 | xbt = xbfmax * 0.8; |
JKleinRot | 15:3ebd0e666a9c | 335 | pc.printf("threshold is %f\n\r", xbt); |
JKleinRot | 15:3ebd0e666a9c | 336 | state = EMG_KALIBRATIE_TRICEPS; |
JKleinRot | 15:3ebd0e666a9c | 337 | break; |
JKleinRot | 15:3ebd0e666a9c | 338 | } |
JKleinRot | 15:3ebd0e666a9c | 339 | |
JKleinRot | 15:3ebd0e666a9c | 340 | case EMG_KALIBRATIE_TRICEPS: { |
JKleinRot | 15:3ebd0e666a9c | 341 | pc.printf("EMG__KALIBRATIE_TRICEPS\n\r"); |
JKleinRot | 15:3ebd0e666a9c | 342 | |
JKleinRot | 16:c34c5d9dfe1a | 343 | lcd.locate(0,0); |
JKleinRot | 16:c34c5d9dfe1a | 344 | lcd.printf(" SPAN IN 5 SEC. "); |
JKleinRot | 16:c34c5d9dfe1a | 345 | lcd.locate(0,1); |
JKleinRot | 16:c34c5d9dfe1a | 346 | lcd.printf(" 2 X TRICEPS AAN"); |
JKleinRot | 15:3ebd0e666a9c | 347 | |
JKleinRot | 15:3ebd0e666a9c | 348 | arm_biquad_cascade_df1_init_f32(&highpass_triceps, 1, highpass_triceps_const, highpass_triceps_states); |
JKleinRot | 15:3ebd0e666a9c | 349 | arm_biquad_cascade_df1_init_f32(¬ch_triceps, 1, notch_triceps_const, notch_triceps_states); |
JKleinRot | 15:3ebd0e666a9c | 350 | arm_biquad_cascade_df1_init_f32(&lowpass_triceps, 1, lowpass_triceps_const, lowpass_triceps_states); |
JKleinRot | 15:3ebd0e666a9c | 351 | |
JKleinRot | 15:3ebd0e666a9c | 352 | ticker_EMG.attach(setregelaar_EMG_flag,SAMPLETIME_EMG); |
JKleinRot | 15:3ebd0e666a9c | 353 | triceps_kalibratie.start(); |
JKleinRot | 15:3ebd0e666a9c | 354 | |
JKleinRot | 15:3ebd0e666a9c | 355 | while(triceps_kalibratie.read() <= 5) { |
JKleinRot | 15:3ebd0e666a9c | 356 | |
JKleinRot | 15:3ebd0e666a9c | 357 | while(regelaar_EMG_flag != true) ; //Als geen flag opgestoken, dan niks doen, wel flag, dan uit de while loop en door naar volgende regel |
JKleinRot | 15:3ebd0e666a9c | 358 | regelaar_EMG_flag = false; //Flag weer naar beneden, zodat deze straks weer omhoog kan |
JKleinRot | 15:3ebd0e666a9c | 359 | |
JKleinRot | 15:3ebd0e666a9c | 360 | xt = EMG_tri.read(); //EMG meten van biceps |
JKleinRot | 15:3ebd0e666a9c | 361 | |
JKleinRot | 15:3ebd0e666a9c | 362 | filter_triceps(); |
JKleinRot | 15:3ebd0e666a9c | 363 | |
JKleinRot | 15:3ebd0e666a9c | 364 | if(triceps_kalibratie.read() == 1) { |
JKleinRot | 16:c34c5d9dfe1a | 365 | lcd.locate(0,0); |
JKleinRot | 16:c34c5d9dfe1a | 366 | lcd.printf(" 4 "); |
JKleinRot | 15:3ebd0e666a9c | 367 | pc.printf("4"); |
JKleinRot | 15:3ebd0e666a9c | 368 | } |
JKleinRot | 15:3ebd0e666a9c | 369 | if(triceps_kalibratie.read() == 2) { |
JKleinRot | 16:c34c5d9dfe1a | 370 | lcd.locate(0,0); |
JKleinRot | 16:c34c5d9dfe1a | 371 | lcd.printf(" 3 "); |
JKleinRot | 15:3ebd0e666a9c | 372 | pc.printf("3"); |
JKleinRot | 15:3ebd0e666a9c | 373 | } |
JKleinRot | 15:3ebd0e666a9c | 374 | if(triceps_kalibratie.read() == 3) { |
JKleinRot | 16:c34c5d9dfe1a | 375 | lcd.locate(0,0); |
JKleinRot | 16:c34c5d9dfe1a | 376 | lcd.printf(" 2 "); |
JKleinRot | 15:3ebd0e666a9c | 377 | pc.printf("2"); |
JKleinRot | 15:3ebd0e666a9c | 378 | } |
JKleinRot | 15:3ebd0e666a9c | 379 | if(triceps_kalibratie.read() == 4) { |
JKleinRot | 16:c34c5d9dfe1a | 380 | lcd.locate(0,0); |
JKleinRot | 16:c34c5d9dfe1a | 381 | lcd.printf(" 1 "); |
JKleinRot | 16:c34c5d9dfe1a | 382 | pc.printf("1"); |
JKleinRot | 14:e1816efa712d | 383 | } |
JKleinRot | 15:3ebd0e666a9c | 384 | |
JKleinRot | 15:3ebd0e666a9c | 385 | } |
JKleinRot | 15:3ebd0e666a9c | 386 | if(xtf >= xtfmax) { |
JKleinRot | 15:3ebd0e666a9c | 387 | xtfmax = xtf; |
JKleinRot | 10:52b22bff409a | 388 | } |
JKleinRot | 15:3ebd0e666a9c | 389 | xtt = xtfmax * 0.8; |
JKleinRot | 15:3ebd0e666a9c | 390 | pc.printf("threshold is %f\n\r", xtt); |
JKleinRot | 15:3ebd0e666a9c | 391 | state = BEGIN_METEN; |
JKleinRot | 15:3ebd0e666a9c | 392 | break; |
JKleinRot | 10:52b22bff409a | 393 | } |
JKleinRot | 15:3ebd0e666a9c | 394 | |
JKleinRot | 15:3ebd0e666a9c | 395 | case BEGIN_METEN: { |
JKleinRot | 16:c34c5d9dfe1a | 396 | lcd.locate(0,0); |
JKleinRot | 16:c34c5d9dfe1a | 397 | lcd.printf(" START "); |
JKleinRot | 16:c34c5d9dfe1a | 398 | |
JKleinRot | 16:c34c5d9dfe1a | 399 | pc.printf("START\n\r"); |
JKleinRot | 16:c34c5d9dfe1a | 400 | |
JKleinRot | 15:3ebd0e666a9c | 401 | while(state == BEGIN_METEN) { |
JKleinRot | 15:3ebd0e666a9c | 402 | while(regelaar_EMG_flag != true); //Als geen flag opgestoken, dan niks doen, wel flag, dan uit de while loop en door naar volgende regel |
JKleinRot | 15:3ebd0e666a9c | 403 | regelaar_EMG_flag = false; |
JKleinRot | 15:3ebd0e666a9c | 404 | |
JKleinRot | 15:3ebd0e666a9c | 405 | xb = EMG_bi.read(); |
JKleinRot | 15:3ebd0e666a9c | 406 | filter_biceps(); |
JKleinRot | 15:3ebd0e666a9c | 407 | xt = EMG_tri.read(); |
JKleinRot | 15:3ebd0e666a9c | 408 | filter_triceps(); |
JKleinRot | 15:3ebd0e666a9c | 409 | |
JKleinRot | 15:3ebd0e666a9c | 410 | if(xb >= xbt) { |
JKleinRot | 15:3ebd0e666a9c | 411 | state = B; |
JKleinRot | 15:3ebd0e666a9c | 412 | } |
JKleinRot | 15:3ebd0e666a9c | 413 | if(xt >= xtt) { |
JKleinRot | 15:3ebd0e666a9c | 414 | state = T; |
JKleinRot | 15:3ebd0e666a9c | 415 | } |
JKleinRot | 15:3ebd0e666a9c | 416 | } |
JKleinRot | 16:c34c5d9dfe1a | 417 | } |
JKleinRot | 16:c34c5d9dfe1a | 418 | |
JKleinRot | 16:c34c5d9dfe1a | 419 | case B: { |
JKleinRot | 16:c34c5d9dfe1a | 420 | lcd.locate(0,0); |
JKleinRot | 16:c34c5d9dfe1a | 421 | lcd.printf(" B "); |
JKleinRot | 16:c34c5d9dfe1a | 422 | pc.printf("B\n\r"); |
JKleinRot | 15:3ebd0e666a9c | 423 | |
JKleinRot | 16:c34c5d9dfe1a | 424 | while(state == B) { |
JKleinRot | 16:c34c5d9dfe1a | 425 | while(regelaar_EMG_flag != true); //Als geen flag opgestoken, dan niks doen, wel flag, dan uit de while loop en door naar volgende regel |
JKleinRot | 16:c34c5d9dfe1a | 426 | regelaar_EMG_flag = false; |
JKleinRot | 15:3ebd0e666a9c | 427 | |
JKleinRot | 16:c34c5d9dfe1a | 428 | xb = EMG_bi.read(); |
JKleinRot | 16:c34c5d9dfe1a | 429 | filter_biceps(); |
JKleinRot | 16:c34c5d9dfe1a | 430 | xt = EMG_tri.read(); |
JKleinRot | 16:c34c5d9dfe1a | 431 | filter_triceps(); |
JKleinRot | 16:c34c5d9dfe1a | 432 | |
JKleinRot | 16:c34c5d9dfe1a | 433 | if(xb >= xbt) { |
JKleinRot | 16:c34c5d9dfe1a | 434 | state = BB; |
JKleinRot | 16:c34c5d9dfe1a | 435 | } |
JKleinRot | 16:c34c5d9dfe1a | 436 | if(xt >= xtt) { |
JKleinRot | 16:c34c5d9dfe1a | 437 | state = BT; |
JKleinRot | 16:c34c5d9dfe1a | 438 | } |
JKleinRot | 16:c34c5d9dfe1a | 439 | } |
JKleinRot | 16:c34c5d9dfe1a | 440 | } |
JKleinRot | 16:c34c5d9dfe1a | 441 | |
JKleinRot | 16:c34c5d9dfe1a | 442 | case T: { |
JKleinRot | 16:c34c5d9dfe1a | 443 | lcd.locate(0,0); |
JKleinRot | 16:c34c5d9dfe1a | 444 | lcd.printf(" T "); |
JKleinRot | 16:c34c5d9dfe1a | 445 | pc.printf("T\n\r"); |
JKleinRot | 16:c34c5d9dfe1a | 446 | |
JKleinRot | 16:c34c5d9dfe1a | 447 | while(state == T) { |
JKleinRot | 16:c34c5d9dfe1a | 448 | while(regelaar_EMG_flag != true); //Als geen flag opgestoken, dan niks doen, wel flag, dan uit de while loop en door naar volgende regel |
JKleinRot | 16:c34c5d9dfe1a | 449 | regelaar_EMG_flag = false; |
JKleinRot | 16:c34c5d9dfe1a | 450 | |
JKleinRot | 16:c34c5d9dfe1a | 451 | xb = EMG_bi.read(); |
JKleinRot | 16:c34c5d9dfe1a | 452 | filter_biceps(); |
JKleinRot | 16:c34c5d9dfe1a | 453 | xt = EMG_tri.read(); |
JKleinRot | 16:c34c5d9dfe1a | 454 | filter_triceps(); |
JKleinRot | 16:c34c5d9dfe1a | 455 | |
JKleinRot | 16:c34c5d9dfe1a | 456 | if(xb >= xbt) { |
JKleinRot | 16:c34c5d9dfe1a | 457 | state = TB; |
JKleinRot | 16:c34c5d9dfe1a | 458 | } |
JKleinRot | 16:c34c5d9dfe1a | 459 | if(xt >= xtt) { |
JKleinRot | 16:c34c5d9dfe1a | 460 | state = TT; |
JKleinRot | 16:c34c5d9dfe1a | 461 | } |
JKleinRot | 16:c34c5d9dfe1a | 462 | } |
JKleinRot | 16:c34c5d9dfe1a | 463 | } |
JKleinRot | 16:c34c5d9dfe1a | 464 | |
JKleinRot | 16:c34c5d9dfe1a | 465 | case BB: |
JKleinRot | 15:3ebd0e666a9c | 466 | |
JKleinRot | 15:3ebd0e666a9c | 467 | |
JKleinRot | 16:c34c5d9dfe1a | 468 | default: |
JKleinRot | 16:c34c5d9dfe1a | 469 | { //Default state, mocht er iets misgaan en het programma kan niet naar een volgende case |
JKleinRot | 16:c34c5d9dfe1a | 470 | state = RUST; //Als dat gebeurt wordt de state rust en begint hij weer vooraan |
JKleinRot | 10:52b22bff409a | 471 | } |
JKleinRot | 16:c34c5d9dfe1a | 472 | |
JKleinRot | 15:3ebd0e666a9c | 473 | pc.printf("state: %u\n\r",state); |
JKleinRot | 9:454e7da8ab65 | 474 | } |
JKleinRot | 3:adc3052039e7 | 475 | } |
JKleinRot | 0:859c89785d3f | 476 | } |