Tommie Verouden / Mbed 2 deprecated StateMachine

Dependencies:   biquadFilter FastPWM MODSERIAL QEI mbed

Revision:
51:78c75cc72d17
Parent:
50:4a7b0a3f64cb
Parent:
49:0ada5a721686
Child:
52:17b3aeacb643
--- a/main.cpp	Thu Nov 01 20:22:46 2018 +0000
+++ b/main.cpp	Thu Nov 01 20:30:19 2018 +0000
@@ -56,8 +56,9 @@
 // Define & initialise state machine
 const float dt = 0.002f;
 enum states {   calibratingMotorL, calibratingMotorR, calibratingMotorF,
-                calibratingEMG, homing, reading, operating, failing, demoing };
-                
+                calibratingEMG, homing, reading, operating, failing, demoing
+            };
+
 states currentState = calibratingMotorL;        // start in motor L mode
 bool changeState = true;                        // initialise the first state
 
@@ -156,6 +157,9 @@
 int     countsCalibratedL;
 int     countsCalibratedR;
 int     countsCalibratedF;
+int     countsOffsetL;
+int     countsOffsetR;
+int     countsOffsetF;
 float   angleCurrentL;
 float   angleCurrentR;
 float   angleCurrentF;
@@ -379,19 +383,16 @@
 // ------------------------ General motor functions ----------------------------
 int countsInputL()      // Gets the counts from encoder 1
 {
-    int     countsL;
     countsL = encoderL.getPulses();
     return  countsL;
 }
 int countsInputR()      // Gets the counts from encoder 2
 {
-    int     countsR;
     countsR = encoderR.getPulses();
     return  countsR;
 }
 int countsInputF()      // Gets the counts from encoder 3
 {
-    int     countsF;
     countsF = encoderF.getPulses();
     return  countsF;
 }
@@ -405,7 +406,7 @@
     while   (angle < -2.0f*PI) {
         angle = angle+2.0f*PI;
     }
-    return  angle;
+    return angle;
 }
 
 float  errorCalc(float angleReference,float angleCurrent)     // Calculates the error of the system, based on the current angle and the reference value
@@ -438,15 +439,29 @@
     return  u_k + u_i + u_d;
 }
 
-//float angleDesiredL()        // Sets the desired angle for the controller dependent on the scaled angle of potmeter 1
-//{   float   angle = (pot2*2.0f*PI)-PI;
-//    return  angle;
-//}
+float angleDesiredL()        // Sets the desired angle for the controller dependent on the scaled angle of potmeter 1
+{
+    float   angleL = (pot1*2.0f*PI)-PI;
+    return  angleL;
+}
+
+int countsInputCalibratedL()      // Gets the counts from encoder 1
+{
+    countsL = encoderL.getPulses()- countsOffsetL + countsCalibration;
+    return  countsL;
+}
 
-float countsCalibrCalcL(int countsOffsetL)
+void    motorTurnL()    // main function for movement of motor 1, all above functions with an extra tab are called
 {
-    countsCalibratedL = countsL - countsOffsetL + countsCalibration;
-    return  countsCalibratedL;
+    float   angleReferenceL = angleDesiredL();                              // insert kinematics output here instead of angleDesiredL()
+    angleReferenceL = -angleReferenceL;                                     // different minus sign per motor
+    countsL = countsInputCalibratedL();                                       // different encoder pins per motor
+    angleCurrentL = angleCurrent(countsL);                                  // different minus sign per motor
+    errorL = errorCalc(angleReferenceL,angleCurrentL);                      // same for every motor
+
+    float   PIDControlL = PIDControllerL(angleReferenceL,angleCurrentL);    // same for every motor
+    pin6 = fabs(PIDControlL);                                               // different pins for every motor
+    pin7 = PIDControlL > 0.0f;                                              // different pins for every motor
 }
 
 void calibrationL()        // Partially the same as motorTurnL, only with potmeter input
