Diagonaal berekenen lukt, meerdere outputs nog niet

Dependencies:   mbed FastPWM HIDScope MODSERIAL QEI

Revision:
5:a9da7bc89b24
Parent:
4:bd1db680e5a1
Child:
6:ee243782bf51
--- a/main.cpp	Fri Oct 14 10:22:22 2016 +0000
+++ b/main.cpp	Mon Oct 17 14:25:12 2016 +0000
@@ -4,23 +4,30 @@
 #define SERIAL_BAUD 115200
 
 Serial pc(USBTX,USBRX);
+InterruptIn Button1(PTC6);          // DIT WORDT EEN ANDERE BUTTON
+
+// tickers
+Ticker TickerCaseBepalen;
 Ticker TickerVeranderenXY;
 Ticker TickerAfstandBerekenen;
 Ticker TickerMotorHoekBerekenen;
 Ticker TickerBerekenenBewegingsHoek;
 Ticker TickerFlipperBewegen;
 
-// in te voeren x en y waardes (MOETEN UITEINDELIJK DE POSITIE IN CALIBRATIE ZIJN)
-volatile float x = -200.0;    
-volatile float y = 200.0; 
+// in te voeren x en y waardes 
+volatile float x = 0.0;    
+volatile float y = 305.5; 
+volatile float vorigex = 0.0;
+volatile float vorigey = 0.0;
 
 // waardes
-volatile const float a = 50.0;       // de afstand van gekozen assenstelsel tot de armas (assenstelsel precies in het midden)
-volatile const float Bar = 200.0;    // lengte van de armen 
+volatile const float a = 50.0;       // de afstand van gekozen assenstelsel tot de armas (assenstelsel precies in het midden)   KEERTJE NAMETEN
+volatile const float Bar = 200.0;    // lengte van de armen                                                                     KEERTJE NAMETEN
 volatile const float pi = 3.14159265359; 
-volatile float VorigeHoek1 = 0.5f*pi;     // begin hoek van 90 graden
-volatile float VorigeHoek2 = 0.5f*pi; 
-volatile float step = 1;    // EEN GOK VOOR HET STAPJE EN MOET DUS NOG AANGEPAST
+volatile float VorigeHoek1 = 1.0/3.0*pi;     // begin hoek van 90 graden
+volatile float VorigeHoek2 = 1.0/3.0*pi; 
+volatile float Step = 1;    // EEN GOK VOOR HET STAPJE EN MOET DUS NOG AANGEPAST
+volatile float MaxHoek = pi - 30*pi/180;   // de hoek voordat arm het opstakel raakt (max hoek is 24.9 tussen arm en opstakel)
 
 volatile float Dia1 = 0.0;
 volatile float Dia2 = 0.0;
@@ -31,31 +38,70 @@
 volatile bool Richting1 = true;     // cw = true, ccw = false
 volatile bool Richting2 = true;     
 volatile bool FlipperAan = false;   // als true dan flipper aanzetten
+bool BezigMetCalibreren = true;     // we beginnen met calibreren
+bool BeginnenMetFlippen = false;    // om de flipper aan te zetten
+bool BezigMetFlippen = false;       // om verandering in x en y tegen te houden tijdens het flippen. DIT WORDT VERANDERD IN SJOERDS DEEL (NAAM CONTROLEREN)
 
-// waardes die komen van Charlotte: true is aangespannen, false is niet aangespannen
-volatile bool BicepsLinks = true;
+// waardes die komen van Charlotte: true is aangespannen, false is niet aangespannen    (NAAM CONTROLEREN)
+volatile bool BicepsLinks = false;
 volatile bool BicepsRechts = true;
