Dependencies:   biquadFilter FastPWM HIDScope MODSERIAL mbed

Fork of StateMachine by Tommie Verouden

Committer:
tverouden
Date:
Thu Nov 01 09:02:56 2018 +0000
Revision:
12:323ac4e27a0d
Parent:
11:2d1dfebae948
Child:
13:abee61d15b5f
Latest version (added some comments)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tverouden 0:c0c35b95765f 1 // ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡ PREPARATION ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
tverouden 0:c0c35b95765f 2 // Libraries
tverouden 0:c0c35b95765f 3 #include "mbed.h"
tverouden 2:d70795e4e0bf 4 #include "BiQuad.h"
tverouden 0:c0c35b95765f 5 #include "FastPWM.h"
tverouden 0:c0c35b95765f 6 #include "HIDScope.h"
tverouden 0:c0c35b95765f 7 #include "MODSERIAL.h"
tverouden 0:c0c35b95765f 8
tverouden 8:8cef1050ebd9 9 // LEDs
tverouden 8:8cef1050ebd9 10 DigitalOut ledRed(LED_RED,1); // red LED K64F
tverouden 8:8cef1050ebd9 11 DigitalOut ledGreen(LED_GREEN,1); // green LED K64F
tverouden 8:8cef1050ebd9 12 DigitalOut ledBlue(LED_BLUE,1); // blue LED K64F
tverouden 8:8cef1050ebd9 13 // DigitalOut ledBio1(,1); // led 1 Biorobotics shield // LED pins
tverouden 8:8cef1050ebd9 14 // DigitalOut ledBio2(,1); // led 2 Biorobotics shield
tverouden 8:8cef1050ebd9 15
tverouden 11:2d1dfebae948 16 Ticker blinkTimer; // LED ticker
tverouden 8:8cef1050ebd9 17
tverouden 8:8cef1050ebd9 18 // Buttons/inputs
tverouden 4:5ce2c8864908 19 InterruptIn buttonBio1(D0); // button 1 BioRobotics shield
tverouden 4:5ce2c8864908 20 InterruptIn buttonBio2(D1); // button 2 BioRobotics shield
tverouden 0:c0c35b95765f 21 InterruptIn buttonK64F(SW3); // button on K64F
tverouden 8:8cef1050ebd9 22 InterruptIn buttonEmergency(SW2); // emergency button on K64F
tverouden 0:c0c35b95765f 23
tverouden 8:8cef1050ebd9 24 // Motor pins
tverouden 8:8cef1050ebd9 25
tverouden 8:8cef1050ebd9 26
tverouden 8:8cef1050ebd9 27 // PC communication
tverouden 4:5ce2c8864908 28 MODSERIAL pc(USBTX, USBRX); // communication with pc
tverouden 4:5ce2c8864908 29
tverouden 0:c0c35b95765f 30 // Define & initialise state machine
tverouden 11:2d1dfebae948 31 enum states { calibratingMotors, calibratingEMG,
tverouden 7:ef5966469621 32 homing, operating, reading, failing, demoing
tverouden 2:d70795e4e0bf 33 };
tverouden 11:2d1dfebae948 34 states currentState = calibratingMotors;// start in waiting mode
tverouden 11:2d1dfebae948 35 bool changeState = true; // initialise the first state
tverouden 2:d70795e4e0bf 36
tverouden 3:9c63fc5f157e 37
tverouden 3:9c63fc5f157e 38
tverouden 4:5ce2c8864908 39 // ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡ FUNCTIONS ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
tverouden 6:f32352bc5078 40 // ============================ GENERAL FUNCTIONS =============================
tverouden 6:f32352bc5078 41 void stopProgram(void)
tverouden 6:f32352bc5078 42 {
tverouden 6:f32352bc5078 43 // Error message
tverouden 6:f32352bc5078 44 pc.printf("[ERROR] emergency button pressed\r\n");
tverouden 6:f32352bc5078 45 currentState = failing; // change to state
tverouden 6:f32352bc5078 46 changeState = true; // next loop, switch states
tverouden 6:f32352bc5078 47 }
tverouden 8:8cef1050ebd9 48
tverouden 8:8cef1050ebd9 49 void blinkLED(DigitalOut led) // blinkTimer.attach(&blinkLED,0.5) aanroepen bij initialisation, bij verlaten state:
tverouden 8:8cef1050ebd9 50 { // blinkTimer.detach
tverouden 8:8cef1050ebd9 51 led =! led; // toggle LED
tverouden 10:584b7d2c2d63 52 }
tverouden 8:8cef1050ebd9 53
tverouden 6:f32352bc5078 54 // ============================ MOTOR FUNCTIONS ==============================
tverouden 4:5ce2c8864908 55
tverouden 4:5ce2c8864908 56
tverouden 4:5ce2c8864908 57 // ============================= EMG FUNCTIONS ===============================
tverouden 4:5ce2c8864908 58
tverouden 4:5ce2c8864908 59
tverouden 12:323ac4e27a0d 60 // ========================= KINEMATICS FUNCTIONS ============================
tverouden 12:323ac4e27a0d 61
tverouden 12:323ac4e27a0d 62
tverouden 2:d70795e4e0bf 63 // ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡ STATE MACHINE ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
tverouden 7:ef5966469621 64 void stateMachine(void)
tverouden 3:9c63fc5f157e 65 {
tverouden 5:04b26b2f536a 66 switch (currentState) { // determine which state Odin is in // Van een aantal if statements moeten de conditions nog bepaald worden, niet vergeten
tverouden 3:9c63fc5f157e 67
tverouden 4:5ce2c8864908 68 // ========================= MOTOR CALIBRATION MODE ==========================
tverouden 4:5ce2c8864908 69 case calibratingMotors:
tverouden 4:5ce2c8864908 70 // ------------------------- initialisation --------------------------
tverouden 4:5ce2c8864908 71 if (changeState) { // when entering the state
tverouden 4:5ce2c8864908 72 pc.printf("[MODE] calibrating motors...r\n");
tverouden 5:04b26b2f536a 73 // print current state
tverouden 4:5ce2c8864908 74 changeState = false; // stay in this state
tverouden 4:5ce2c8864908 75
tverouden 4:5ce2c8864908 76 // Actions when entering state
tverouden 4:5ce2c8864908 77 /* */
tverouden 4:5ce2c8864908 78
tverouden 4:5ce2c8864908 79 }
tverouden 4:5ce2c8864908 80 // ----------------------------- action ------------------------------
tverouden 5:04b26b2f536a 81 // Actions for each loop iteration
tverouden 5:04b26b2f536a 82 /* */
tverouden 4:5ce2c8864908 83
tverouden 4:5ce2c8864908 84 // --------------------------- transition ----------------------------
tverouden 4:5ce2c8864908 85 // Transition condition #1: after 3 sec in state && all motor // Als vóór het einde van de 3 seconden alle motoren al snelheid 0 hebben, zitten ze zo dus door te draaien terwijl dat niet kan
tverouden 4:5ce2c8864908 86 // velocities zero, start calibrating EMG-x // dat lijkt me niet de bedoeling
tverouden 7:ef5966469621 87 if (1) { // CONDITION
tverouden 5:04b26b2f536a 88 // Actions when leaving state
tverouden 4:5ce2c8864908 89 /* */
tverouden 5:04b26b2f536a 90
tverouden 10:584b7d2c2d63 91 currentState = calibratingEMG; // change to state
tverouden 4:5ce2c8864908 92 changeState = true; // next loop, switch states
tverouden 4:5ce2c8864908 93 }
tverouden 4:5ce2c8864908 94 break; // end case
tverouden 4:5ce2c8864908 95
tverouden 7:ef5966469621 96 // =========================== EMG CALIBRATION MODE ===========================
tverouden 7:ef5966469621 97 case calibratingEMG:
tverouden 4:5ce2c8864908 98 // ------------------------- initialisation --------------------------
tverouden 3:9c63fc5f157e 99 if (changeState) { // when entering the state
tverouden 4:5ce2c8864908 100 pc.printf("[MODE] calibrating EMG 1 (x-direction)...\r\n");
tverouden 5:04b26b2f536a 101 // print current state
tverouden 4:5ce2c8864908 102 changeState = false; // stay in this state
tverouden 4:5ce2c8864908 103
tverouden 4:5ce2c8864908 104 // Actions when entering state
tverouden 4:5ce2c8864908 105 /* */
tverouden 4:5ce2c8864908 106
tverouden 4:5ce2c8864908 107 }
tverouden 4:5ce2c8864908 108 // ----------------------------- action ------------------------------
tverouden 5:04b26b2f536a 109 // Actions for each loop iteration
tverouden 5:04b26b2f536a 110 /* */
tverouden 4:5ce2c8864908 111
tverouden 4:5ce2c8864908 112 // --------------------------- transition ----------------------------
tverouden 7:ef5966469621 113 // Transition condition #1: after 20 sec in state
tverouden 7:ef5966469621 114 if (1) { // CONDITION
tverouden 4:5ce2c8864908 115 // Actions when leaving state
tverouden 4:5ce2c8864908 116 /* */
tverouden 5:04b26b2f536a 117
tverouden 4:5ce2c8864908 118 currentState = homing; // change to state
tverouden 4:5ce2c8864908 119 changeState = true; // next loop, switch states
tverouden 5:04b26b2f536a 120 }
tverouden 5:04b26b2f536a 121 break; // end case
tverouden 4:5ce2c8864908 122
tverouden 4:5ce2c8864908 123 // ============================== HOMING MODE ================================
tverouden 4:5ce2c8864908 124 case homing:
tverouden 7:ef5966469621 125 // ------------------------- initialisation -------------------------- // Evt. ook checken op snelheid als mensen zo dom zijn om tijdens homing op random knopjes te drukken
tverouden 4:5ce2c8864908 126 if (changeState) { // when entering the state
tverouden 4:5ce2c8864908 127 pc.printf("[MODE] homing...\r\n");
tverouden 5:04b26b2f536a 128 // print current state
tverouden 4:5ce2c8864908 129 changeState = false; // stay in this state
tverouden 4:5ce2c8864908 130
tverouden 4:5ce2c8864908 131
tverouden 4:5ce2c8864908 132 // Actions when entering state
tverouden 4:5ce2c8864908 133 /* */
tverouden 4:5ce2c8864908 134
tverouden 4:5ce2c8864908 135 }
tverouden 4:5ce2c8864908 136 // ----------------------------- action ------------------------------
tverouden 5:04b26b2f536a 137 // Actions for each loop iteration
tverouden 5:04b26b2f536a 138 /* */
tverouden 4:5ce2c8864908 139
tverouden 7:ef5966469621 140 // --------------------------- transition ---------------------------- // Volgorde veranderen voor logica?
tverouden 4:5ce2c8864908 141 // Transition condition #1: with button press, enter demo mode
tverouden 4:5ce2c8864908 142 if (buttonBio1 == true) { // Het is niet nodig om hier ook nog "&& currentState == homing" toe te voegen, want hij bereikt dit stuk code alleen in homing mode
tverouden 4:5ce2c8864908 143 // Actions when leaving state
tverouden 4:5ce2c8864908 144 /* */
tverouden 5:04b26b2f536a 145
tverouden 4:5ce2c8864908 146 currentState = demoing; // change to state
tverouden 4:5ce2c8864908 147 changeState = true; // next loop, switch states
tverouden 4:5ce2c8864908 148 }
tverouden 4:5ce2c8864908 149 // Transition condition #2: with button press, enter operation mode
tverouden 4:5ce2c8864908 150 if (buttonBio2 == true) {
tverouden 4:5ce2c8864908 151 // Actions when leaving state
tverouden 4:5ce2c8864908 152 /* */
tverouden 5:04b26b2f536a 153
tverouden 4:5ce2c8864908 154 currentState = operating; // change to state
tverouden 4:5ce2c8864908 155 changeState = true; // next loop, switch states
tverouden 5:04b26b2f536a 156 }
tverouden 4:5ce2c8864908 157 break; // end case
tverouden 4:5ce2c8864908 158
tverouden 4:5ce2c8864908 159 // ============================= OPERATING MODE ==============================
tverouden 4:5ce2c8864908 160 case operating:
tverouden 4:5ce2c8864908 161 // ------------------------- initialisation --------------------------
tverouden 4:5ce2c8864908 162 if (changeState) { // when entering the state
tverouden 4:5ce2c8864908 163 pc.printf("[MODE] operating...\r\n");
tverouden 5:04b26b2f536a 164 // print current state
tverouden 5:04b26b2f536a 165 changeState = false; // stay in this state
tverouden 5:04b26b2f536a 166
tverouden 5:04b26b2f536a 167 // Actions when entering state
tverouden 5:04b26b2f536a 168 /* */
tverouden 5:04b26b2f536a 169
tverouden 5:04b26b2f536a 170 }
tverouden 5:04b26b2f536a 171 // ----------------------------- action ------------------------------
tverouden 5:04b26b2f536a 172 // Actions for each loop iteration
tverouden 5:04b26b2f536a 173 /* */
tverouden 5:04b26b2f536a 174
tverouden 5:04b26b2f536a 175 // --------------------------- transition ----------------------------
tverouden 7:ef5966469621 176 // Transition condition #1: with button press, back to homing mode // Is het nodig om vanuit operating mode naar homing mode terug te kunnen gaan? -> ja, voor als je een demo wilt starten
tverouden 5:04b26b2f536a 177 if (buttonBio2 == true) {
tverouden 5:04b26b2f536a 178 // Actions when leaving state
tverouden 5:04b26b2f536a 179 /* */
tverouden 5:04b26b2f536a 180
tverouden 5:04b26b2f536a 181 currentState = homing; // change to state
tverouden 5:04b26b2f536a 182 changeState = true; // next loop, switch states
tverouden 5:04b26b2f536a 183 }
tverouden 7:ef5966469621 184 // Transition condition #2: motor angle error < certain value,
tverouden 7:ef5966469621 185 // start reading
tverouden 7:ef5966469621 186 if (1) { // CONDITION
tverouden 5:04b26b2f536a 187 // Actions when leaving state
tverouden 5:04b26b2f536a 188 /* */
tverouden 5:04b26b2f536a 189
tverouden 5:04b26b2f536a 190 currentState = homing; // change to state
tverouden 5:04b26b2f536a 191 changeState = true; // next loop, switch states
tverouden 5:04b26b2f536a 192 }
tverouden 5:04b26b2f536a 193 break; // end case
tverouden 5:04b26b2f536a 194
tverouden 7:ef5966469621 195 // ============================== READING MODE =============================== // Beweegt deze modus zowel heen als weer en zo ja, hoe bepaalt hij wat moet gebeuren?
tverouden 7:ef5966469621 196 case reading:
tverouden 5:04b26b2f536a 197 // ------------------------- initialisation --------------------------
tverouden 5:04b26b2f536a 198 if (changeState) { // when entering the state
tverouden 7:ef5966469621 199 pc.printf("[MODE] reading...\r\n");
tverouden 5:04b26b2f536a 200 // print current state
tverouden 5:04b26b2f536a 201 changeState = false; // stay in this state
tverouden 5:04b26b2f536a 202
tverouden 5:04b26b2f536a 203 // Actions when entering state
tverouden 5:04b26b2f536a 204 /* */
tverouden 5:04b26b2f536a 205
tverouden 5:04b26b2f536a 206 }
tverouden 5:04b26b2f536a 207 // ----------------------------- action ------------------------------
tverouden 5:04b26b2f536a 208 // Actions for each loop iteration
tverouden 5:04b26b2f536a 209 /* */
tverouden 5:04b26b2f536a 210
tverouden 5:04b26b2f536a 211 // --------------------------- transition ----------------------------
tverouden 7:ef5966469621 212 // Transition condition #1: with button press, back to homing mode // Hier automatisch terug naar operating mode!
tverouden 5:04b26b2f536a 213 if (1) { // En hij gaat nu terug naar homing mode, maar dan moet je dus elke keer weer kiezen voor demo of operation mode?
tverouden 7:ef5966469621 214 // Actions when leaving state // CONDITION
tverouden 5:04b26b2f536a 215 /* */
tverouden 5:04b26b2f536a 216
tverouden 5:04b26b2f536a 217 currentState = homing; // change to state
tverouden 5:04b26b2f536a 218 changeState = true; // next loop, switch states
tverouden 5:04b26b2f536a 219 }
tverouden 5:04b26b2f536a 220 break; // end case
tverouden 5:04b26b2f536a 221
tverouden 5:04b26b2f536a 222 // ============================== DEMOING MODE ===============================
tverouden 5:04b26b2f536a 223 case demoing:
tverouden 5:04b26b2f536a 224 // ------------------------- initialisation --------------------------
tverouden 5:04b26b2f536a 225 if (changeState) { // when entering the state
tverouden 5:04b26b2f536a 226 pc.printf("[MODE] demoing...\r\n");
tverouden 5:04b26b2f536a 227 // print current state
tverouden 5:04b26b2f536a 228 changeState = false; // stay in this state
tverouden 5:04b26b2f536a 229
tverouden 5:04b26b2f536a 230 // Actions when entering state
tverouden 5:04b26b2f536a 231 /* */
tverouden 5:04b26b2f536a 232
tverouden 5:04b26b2f536a 233 }
tverouden 5:04b26b2f536a 234 // ----------------------------- action ------------------------------
tverouden 5:04b26b2f536a 235 // Actions for each loop iteration
tverouden 5:04b26b2f536a 236 /* */
tverouden 5:04b26b2f536a 237
tverouden 5:04b26b2f536a 238 // --------------------------- transition ----------------------------
tverouden 5:04b26b2f536a 239 // Transition condition #1: with button press, back to homing mode
tverouden 5:04b26b2f536a 240 if (1) {
tverouden 5:04b26b2f536a 241 // Actions when leaving state
tverouden 5:04b26b2f536a 242 /* */
tverouden 5:04b26b2f536a 243
tverouden 5:04b26b2f536a 244 currentState = homing; // change to state
tverouden 5:04b26b2f536a 245 changeState = true; // next loop, switch states
tverouden 5:04b26b2f536a 246 }
tverouden 7:ef5966469621 247 // Transition condition #2: after 3 sec relaxation, start reading // In 3 seconden zijn de bladzijden uit zichzelf alweer helemaal teruggegaan. Misschien dit gewoon doen na het voorgedefinieerde pad
tverouden 5:04b26b2f536a 248 if (1) {
tverouden 5:04b26b2f536a 249 // Actions when leaving state
tverouden 5:04b26b2f536a 250 /* */
tverouden 5:04b26b2f536a 251
tverouden 7:ef5966469621 252 currentState = reading; // change to state
tverouden 5:04b26b2f536a 253 changeState = true; // next loop, switch states
tverouden 5:04b26b2f536a 254 }
tverouden 5:04b26b2f536a 255 break; // end case
tverouden 5:04b26b2f536a 256
tverouden 5:04b26b2f536a 257 // =============================== FAILING MODE ================================
tverouden 5:04b26b2f536a 258 case failing:
tverouden 5:04b26b2f536a 259 // ------------------------- initialisation --------------------------
tverouden 5:04b26b2f536a 260 if (changeState) { // when entering the state
tverouden 5:04b26b2f536a 261 pc.printf("[ERROR] entering failure mode\r\n");
tverouden 7:ef5966469621 262 // print current state
tverouden 3:9c63fc5f157e 263 changeState = false; // stay in this state
tverouden 3:9c63fc5f157e 264
tverouden 3:9c63fc5f157e 265 // Actions when entering state
tverouden 7:ef5966469621 266 ledGreen = 1; // red LED on // Blijft dit aan?
tverouden 6:f32352bc5078 267 ledBlue = 1;
tverouden 6:f32352bc5078 268 ledRed = 0;
tverouden 4:5ce2c8864908 269
tverouden 6:f32352bc5078 270 // pin3 = 0; // all motor forces to zero // Pins nog niet gedefiniëerd
tverouden 6:f32352bc5078 271 // pin5 = 0;
tverouden 6:f32352bc5078 272 // pin6 = 0;
tverouden 6:f32352bc5078 273 exit (0); // abort mission
tverouden 4:5ce2c8864908 274 }
tverouden 4:5ce2c8864908 275 break; // end case
tverouden 4:5ce2c8864908 276
tverouden 4:5ce2c8864908 277 // ============================== DEFAULT MODE =================================
tverouden 3:9c63fc5f157e 278 default:
tverouden 4:5ce2c8864908 279 // ---------------------------- enter failing mode -----------------------------
tverouden 4:5ce2c8864908 280 currentState = failing; // change to state
tverouden 4:5ce2c8864908 281 changeState = true; // next loop, switch states
tverouden 4:5ce2c8864908 282 // print current state
tverouden 4:5ce2c8864908 283 pc.printf("[ERROR] unknown or unimplemented state reached\r\n");
tverouden 3:9c63fc5f157e 284
tverouden 4:5ce2c8864908 285 } // end switch
tverouden 4:5ce2c8864908 286 } // end stateMachine
tverouden 3:9c63fc5f157e 287
tverouden 3:9c63fc5f157e 288
tverouden 2:d70795e4e0bf 289
tverouden 2:d70795e4e0bf 290 // ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡ MAIN LOOP ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
tverouden 2:d70795e4e0bf 291
tverouden 3:9c63fc5f157e 292 int main()
tverouden 3:9c63fc5f157e 293 {
tverouden 8:8cef1050ebd9 294 // ================================ EMERGENCY ================================
tverouden 7:ef5966469621 295 //If the emergency button is pressed, stop program via failing state
tverouden 8:8cef1050ebd9 296 buttonEmergency.rise(stopProgram); // Automatische triggers voor failure mode?
tverouden 8:8cef1050ebd9 297
tverouden 8:8cef1050ebd9 298 // ================================ EMERGENCY ================================
tverouden 8:8cef1050ebd9 299 pc.baud(115200); // communication with terminal // Baud rate
tverouden 6:f32352bc5078 300
tverouden 2:d70795e4e0bf 301 // ==================================== LOOP ===================================
tverouden 2:d70795e4e0bf 302 while (true) { // loop forever
tverouden 2:d70795e4e0bf 303
tverouden 2:d70795e4e0bf 304 }
tverouden 2:d70795e4e0bf 305 }