@@ -456,6 +471,7 @@
 {
     float   angleReferenceL = angleDesiredL();                              // insert kinematics output here instead of angleDesiredL()
     angleReferenceL = -angleReferenceL;                                     // different minus sign per motor
+    countsL = countsInputL();                                       // different encoder pins per motor
     angleCurrentL = angleCurrent(countsL);                                  // different minus sign per motor
     errorL = errorCalc(angleReferenceL,angleCurrentL);                      // same for every motor
 
@@ -464,26 +480,14 @@
         pin6 = fabs(PIDControlL);                                               // different pins for every motor
         pin7 = PIDControlL > 0.0f;                                              // different pins for every motor
     } else if (fabs(errorL) < 0.01f) {
-        int countsOffsetL = countsL;
-        countsCalibrCalcL(countsOffsetL);
+        countsOffsetL = countsL;
+        countsL = countsL - countsOffsetL + countsCalibration;
+        //countsL = 0;
         pin6 = 0.0f;
         // BUTTON PRESS: TO NEXT STATE
     }
 }
 
-void    motorTurnL()    // main function for movement of motor 1, all above functions with an extra tab are called
-{
-    float   angleReferenceL = theta1;                              // insert kinematics output here instead of angleDesiredL()
-    angleReferenceL = -angleReferenceL;                                     // different minus sign per motor
-    int     countsL = countsInputL();                                       // different encoder pins per motor
-    angleCurrentL = angleCurrent(countsCalibratedL);                        // different minus sign per motor
-    errorCalibratedL = errorCalc(angleReferenceL,angleCurrentL);            // same for every motor
-
-    float   PIDControlL = PIDControllerL(angleReferenceL,angleCurrentL);    // same for every motor
-    pin6 = fabs(PIDControlL);                                               // different pins for every motor
-    pin7 = PIDControlL > 0.0f;                                              // different pins for every motor
-}
-
 // ------------------------ MOTOR FUNCTIONS FOR MOTOR RIGHT --------------------
 float PIDControllerR(float angleReference,float angleCurrent)  // PID controller for the motors, based on the reference value and the current angle of the motor
 {
@@ -508,15 +512,29 @@
     return  u_k + u_i + u_d;
 }
 
-//float angleDesiredR()        // Sets the desired angle for the controller dependent on the scaled angle of potmeter 1
-//{   float   angle = (pot2*2.0f*PI)-PI;
-//    return  angle;
-//}
+float angleDesiredR()        // Sets the desired angle for the controller dependent on the scaled angle of potmeter 1
+{
+    float   angleR = (pot2*2.0f*PI)-PI;
+    return  angleR;
+}
+
+int countsInputCalibratedR()      // Gets the counts from encoder 1
+{
+    countsR = encoderR.getPulses()- countsOffsetR + countsCalibration;
+    return  countsR;
+}
 
-float countsCalibrCalcR(int countsOffsetR)
+void    motorTurnR()    // main function for movement of motor 1, all above functions with an extra tab are called
 {
-    countsCalibratedR = countsR - countsOffsetR + countsCalibration;
-    return countsCalibratedR;
+    float   angleReferenceR = angleDesiredR();                              // insert kinematics output here instead of angleDesiredR()
+    angleReferenceR = -angleReferenceR;                                     // different minus sign per motor
+    countsR = countsInputCalibratedR();                                       // different encoder pins per motor
+    angleCurrentR = angleCurrent(countsR);                                  // different minus sign per motor
+    errorR = errorCalc(angleReferenceR,angleCurrentR);                      // same for every motor
+
+    float   PIDControlR = PIDControllerR(angleReferenceR,angleCurrentR);    // same for every motor
+    pin5 = fabs(PIDControlR);                                               // different pins for every motor
+    pin4 = PIDControlR > 0.0f;                                              // different pins for every motor
 }
 
 void calibrationR()        // Partially the same as motorTurnR, only with potmeter input