-volatile bool Been = true;
+volatile bool Been = false;
+
+// nodig voor het switchstatement
+enum states {Flipper, Links, Rechts, Voor, Achter, GeenSignaal};
+states MyState = Links;
+
+// het bepalen van welke case we hebben
+void CaseBepalen () {
+    if (BicepsLinks==true && BicepsRechts==true && Been==true && BezigMetFlippen == false) {   
+        MyState = Flipper;      // flipper bewegen
+    }
+    else if (BicepsLinks==true && BicepsRechts==false && Been==false && BezigMetFlippen == false) {
+        MyState = Links;        // naar links bewegen
+    }
+    else if (BicepsLinks==false && BicepsRechts==true && Been==false && BezigMetFlippen == false) {
+        MyState = Rechts;       // naar rechts bewegen
+    }
+    else if (BicepsLinks==true && BicepsRechts==true && Been==false && BezigMetFlippen == false) {
+        MyState = Voor;         // naar voren bewegen
+    }
+    else if (BicepsLinks==false && BicepsRechts==true && Been==true && BezigMetFlippen == false) {
+        MyState = Achter;       // naar achter bewegen
+    }
+    else if (BicepsLinks==false && BicepsRechts==false && Been==false || BezigMetFlippen==true) {
+        MyState = GeenSignaal;
+    }
+}    
 
 // het berekenen van de nieuwe x en y en zorgen dat deze niet buiten het bereik komen
 void VeranderenXY () {
-    // de beweging
-    if (BicepsLinks==true && BicepsRechts==true && Been==true) {   
-        FlipperAan = true;  // flipper aan        
-    }
-    else if (BicepsLinks==true && BicepsRechts==false && Been==false) {
-        x = x - step;       // naar links
+        // bepalen hoe de x en y waardes gaan veranderen
+    switch(MyState) {
+        case Flipper :
+            BeginnenMetFlippen = true;     // we zijn aan het flipper dus geen andere dingen doen
+            break;
+        case Links : 
+            vorigex = x;    // ervoor zorgen dat als de motor te ver draait de x niet verder telt
+            x = x - Step;
+            break;
+        case Rechts :
+            vorigex = x;
+            x = x + Step;
+            break;
+        case Voor :
+            vorigey = y;    // ervoor zorgen dat als de motor te ver draait de y niet verder telt
+            y = y + Step;
+            break;
+        case Achter :
+            vorigey = y;
+            y = y - Step;
+            break;
+        case GeenSignaal :
+            break;
+        default :
+            pc.printf("Er is geen verandering in x en y\r\n");
     }
-    else if (BicepsLinks==false && BicepsRechts==true && Been==false) {
-        x = x + step;       // naar rechts
-    }
-    else if (BicepsLinks==true && BicepsRechts==true && Been==false) {
-        y = y + step;       // naar voren
-    }
-    else if (BicepsLinks==false && BicepsRechts==true && Been==true) {
-        y = y - step;       // naar achter
-    }
-    
+            
     // Grenswaardes     LET OP: ARMEN MISSCHIEN GEBLOKKEERD DOOR BALK AAN DE BINNENKANT
     if (x > 200) {
         x = 200;
@@ -63,8 +109,8 @@
     else if (x < -200) {
         x = -200;
     }
-    if (y > 300) {
-        y = 300;
+    if (y > 306) {
+        y = 306;
     }
     else if (y < 50) {
         y = 50;         // GOKJE, UITPROBEREN
@@ -105,10 +151,22 @@
     else {  // als x=a
         MotorHoek2 = 0.5f*pi - acos(Dia1/Bar);
     }
+    
+    // limiten (als de hoek te groot wordt, reset dan de hoek en de x en y waardes)
+    if (MotorHoek1 >= MaxHoek) {    // is de maximale hoek in radialen
+        MotorHoek1 = VorigeHoek1;
+        x = vorigex;
+        y = vorigey;
+    }    
+    if (MotorHoek2 >= MaxHoek) {
+        MotorHoek2 = VorigeHoek2;
+        x = vorigex;
+        y = vorigey;
+    }
     //pc.printf("MotorHoek1 = %f en MotorHoek2 = %f \r\n", MotorHoek1, MotorHoek2);
 }        
 
-// het verschil uitrekenen tussen waar we zijn en waar we heen willen
+// het verschil uitrekenen tussen waar we zijn en waar we heen willen       OVERLAP MET SJOERD
 void BerekenenBewegingsHoek () {
     // Hoek 1: grootte beweging en richting
     BewegingsHoek1 = VorigeHoek1 - MotorHoek1;
@@ -132,18 +190,34 @@
     //pc.printf("Beweging 1 = %f, Beweging 2 = %f\r\n", BewegingsHoek1, BewegingsHoek2);
 }  
 
+// als BeginnenMetFlippen aan staat voeren we deze functie uit. Zolang deze bezig is is BezigMetFlippen true
 void FlipperBewegen () {
-    if (FlipperAan) {   // als FlipperAan is true dan de beweging gaan maken
-        pc.printf("De flipper moet bewegen\r\n");
+    if (BeginnenMetFlippen == true) {
+        // SJOERDS DEEL 
     }
-    else {              // als FlipperUit dan doe niks
+    else {      // als BezigMetFlippen == false dan doe niks
     }
 }
+
+// als de button ingedrukt wordt dan stoppen we met calibreren        
+void ButtonIndrukken () {
+        BezigMetCalibreren = false;
+}        
         
 int main() {
     pc.baud(SERIAL_BAUD);
     pc.printf("\r\n Nieuwe code uitproberen :) \r\n");
     
+    // calibreren gebeurt hier, zodat de tickers nog niet lopen en dit dus geen rekenkracht kost en je niet gebonden bent aan tijden
+    // we gaan door met calibreren tot we de button indrukken
+    while (BezigMetCalibreren == true) {
+        // potmeter dingen aanpassen
+        
+        pc.printf("calibreren is bezig\r\n");
+        Button1.fall(&ButtonIndrukken);
+    }
+    
+    TickerCaseBepalen.attach(&CaseBepalen, 1);                      // ticker om te bepalen welke case we gaan gebruiken
     TickerVeranderenXY.attach(&VeranderenXY,1);                     // ticker voor het veranderen van de x en y waardes
     TickerAfstandBerekenen.attach(&AfstandBerekenen,1);             // ticker om de waardes van dia1 en dia 2 te berekenen
     TickerMotorHoekBerekenen.attach(&MotorHoekBerekenen,1);         // ticker om de motorhoek te berekenen