Script 15-10-2019

Dependencies:   Servoaansturing mbed QEI HIDScope biquadFilter MODSERIAL FastPWM

Revision:
42:ca4bbc3e0239
Parent:
41:dcfe6c86e3f5
--- a/main.cpp	Tue Nov 05 16:09:52 2019 +0000
+++ b/main.cpp	Tue Nov 05 20:18:55 2019 +0000
@@ -172,13 +172,13 @@
 // VOIDS
 
 void emergency()                                                                        // Noodfunctie waarbij de motoren uit worden gezet en de ProcessStateMachine wordt losgekoppeld
-{                                                                                       // van de ticker. De robot doet dan niks meer. De enige optie is om de mbed te resetten, waarna 
-    loop_ticker.detach();                                                               // het script opnieuw moet worden opgestart. 
+{                                                                                       // van de ticker. De robot doet dan niks meer. De enige optie is om de mbed te resetten, waarna
+    loop_ticker.detach();                                                               // het script opnieuw moet worden opgestart.
     motor1.write(0);
     motor2.write(0);
     pc.printf("Ik ga exploderen!!!\r\n");
 }
-                                                                              
+
 void motors_off()                                                                       // Functie waarbij beide motoren worden uitgezet.
 {
     motor1.write(0);
@@ -262,9 +262,9 @@
     Motor_2_position = Joint_1_position + Joint_2_position;
 }
 
-void PI_controller()                                                                    // De PI-controller zorgt ervoor dat het proportionele en het integrale aandeel worden bepaald. 
-{                                                                                       // Na sommatie van beide aandelen, wordt theta_t als output verkregen. Deze wordt later als input 
-// Proportional part:                                                                   // voor de motorsnelheden gebruikt. 
+void PI_controller()                                                                    // De PI-controller zorgt ervoor dat het proportionele en het integrale aandeel worden bepaald.
+{                                                                                       // Na sommatie van beide aandelen, wordt theta_t als output verkregen. Deze wordt later als input
+// Proportional part:                                                                   // voor de motorsnelheden gebruikt.
     theta_k_1= Kp * error_M1;
     theta_k_2= Kp * error_M2;
 
@@ -300,8 +300,8 @@
 
 void Controlling_system()                                                               // Hoofdfunctie die wordt toegepast tijdens de operation mode. Een gewenste snelheid in x- en y-richting wordt
 {                                                                                       // hiervoor opgesteld en is vervolgens de input voor de inverse kinematica functie. Door middel van een gewenste
-    Inverse_Kinematics();                                                               // motorhoek en de actuele motorhoek wordt een error bepaald. Deze errors worden als input gebruikt voor de                                                   
-                                                                                        // PI-controller, wiens absolute output wordt gebruikt om de motorsnelheid aan te sturen. Tevens wordt een functie 
+    Inverse_Kinematics();                                                               // motorhoek en de actuele motorhoek wordt een error bepaald. Deze errors worden als input gebruikt voor de
+                                                                                        // PI-controller, wiens absolute output wordt gebruikt om de motorsnelheid aan te sturen. Tevens wordt een functie
     error_M1 = Motor_1_position + theta_h_1_rad;                                        // aangeroepen die ervoor zorgt dat de motoren in de juiste richting gaan draaien.
     error_M2 = Motor_2_position + theta_h_2_rad;
 
@@ -315,38 +315,38 @@
     Define_motor_dir();
 }
 
-void servo()
+void servo_horizontal()                                                                 // Functie die ervoor zorgt dat de spatel horizontaal wordt gehouden door de servo motor in de operation mode.
 {
     q1_ser= q1*604.7887837;
     q2_ser= q2*604.7887837;
+    theta_sout=theta_f+q1_ser+q2_ser;
 
-    if  (servo_button_pressed.read()== false) {
-        theta_sout=theta_f+q1_ser+q2_ser+400;
-        if (theta_sout>=2400) {
-            theta_sout=2400;
-        }
-        if (theta_sout<=500) {
-            theta_sout=500;
-        } else {
-            theta_sout;
-        }
+    if (theta_sout>=2400) {
+        theta_sout=2400;
+    }
+    if (theta_sout<=500) {
+        theta_sout=500;
+
         mijnServo.SetPosition(theta_sout);
-        pc.printf("De servo staat op %f graden. in de klapstand\n\r", theta_sout);
+        pc.printf("De servo staat op %f graden\n\r", theta_sout);
+    }
+}
+
+void servo_flip()                                                                       // Functie die ervoor zorgt dat de spatel flipt, wanneer er een button wordt ingedrukt. Wordt eveneens gerealiseerd
+{                                                                                       // door de servo motor.
+    theta_sout=theta_f+q1_ser+q2_ser+400;
+
+    if (theta_sout>=2400) {
+        theta_sout=2400;
+    }
+    if (theta_sout<=500) {
+        theta_sout=500;
+    } else {
+        theta_sout;
     }
 
-    else {
-        theta_sout=theta_f+q1_ser+q2_ser;
-        if (theta_sout>=2400) {
-            theta_sout=2400;
-        }
-        if (theta_sout<=500) {
-            theta_sout=500;
-        } else {
-            theta_sout;
-        }
-        mijnServo.SetPosition(theta_sout);
-        pc.printf("De servo staat op %f graden.\n\r", theta_sout);
-    }
+    mijnServo.SetPosition(theta_sout);
+    pc.printf("De servo staat op %f graden, in de klapstand\n\r", theta_sout);
 }
 
 // Aanmaken van een bool om te testen of de berekeningen in the ProcessStatemachine
@@ -360,8 +360,7 @@
 
 volatile bool loop_done = true;
 
-// Finite state machine programming (calibration servo motor?)
-void ProcessStateMachine(void)
+void ProcessStateMachine(void)                                                          // Programmeren van de finite state machine.
 {
     if (!loop_done) {
         pc.printf("There is a timing problem\r\n");
@@ -436,9 +435,9 @@
             }
             break;
 
-        case Calib_motor:                                                               // In deze state wordt de robot arm met de hand in de juiste referentie (home) positie geplaatst. 
-                                                                                        // Wanneer dit is gebeurd, wordt de motor kalibratie knop ingedrukt. De offset wordt dan ingesteld als 
-            if (stateChanged) {                                                         // het huidige aantal counts. Door deze offset in de komende metingen af te trekken van het aantal counts 
+        case Calib_motor:                                                               // In deze state wordt de robot arm met de hand in de juiste referentie (home) positie geplaatst.
+                                                                                        // Wanneer dit is gebeurd, wordt de motor kalibratie knop ingedrukt. De offset wordt dan ingesteld als
+            if (stateChanged) {                                                         // het huidige aantal counts. Door deze offset in de komende metingen af te trekken van het aantal counts
                 pc.printf("Zet motoren handmatig in home positie\r\n");                 // op dat moment, wordt ervoor gezorgd dat de motorhoeken in de referentiepositie gelijk zijn aan nul.
                 stateChanged = false;
             }
@@ -455,7 +454,7 @@
             }
             break;
 
-        case Calib_EMG:                                                                 // In deze state wordt een kalibratie uitgevoerd van de EMG-signalen. Hiervoor wordt een bool (calib) 
+        case Calib_EMG:                                                                 // In deze state wordt een kalibratie uitgevoerd van de EMG-signalen. Hiervoor wordt een bool (calib)
                                                                                         // samen met een teller (i_calib) in werking gezet, die ervoor zorgt dat de eerder beschreven EMG-kalibratie
             if (stateChanged) {                                                         // wordt doorlopen. De spieren worden tijdens de kalibratie gedurende 5 seconden maximaal aangespannen.
                 i_calib = 0;                                                            // Na deze 5 seconden wordt doorgegaan naar de volgende state. De output van deze kalibratie is een gemiddelde
@@ -477,7 +476,7 @@
             break;
 
         case Homing:                                                                    // In deze state wordt de homing uitgevoerd. De motoren draaien hier op een langzame snelheid, todat de gewenste referentiepositie
-                                                                                        // wordt bereikt. In dit geval worden de motorsnelheden op 0 gezet. Indien beide motoren de juiste posities hebben bereikt, wordt                                                               
+                                                                                        // wordt bereikt. In dit geval worden de motorsnelheden op 0 gezet. Indien beide motoren de juiste posities hebben bereikt, wordt
             if (stateChanged) {                                                         // overgegaan naar de volgende state. De eerste keer dat de ProcessStateMachine in de homing state belandt, is dit al het geval,
                 stateChanged = false;                                                   // waardoor gelijk doorgegaan kan worden naar de operation mode.
             }
@@ -497,7 +496,7 @@
         case Operation_mode:
 
             if (stateChanged) {                                                         // Aan het begin van de operation mode wordt aan allerlei variabelen een beginwaarde van 0 toegekend. Dit wordt één keer gedaan
-                motors_off();                                                           // (stateChanged), waarna deze waarden verderop in deze state worden overschreven. In het geval dat er tussendoor teruggegaan is 
+                motors_off();                                                           // (stateChanged), waarna deze waarden verderop in deze state worden overschreven. In het geval dat er tussendoor teruggegaan is
                 Joint_1_position = 0;                                                   // naar een andere state, wordt op deze manier elke keer weer begonnen met de juiste beginwaarden.
                 Joint_2_position = 0;
                 Joint_1_position_prev = Joint_1_position;
@@ -513,6 +512,12 @@
                 stateChanged = false;
             }
 
+            servo_horizontal();                                                         // Zorgt ervoor dat de spatel horizontaal wordt gehouden.
+
+            if  (servo_button_pressed.read()== false) {
+                servo_flip();                                                           // Zorgt ervoor dat de spatel flipt, wanneer de servo knop wordt ingedrukt.
+            }
+
             if (Power_button_pressed.read() == false) {                                 // Wanneer de power button wordt ingedrukt, worden de motoren uitgezet.
                 motors_off();
                 currentState = Motors_off;
@@ -522,18 +527,18 @@
             if (Emergency_button_pressed.read() == false) {                             // Wanneer de emergency button wordt ingedrukt, wordt de emergency functie aangeroepen.
                 emergency();
             }
-            if (Motor_calib_button_pressed.read() == false) {                           // Wanneer tijdens de operation mode teruggegaan moet worden naar de referentie positie, kan de button voor de motor kalibratie 
-                motors_off();                                                           // worden ingedrukt. In dit geval is het niet nodig om de motoren opnieuw te kalibreren, dus kan direct teruggegaan worden naar 
+            if (Motor_calib_button_pressed.read() == false) {                           // Wanneer tijdens de operation mode teruggegaan moet worden naar de referentie positie, kan de button voor de motor kalibratie
+                motors_off();                                                           // worden ingedrukt. In dit geval is het niet nodig om de motoren opnieuw te kalibreren, dus kan direct teruggegaan worden naar
                 currentState = Homing;                                                  // de state Homing. De motoren bewegen dan totdat de referentie positie weer wordt bereikt.
                 stateChanged = true;
                 pc.printf("Terug naar de state Homing\r\n");
             }
-            if (normalized_EMG_biceps_right >= 0.3) {                                   // Vanaf hier begint de daadwerkelijke besturing van de robot arm door middel van EMG signalen. Indien de rechter biceps wordt 
-                                                                                        // aangespannen, zal het genormaliseerde EMG signaal boven 0.3 uitkomen. Wanneer tegelijkertijd de kuit wordt aangespannen is er 
+            if (normalized_EMG_biceps_right >= 0.3) {                                   // Vanaf hier begint de daadwerkelijke besturing van de robot arm door middel van EMG signalen. Indien de rechter biceps wordt
+                                                                                        // aangespannen, zal het genormaliseerde EMG signaal boven 0.3 uitkomen. Wanneer tegelijkertijd de kuit wordt aangespannen is er
                 if (normalized_EMG_calf < 0.3) {                                        // een gewenste negatieve snelheid in de y-richting. Zo niet, dan is er een gewenste positieve snelheid in de y-richting.
-                    vx = 0.0;                                                           // Deze gewenste snelheid wordt doorgevoerd in de functie Controlling_system, die onder andere inverse kinematics en een 
+                    vx = 0.0;                                                           // Deze gewenste snelheid wordt doorgevoerd in de functie Controlling_system, die onder andere inverse kinematics en een
                     vy = 0.02;                                                          // PI-controller bevat. Uiteindelijk wordt aan beide motoren een snelheid en richting toegekend, zodat de robot met de
-                }                                                                       // gewenste snelheid in een rechte lijn verticaal kan bewegen. 
+                }                                                                       // gewenste snelheid in een rechte lijn verticaal kan bewegen.
                 if (normalized_EMG_calf >= 0.3) {
                     vx = 0.0;
                     vy = -0.02;
@@ -541,7 +546,7 @@
 
                 Controlling_system();
 
-            } else if (normalized_EMG_biceps_left >= 0.3) {                             // Indien de rechter biceps niet wordt aangespannen en de genormaliseerde EMG-waarde van de linker biceps groter is dan 0.3, geldt 
+            } else if (normalized_EMG_biceps_left >= 0.3) {                             // Indien de rechter biceps niet wordt aangespannen en de genormaliseerde EMG-waarde van de linker biceps groter is dan 0.3, geldt
                 if (normalized_EMG_calf < 0.3) {                                        // hetzelfde als hierboven beschreven, maar dan voor de x-richting. Dit resulteert in een horizontale beweging in een rechte lijn.
                     vx = 0.02;
                     vy = 0.0;
@@ -563,12 +568,12 @@
             break;
 
         default:
-                                                
+
             motors_off();                                                               // Hier wordt dezelfde functie als eerder toegepast om de motoren uit te schakelen -> safety!
             pc.printf("Unknown or uninplemented state reached!\r\n");
 
     }
-    loop_done = true;                                                                   // Dit is nog een element voor het testen of de ProcessStateMachine zichzelf inhaalt. Indien de volledige 
+    loop_done = true;                                                                   // Dit is nog een element voor het testen of de ProcessStateMachine zichzelf inhaalt. Indien de volledige
 }                                                                                       // loop wel doorlopen is, verandert de bool hier in true. Hierdoor wordt de string aan het begin van de state machine
                                                                                         // NIET geprint. Zie een eerdere comment (vlak voor de definitie van de state machine) voor verdere toelichting.
 int main(void)
@@ -580,9 +585,9 @@
 
     pc.printf("Opstarten\r\n");
 
-    // Chain voor rechter biceps                                                        // De filterketens zijn apart voor elke spier gedefinieerd. Er wordt eerst een keten aangemaakt die bestaat uit een 
+    // Chain voor rechter biceps                                                        // De filterketens zijn apart voor elke spier gedefinieerd. Er wordt eerst een keten aangemaakt die bestaat uit een
     bqcbr.add(&bqbr1).add(&bqbr2);                                                      // high-pass filter, gevolgd door een notch filter. Na het nemen van de absolute waarde van het bewerkte EMG-signaal
-    bqcbr2.add(&bqbr3).add(&bqbr4);                                                     // moet het tweede gedeelte van de filterketen worden toegepast. Hiervoor moeten twee low-pass filters aan elkaar 
+    bqcbr2.add(&bqbr3).add(&bqbr4);                                                     // moet het tweede gedeelte van de filterketen worden toegepast. Hiervoor moeten twee low-pass filters aan elkaar
     // Chain voor linker biceps                                                         // geketend worden.
     bqcbl.add(&bqbl1).add(&bqbl2);
     bqcbl2.add(&bqbl3).add(&bqbl4);