@@ -526,378 +544,364 @@
 {
     float   angleReferenceR = angleDesiredR();                              // insert kinematics output here instead of angleDesiredR()
     angleReferenceR = -angleReferenceR;                                     // different minus sign per motor
+    countsR = countsInputR();                                       // different encoder pins per motor
     angleCurrentR = angleCurrent(countsR);                                  // different minus sign per motor
     errorR = errorCalc(angleReferenceR,angleCurrentR);                      // same for every motor
 
     if (fabs(errorR) >= 0.01f) {
         float   PIDControlR = PIDControllerR(angleReferenceR,angleCurrentR);    // same for every motor
-        pin6 = fabs(PIDControlR);                                               // different pins for every motor
-        pin7 = PIDControlR > 0.0f;                                              // different pins for every motor
+        pin5 = fabs(PIDControlR);                                               // different pins for every motor
+        pin4 = PIDControlR > 0.0f;                                              // different pins for every motor
     } else if (fabs(errorR) < 0.01f) {
-        int countsOffsetR = countsR;
-        countsCalibrCalcR(countsOffsetR);
-        pin6 = 0.0f;
-        // BUTTON PRESS: NAAR VOLGENDE STATE
+        countsOffsetR = countsR;
+        countsR = countsR - countsOffsetR + countsCalibration;
+        //countsR = 0;
+        pin5 = 0.0f;
+        // BUTTON PRESS: TO NEXT STATE
     }
 }
 
-void    motorTurnR()    // main function for movement of motor 1, all above functions with an extra tab are called
-{
-    float   angleReferenceR = theta4;                                       // insert kinematics output here instead of angleDesiredR()
-    angleReferenceR = -angleReferenceR;                                     // different minus sign per motor
-    int     countsR = countsInputR();                                       // different encoder pins per motor
-    angleCurrentR = angleCurrent(countsCalibratedR);                        // different minus sign per motor
-    errorCalibratedR = errorCalc(angleReferenceR,angleCurrentR);            // same for every motor
-
-    float   PIDControlR = PIDControllerR(angleReferenceR,angleCurrentR);    // same for every motor
-    pin6 = fabs(PIDControlR);                                               // different pins for every motor
-    pin7 = PIDControlR > 0.0f;                                              // different pins for every motor
-}
-
 // ------------------------- MOTOR FUNCTIONS FOR MOTOR FLIP --------------------
-float PIDControllerF(float angleReference,float angleCurrent)  // PID controller for the motors, based on the reference value and the current angle of the motor
-{
-    float   Kp = 19.24f;
-    float   Ki = 1.02f;
-    float   Kd = 0.827f;
-    float   error = errorCalc(angleReference,angleCurrent);
-    static float    errorIntegralF = 0.0;
-    static float    errorPreviousF = error; // initialization with this value only done once!
-    static  BiQuad  PIDFilterF(0.0640, 0.1279, 0.0640, -1.1683, 0.4241);
-    // Proportional part:
-    float   u_k = Kp * error;
-    // Integral part
-    errorIntegralF = errorIntegralF + error * dt;
-    float   u_i = Ki * errorIntegralF;
-    // Derivative part
-    float   errorDerivative = (error - errorPreviousF)/dt;
-    float   errorDerivativeFiltered = PIDFilterF.step(errorDerivative);
-    float   u_d = Kd * errorDerivativeFiltered;
-    errorPreviousF = error;
-    // Sum all parts and return it
-    return  u_k + u_i + u_d;
-}
-
-float angleDesiredF()        // Sets the desired angle for the controller dependent on the scaled angle of potmeter 1
-{
-    float   angle = (pot1*2.0f*PI)-PI;
-    return  angle;
-}
-
-float countsCalibrCalcF(int countsOffsetF)
-{
-    countsCalibratedF = countsF - countsOffsetF + countsCalibration;
-    return countsCalibratedF;
-}
-
-void calibrationF()        // Partially the same as motorTurnF, only with potmeter input
-// How it works: manually turn motor using potmeters until the robot arm touches the bookholder.
-// This program sets the counts from the motor to the reference counts (an angle of PI/4.0)
-// Do this for every motor and after calibrated all motors, press a button
-    {
-        float angleReferenceF = 0.0f;
-        //float   angleReferenceF = angleDesiredF();                              // insert kinematics output here instead of angleDesiredF()
-        angleReferenceF = -angleReferenceF;                                     // different minus sign per motor
-        angleCurrentF = angleCurrent(countsF);                                  // different minus sign per motor
-        errorF = errorCalc(angleReferenceF,angleCurrentF);                      // same for every motor
-
-        if (fabs(errorF) >= 0.01f) {
-            float   PIDControlF = PIDControllerF(angleReferenceF,angleCurrentF);    // same for every motor
-            pin6 = fabs(PIDControlF);                                               // different pins for every motor
-            pin7 = PIDControlF > 0.0f;                                              // different pins for every motor
-        } else if (fabs(errorF) < 0.01f) {
-            int countsOffsetF = countsF;
-            countsCalibrCalcF(countsOffsetF);
-            pin6 = 0.0f;
-            // BUTTON PRESS: TO NEXT STATE
-        }
-    }
-
-    void    motorTurnF()    // main function for movement of motor 1, all above functions with an extra tab are called
-        {
-            float angleReferenceF = 0.0f;
-            //float   angleReferenceF = angleDesiredF();                              // insert kinematics output here instead of angleDesiredF()
-            angleReferenceF = -angleReferenceF;                                     // different minus sign per motor
-            int     countsF = countsInputF();                                       // different encoder pins per motor
-            angleCurrentF = angleCurrent(countsCalibratedF);                        // different minus sign per motor
-            errorCalibratedF = errorCalc(angleReferenceF,angleCurrentF);            // same for every motor
-
-            float   PIDControlF = PIDControllerF(angleReferenceF,angleCurrentF);    // same for every motor
-            pin6 = fabs(PIDControlF);                                               // different pins for every motor
-            pin7 = PIDControlF > 0.0f;                                              // different pins for every motor
-        }
 
 // ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡ STATE MACHINE ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
-        void stateMachine(void) {
-            switch (currentState) {         // determine which state Odin is in
-
-//  ========================= MOTOR CALIBRATION MODE ==========================
-                case calibratingMotors:
-//      ------------------------- initialisation --------------------------
-                    if (changeState) {                  // when entering the state
-                        pc.printf("[MODE] calibrating motors...\r\n");
-                        // print current state
-                        changeState = false;            // stay in this state
+void stateMachine(void)
+{
+    switch (currentState) {         // determine which state Odin is in
 
-                        // Actions when entering state
-                        ledRed = 1;                     // cyan-green blinking LED
-                        ledGreen = 0;
-                        ledBlue = 0;
-                        blinkTimer.attach(&blinkLedBlue,0.5);
+//  ======================== MOTOR L CALIBRATION MODE =========================
+        case calibratingMotorL:
+//      ------------------------- initialisation --------------------------
+            if (changeState) {                  // when entering the state
+                pc.printf("[MODE] calibrating motor L...\r\n");
+                // print current state
+                changeState = false;            // stay in this state
 
-                    }
+                // Actions when entering state
+                ledRed = 1;                     // green blinking LED
+                ledGreen = 1;
+                ledBlue = 1;
+                blinkTimer.attach(&blinkLedGreen,0.5);
+
+            }
 //      ----------------------------- action ------------------------------
-                    // Actions for each loop iteration
-                    /* */
+            // Actions for each loop iteration
+            calibrationL();
 
 //      --------------------------- transition ----------------------------
-                    // Transition condition: when all motor errors smaller than 0.01,
-                    //      start calibrating EMG
-                    if (errorMotorL < 0.01 && errorMotorR < 0.01
-                            && errorMotorF < 0.01 && buttonHome == false) {
+            // Transition condition: when all motor errors smaller than 0.01,
+            //      start calibrating EMG
+            if (errorL < 0.01F && buttonBio1 == true) {
+
+                // Actions when leaving state
+                blinkTimer.detach();
 
-                        // Actions when leaving state
-                        blinkTimer.detach();
+                currentState = calibratingMotorR;    // change to state
+                changeState = true;               // next loop, switch states
+            }
+
+            break; // end case
+
+//  ======================== MOTOR R CALIBRATION MODE =========================
+            case calibratingMotorR:
+//      ------------------------- initialisation --------------------------
+            if (changeState) {                  // when entering the state
+                pc.printf("[MODE] calibrating motor R...\r\n");
+                // print current state
+                changeState = false;            // stay in this state
 
-                        currentState = calibratingEMG;    // change to state
-                        changeState = true;               // next loop, switch states
-                    }
+                // Actions when entering state
+                ledRed = 1;                     // cyan-green blinking LED
+                ledGreen = 0;
+                ledBlue = 1;
+                blinkTimer.attach(&blinkLedBlue,0.5);
 
-                    break; // end case
+            }
+//      ----------------------------- action ------------------------------
+            // Actions for each loop iteration
+            calibrationR();
+//      --------------------------- transition ----------------------------
+            // Transition condition: when all motor errors smaller than 0.01,
+            //      start calibrating EMG
+            if (errorR < && buttonBio2 == true) {
 
-//  =========================== EMG CALIBRATION MODE ===========================
-                case calibratingEMG:
+                // Actions when leaving state
+                blinkTimer.detach();
+
+                currentState = calibratingMotorF;    // change to state
+                changeState = true;               // next loop, switch states
+            }
+
+            break; // end case
+            
+//  ======================== MOTOR F CALIBRATION MODE =========================
+            case calibratingMotorF:
 //      ------------------------- initialisation --------------------------
-                    if (changeState) {                  // when entering the state
-                        pc.printf("[MODE] calibrating EMG...\r\n");
-                        // print current state
-                        changeState = false;            // stay in this state
+            if (changeState) {                  // when entering the state
+                pc.printf("[MODE] calibrating motor F...\r\n");
+                // print current state
+                changeState = false;            // stay in this state
+
+                // Actions when entering state
+                ledRed = 1;                     // green blinking LED
+                ledGreen = 1;
+                ledBlue = 1;
+                blinkTimer.attach(&blinkLedGreen,0.5);
 
-                        // Actions when entering state
-                        ledRed = 1;                     // cyan-blue blinking LED
-                        ledGreen = 0;
-                        ledBlue = 0;
-                        blinkTimer.attach(&blinkLedGreen,0.5);
+            }
+//      ----------------------------- action ------------------------------
+            // Actions for each loop iteration
+            calibrationF();
+//      --------------------------- transition ----------------------------
+            // Transition condition: when all motor errors smaller than 0.01,
+            //      start calibrating EMG
+            if (errorF < 0.01f && buttonHome == false) {
+
+                // Actions when leaving state
+                blinkTimer.detach();
+
+                currentState = calibratingEMG;    // change to state
+                changeState = true;               // next loop, switch states
+            }
 
-                        FindMax0_timer.attach(&FindMax0,15);            //Find the maximum value after 15 seconds
-                        FindMax1_timer.attach(&FindMax1,15);            //Find the maximum value after 15 seconds
+            break; // end case
+            
+//  =========================== EMG CALIBRATION MODE ===========================
+        case calibratingEMG:
+//      ------------------------- initialisation --------------------------
+            if (changeState) {                  // when entering the state
+                pc.printf("[MODE] calibrating EMG...\r\n");
+                // print current state
+                changeState = false;            // stay in this state
 
-                        EMGtransition_timer.reset();
-                        EMGtransition_timer.start();
-                    }
+                // Actions when entering state
+                ledRed = 1;                     // cyan-blue blinking LED
+                ledGreen = 0;
+                ledBlue = 0;
+                blinkTimer.attach(&blinkLedGreen,0.5);
+
+                FindMax0_timer.attach(&FindMax0,15);            //Find the maximum value after 15 seconds
+                FindMax1_timer.attach(&FindMax1,15);            //Find the maximum value after 15 seconds
+
+                EMGtransition_timer.reset();
+                EMGtransition_timer.start();
+            }
 //      ----------------------------- action ------------------------------
-                    // Actions for each loop iteration
-                    CalibrateEMG0();   //start emg calibration every 0.005 seconds
-                    CalibrateEMG1();   //Start EMG calibration every 0.005 seconds
-                    /* */
+            // Actions for each loop iteration
+            CalibrateEMG0();   //start emg calibration every 0.005 seconds
+            CalibrateEMG1();   //Start EMG calibration every 0.005 seconds
+            /* */
 
 
 //      --------------------------- transition ----------------------------
-                    // Transition condition: after 20 sec in state
-                    if (local_timer.read() > 20) {
-                        // Actions when leaving state
-                        blinkTimer.detach();
+            // Transition condition: after 20 sec in state
+            if (EMGtransition_timer.read() > 20) {
+                // Actions when leaving state
+                blinkTimer.detach();
 
-                        currentState = homing;              // change to state
-                        changeState = true;                 // next loop, switch states
-                    }
-                    break; // end case
+                currentState = homing;              // change to state
+                changeState = true;                 // next loop, switch states
+            }
+            break; // end case
 
 //  ============================== HOMING MODE ================================
-                case homing:
+        case homing:
 //      ------------------------- initialisation --------------------------
-                    if (changeState) {                  // when entering the state
-                        pc.printf("[MODE] homing...\r\n");
-                        // print current state
-                        changeState = false;            // stay in this state
+            if (changeState) {                  // when entering the state
+                pc.printf("[MODE] homing...\r\n");
+                // print current state
+                changeState = false;            // stay in this state
 
 
-                        // Actions when entering state
-                        ledRed = 1;                     // cyan LED on
-                        ledGreen = 0;
-                        ledBlue = 0;
+                // Actions when entering state
+                ledRed = 1;                     // cyan LED on
+                ledGreen = 0;
+                ledBlue = 0;
 
-                    }
+            }
 //      ----------------------------- action ------------------------------
-                    // Actions for each loop iteration
-                    /* */
+            // Actions for each loop iteration
+            /* */
 
 //      --------------------------- transition ----------------------------
-                    // Transition condition #1: with button press, enter demo mode,
-                    //      but only when velocity == 0
-                    if (errorMotorL < 0.01 && errorMotorR < 0.01
-                            && errorMotorF < 0.01 && buttonBio1 == true) {
-                        // Actions when leaving state
-                        /* */
+            // Transition condition #1: with button press, enter reading mode,
+            //      but only when velocity == 0
+            if (errorCalibratedL < 0.01f && errorCalibratedR < 0.01f
+                    && errorCalibratedF < 0.01f && buttonBio1 == false) {
+                // Actions when leaving state
+                /* */
 
-                        currentState = reading;             // change to state
-                        changeState = true;                 // next loop, switch states
-                    }
-                    // Transition condition #2: with button press, enter operation mode
-                    //      but only when velocity == 0
-                    if (errorMotorL < 0.01 && errorMotorR < 0.01
-                            && errorMotorF < 0.01 && buttonBio2 == true) {
-                        // Actions when leaving state
-                        /* */
+                currentState = reading;             // change to state
+                changeState = true;                 // next loop, switch states
+            }
+            // Transition condition #2: with button press, enter demo mode
+            //      but only when velocity == 0
+            if (errorCalibratedL < 0.01f && errorCalibratedR < 0.01f
+                    && errorCalibratedF < 0.01f && buttonBio2 == false) {
+                // Actions when leaving state
+                /* */
 
-                        currentState = demoing;             // change to state
-                        changeState = true;                 // next loop, switch states
-                    }
-                    break; // end case
+                currentState = demoing;             // change to state
+                changeState = true;                 // next loop, switch states
+            }
+            break; // end case
 
 //  ============================== READING MODE ===============================
-                case reading:
+        case reading:
 //      ------------------------- initialisation --------------------------
-                    if (changeState) {                  // when entering the state
-                        pc.printf("[MODE] reading...\r\n");
-                        // print current state
-                        changeState = false;            // stay in this state
+            if (changeState) {                  // when entering the state
+                pc.printf("[MODE] reading...\r\n");
+                // print current state
+                changeState = false;            // stay in this state
 
-                        // Actions when entering state
-                        ledRed = 1;                     // blue LED on
-                        ledGreen = 1;
-                        ledBlue = 0;
+                // Actions when entering state
+                ledRed = 1;                     // blue LED on
+                ledGreen = 1;
+                ledBlue = 0;
 
-                        // TERUGKLAPPEN
+                // TERUGKLAPPEN
 
-                    }
+            }
 //      ----------------------------- action ------------------------------
-                    // Actions for each loop iteration
-                    ReadUseEMG0();                  //Start the use of EMG
-                    ReadUseEMG1();                  //Start the use of EMG
-                    /* */
+            // Actions for each loop iteration
+            ReadUseEMG0();                  //Start the use of EMG
+            ReadUseEMG1();                  //Start the use of EMG
+            /* */
 
 //      --------------------------- transition ----------------------------
-                    // Transition condition #1: when EMG signal detected, enter reading
-                    //      mode
-                    if (xMove == true || yMove == true) {
-                        // Actions when leaving state
-                        /* */
+            // Transition condition #1: when EMG signal detected, enter operating
+            //      mode
+            if (xMove == true && yMove == true) {
+                // Actions when leaving state
+                /* */
 
-                        currentState = reading;             // change to state
-                        changeState = true;                 // next loop, switch states
-                    }
-                    // Transition condition #2: with button press, back to homing mode
-                    if (buttonHome == false) {
-                        // Actions when leaving state
-                        /* */
+                currentState = operating;             // change to state
+                changeState = true;                 // next loop, switch states
+            }
+            // Transition condition #2: with button press, back to homing mode
+            if (buttonHome == false) {
+                // Actions when leaving state
+                /* */
 
-                        currentState = homing;              // change to state
-                        changeState = true;                 // next loop, switch states
-                    }
-                    break; // end case
+                currentState = homing;              // change to state
+                changeState = true;                 // next loop, switch states
+            }
+            break; // end case
 
 //  ============================= OPERATING MODE ==============================
-                case operating:
+        case operating:
 //      ------------------------- initialisation --------------------------
-                    if (changeState) {                  // when entering the state
-                        pc.printf("[MODE] operating...\r\n");
-                        // print current state
-                        changeState = false;            // stay in this state
+            if (changeState) {                  // when entering the state
+                pc.printf("[MODE] operating...\r\n");
+                // print current state
+                changeState = false;            // stay in this state
 
-                        // Actions when entering state
-                        ledRed = 1;                     // blue fast blinking LED
-                        ledGreen = 1;
-                        ledBlue = 1;
-                        blinkTimer.attach(&blinkLedBlue,0.25);
+                // Actions when entering state
+                ledRed = 1;                     // blue fast blinking LED
+                ledGreen = 1;
+                ledBlue = 1;
+                blinkTimer.attach(&blinkLedBlue,0.25);
 
-                    }
+            }
 //      ----------------------------- action ------------------------------
-                    // Actions for each loop iteration
-                    /* */
+            // Actions for each loop iteration
+            /* */
 
 //      --------------------------- transition ----------------------------
-                    // Transition condition: when path is over, back to reading mode
-                    if (errorMotorL < 0.01 && errorMotorR < 0.01) {
-                        // Actions when leaving state
-                        blinkTimer.detach();
+            // Transition condition: when path is over, back to reading mode
+            if (errorCalibratedL < 0.01f && errorCalibratedR < 0.01f) {
+                // Actions when leaving state
+                blinkTimer.detach();
 
-                        currentState = reading;              // change to state
-                        changeState = true;                 // next loop, switch states
-                    }
-                    break; // end case
+                currentState = reading;              // change to state
+                changeState = true;                 // next loop, switch states
+            }
+            break; // end case
 
 //  ============================== DEMOING MODE ===============================
-                case demoing:
+        case demoing:
 //      ------------------------- initialisation --------------------------
-                    if (changeState) {                  // when entering the state
-                        pc.printf("[MODE] demoing...\r\n");
-                        // print current state
-                        changeState = false;            // stay in this state
+            if (changeState) {                  // when entering the state
+                pc.printf("[MODE] demoing...\r\n");
+                // print current state
+                changeState = false;            // stay in this state
 
-                        // Actions when entering state
-                        ledRed = 0;                     // yellow LED on
-                        ledGreen = 0;
-                        ledBlue = 1;
+                // Actions when entering state
+                ledRed = 0;                     // yellow LED on
+                ledGreen = 0;
+                ledBlue = 1;
 
-                    }
+            }
 //      ----------------------------- action ------------------------------
-                    // Actions for each loop iteration
-                    /* */
-                    ReadUseEMG0();                  //Start the use of EMG
-                    ReadUseEMG1();                  //Start the use of EMG
+            // Actions for each loop iteration
+            /* */
+            ReadUseEMG0();                  //Start the use of EMG
+            ReadUseEMG1();                  //Start the use of EMG
+            kinematics();
+            motorTurnL();
+            motorTurnR();
 
 //      --------------------------- transition ----------------------------
-                    // Transition condition: with button press, back to homing mode
-                    if (buttonHome == false) {
-                        // Actions when leaving state
-                        /* */
+            // Transition condition: with button press, back to homing mode
+            if (buttonHome == false) {
+                // Actions when leaving state
+                /* */
 
-                        currentState = homing;              // change to state
-                        changeState = true;                 // next loop, switch states
-                    }
-                    break; // end case
+                currentState = homing;              // change to state
+                changeState = true;                 // next loop, switch states
+            }
+            break; // end case
 
 // =============================== FAILING MODE ================================
-                case failing:
-                    changeState = false;            // stay in this state
+        case failing:
+            changeState = false;            // stay in this state
 
-                    // Actions when entering state
-                    ledRed = 0;                     // red LED on
-                    ledGreen = 1;
-                    ledBlue = 1;
+            // Actions when entering state
+            ledRed = 0;                     // red LED on
+            ledGreen = 1;
+            ledBlue = 1;
 
-                    pin3 = 0;                       // all motor forces to zero
-                    pin5 = 0;
-                    pin6 = 0;
-                    exit (0);                       // stop all current functions
-                    break; // end case
+            pin3 = 0;                       // all motor forces to zero
+            pin5 = 0;
+            pin6 = 0;
+            exit (0);                       // stop all current functions
+            break; // end case
 
 // ============================== DEFAULT MODE =================================
-                default:
+        default:
 // ---------------------------- enter failing mode -----------------------------
-                    currentState = failing;                 // change to state
-                    changeState = true;                     // next loop, switch states
-                    // print current state
-                    pc.printf("[ERROR] unknown or unimplemented state reached\r\n");
+            currentState = failing;                 // change to state
+            changeState = true;                     // next loop, switch states
+            // print current state
+            pc.printf("[ERROR] unknown or unimplemented state reached\r\n");
 
-            }   // end switch
-        }       // end stateMachine
+    }   // end switch
+}       // end stateMachine
 
 
 
 // ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡ MAIN LOOP ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
 
-        int main() {
+int main()
+{
 //  ================================ EMERGENCY ================================
-            //If the emergency button is pressed, stop program via failing state
-            buttonEmergency.rise(stopProgram);                                          // Automatische triggers voor failure mode? -> ook error message in andere functies plaatsen!
+    //If the emergency button is pressed, stop program via failing state
+    buttonEmergency.rise(stopProgram);                                          // Automatische triggers voor failure mode? -> ook error message in andere functies plaatsen!
 
 //  ============================= PC-COMMUNICATION ============================
-            pc.baud(115200); // communication with terminal
-            pc.printf("\n\n[START] starting O.D.I.N\r\n");
+    pc.baud(115200); // communication with terminal
+    pc.printf("\n\n[START] starting O.D.I.N\r\n");
 
 //  ============================= PIN DEFINE PERIOD ===========================
-            // If you give a period on one pin, c++ gives all pins this period
-            pin3.period_us(15);
+    // If you give a period on one pin, c++ gives all pins this period
+    pin3.period_us(15);
 
 // ==================================== LOOP ==================================
-            // run state machine at 500 Hz
-            stateTimer.attach(&stateMachine,dt);
+    // run state machine at 500 Hz
+    stateTimer.attach(&stateMachine,dt);
 
 //  =============================== ADD FILTERS ===============================
-            //Make filter chain for the first EMG
-            filter0.add(&Notch50_0).add(&Notch100_0).add(&Notch150_0).add(&Notch200_0).add(&Low_0).add(&High_0);
-            //Make filter chain for the second EMG
-            filter1.add(&Notch50_1).add(&Notch100_1).add(&Notch150_1).add(&Notch200_1).add(&Low_1).add(&High_1);
-        }
+    //Make filter chain for the first EMG
+    filter0.add(&Notch50_0).add(&Notch100_0).add(&Notch150_0).add(&Notch200_0).add(&Low_0).add(&High_0);
+    //Make filter chain for the second EMG
+    filter1.add(&Notch50_1).add(&Notch100_1).add(&Notch150_1).add(&Notch200_1).add(&Low_1).add(&High_1);
+}