Dependencies:   Farbsensor IRSensorLib PID_Control Servo mbed PixyLib

Revision:
12:472b26872a42
Parent:
10:10bcb7fee9a6
Child:
14:bee8101aad45
--- a/Fahren.cpp	Sat May 20 12:02:51 2017 +0000
+++ b/Fahren.cpp	Sat May 20 21:47:11 2017 +0000
@@ -4,197 +4,182 @@
 #include "Fahren.h"
 
 
-
-Fahren::Fahren(DigitalOut* enable, DigitalOut* bit0, DigitalOut* bit1, DigitalOut* bit2, AnalogIn* distance, DigitalOut* enableMotorDriver, PwmOut& _pwmLeft, PwmOut& _pwmRight, Pixy& _pixy, PID_Control& _pid, Button& _onoff) : pwmLeft(_pwmLeft), pwmRight(_pwmRight), pixy(_pixy),  pid(_pid), onoff(_onoff)
+//Konstruktor
+Fahren::Fahren(DigitalOut& _enable, DigitalOut& _bit0, DigitalOut& _bit1, DigitalOut& _bit2, AnalogIn& _distance, DigitalOut& _enableMotorDriver, PwmOut& _pwmLeft, PwmOut& _pwmRight, Pixy& _pixy, PID_Control& _pid, Button& _onoff) : enable(_enable), bit0(_bit0), bit1(_bit1), bit2(_bit2), distance(_distance), enableMotorDriver(_enableMotorDriver), pwmLeft(_pwmLeft), pwmRight(_pwmRight), pixy(_pixy),  pid(_pid), onoff(_onoff)
 {
-    init(enable, bit0, bit1, bit2, distance, enableMotorDriver);
-}
-
-//Fahren::Fahren() {}
-
-/**
- * Deletes the IRSensor object.
- */
-Fahren::~Fahren() {}
-
-void Fahren::init(DigitalOut* enable, DigitalOut* bit0, DigitalOut* bit1, DigitalOut* bit2, AnalogIn* distance, DigitalOut* enableMotorDriver)
-{
-    this->enable = enable;
-    this->bit0 = bit0;
-    this->bit1 = bit1;
-    this->bit2 = bit2;
-    this->distance = distance;
-    this->enableMotorDriver = enableMotorDriver;
     state = 0;
     e = 0.0;
     diff = 0.0;
-    
-
 }
 
+//Destruktor
+Fahren::~Fahren() {}
+
+//Methoden
 void Fahren::setSerialOutput(Serial *pc)
 {
     this->pc = pc;
 }
 
-int Fahren::getState()
+void Fahren::printState()
 {
-    return state;
+    if(pc) {
+        switch (state) {
+            case gerade:
+                pc->printf("Gerade\n\r");
+                break;
+            case cam:
+                pc->printf("Kamerafahrt\n\r");
+                break;
+            case rechts:
+                pc->printf("Rechts\n\r");
+                break;
+            case links:
+                pc->printf("Links\n\r");
+                break;
+            case drehen_ran:
+                pc->printf("Drehen Random\n\r");
+                break;
+            case drehen_l:
+                pc->printf("Drehen Links\n\r");
+                break;
+            case drehen_r:
+                pc->printf("Drehen Rechts\n\r");
+                break;
+            case zurueck:
+                pc->printf("Gerade Zurueck\n\r");
+                break;
+            case zurueck_l:
+                pc->printf("Links Zurueck\n\r");
+                break;
+            case zurueck_r:
+                pc->printf("Rechts Zurueck\n\r");
+                break;
+            case hart_zurueck_r:
+                pc->printf("Rechts Hart-Zurueck\n\r");
+                break;
+            case hart_zurueck_l:
+                pc->printf("Links Hart-Zurueck\n\r");
+                break;
+        }
+    }
 }
 
+
 void Fahren::fahrInit()
-{ 
+{
     pwmLeft = 0.5;
     pwmRight = 0.5;
 
     for( int ii = 0; ii<6; ++ii) {
-        sensors[ii].init(distance, bit0, bit1, bit2, ii);
-
-        enable->write(1);
-
-
+        sensors[ii].init(&distance, &bit0, &bit1, &bit2, ii);
+        enable=1;
         pwmLeft.period(0.00005);
         pwmRight.period(0.00005);
-
-        enableMotorDriver->write(1);
+        enableMotorDriver=1;
     }
 }
 
 void Fahren::fahrRutine()
 {
-    
+    //Wenn Userbutton nicht Null ist soll er fahren
     if (onoff.getState() != 0) {
         //pc->printf("left:%f\n\r", sensors[5].read());
-    
-    if(sensors[0]<=0.1 && sensors[1]<=0.12 && sensors[5]<=0.12) {
-        //wenn hinten rechts => leichte linkskurve
-        if(sensors[2]<=0.25) {
-            pwmLeft = 0.35;
-            pwmRight = 0.55;
-            if (pc) {
-                pc->printf("zurueck-rechtskurve\n");
+
+        //Alle Sensoren genügend abstand -> Kamerafahrt
+        if (sensors[0]>0.25 && sensors[1]>0.22 && sensors[2]>0.25 && sensors[4]>0.25 && sensors[5]>0.22) {
+            if (pixy.getX()>=5 && pixy.getX()<=315) {
+                e = 160-pixy.getX();
+                diff = pid.calc( e, 0.005f );
+                //pwmLeft = 0.65 - diff;
+                //pwmRight = 0.35 - diff;
+                pwmLeft = 0.5f - diff;
+                pwmRight = 0.5f - diff;
+                state = cam;
+            } else {
+                //pwmLeft = 0.65;
+                //pwmRight = 0.35;
+                pwmLeft = 0.5f;
+                pwmRight = 0.5f;
+                state = gerade;
             }
-            state=zurueck_l;
-        }
+        } else {
+
+            //Front Links und Recht prüfen ob viel zu nahe
+            if (sensors[1]<=wand || sensors[5]<=wand) {
+                if(sensors[1]<=wand) {
+                    pwmLeft = 0.45;
+                    pwmRight = 0.65;
+                    state = hart_zurueck_r;
+                } else {
+                    pwmLeft = 0.35;
+                    pwmRight = 0.55;
+                    state = hart_zurueck_l;
+                }
+                wait(0.8);
+            }
 
-        if(sensors[4]<=0.25) {
-            pwmLeft = 0.45;
-            pwmRight = 0.65;
-            if (pc) {
-                pc->printf("zurueck-linkskurve\n");
+            //Kontrolle ob zurückgefahren werden muss
+            else if (sensors[0]<=0.1 && sensors[1]<=0.12 && sensors[5]<=0.12) {
+                if(sensors[2]<=0.25) {
+                    pwmLeft = 0.35;
+                    pwmRight = 0.55;
+                    state=zurueck_l;
+                } else if(sensors[4]<=0.25) {
+                    pwmLeft = 0.45;
+                    pwmRight = 0.65;
+                    state=zurueck_r;
+                } else {
+                    pwmLeft = 0.4;
+                    pwmRight = 0.6;
+                    state=zurueck;
+                }
             }
-            state=zurueck_r;
-        }
-        if(sensors[4]>0.25 && sensors[2]>0.25) {
-            pwmLeft = 0.4;
-            pwmRight = 0.6;
-            state=zurueck;
-            if (pc) {
-                pc->printf("zurueck-gerade\n");
+
+            //Kontrolle ob gedreht werden muss
+            else if(sensors[0]<0.25) {
+                if(sensors[1]<=wenden) {
+                    //Drehen Links
+                    pwmLeft = 0.3;
+                    pwmRight = 0.3;
+                    state = drehen_l;
+                } else if(sensors[5]<=wenden) {
+                    //Drehen Rechts
+                    pwmLeft = 0.7;
+                    pwmRight = 0.7;
+                    state = drehen_r;
+                } else {
+                    //Random Drehen
+                    if (rand()%2==0 && state != drehen_ran) {
+                        pwmLeft = 0.3;
+                        pwmRight = 0.3;
+                    } else if (rand()%2 != 0 && state != drehen_ran) {
+                        pwmLeft = 0.7;
+                        pwmRight = 0.7;
+                    }
+                    state=drehen_ran;
+                }
+            }
+
+            //Rechtsfahren
+            else if(sensors[5]<=wenden && sensors[5] >= 0.08) {
+                pwmLeft = 0.65;
+                pwmRight = 0.45;
+                state=rechts;
+            }
+
+            //Linksfahren
+            else if(sensors[1]<=wenden && sensors[1] >= 0.08) {
+                pwmLeft = 0.55;
+                pwmRight = 0.35;
+                state=links;
             }
         }
     }
-    if(sensors[5] <= wand) {
-        
-        pwmLeft = 0.35;
-        pwmRight = 0.55;
-        wait(0.8);
-    }
-    if (sensors[1] <= wand){
-        pwmLeft = 0.45;
-        pwmRight = 0.65;
-        wait(0.8);
-        }
 
-
-    //plötzlicher Wand anschlag    ***************************************
-    /* else if(sensors[1] <= wand){
-         notfall1=1;
-         pwmLeft = 0.3;
-         pwmRight = 0.3;
-         if (pc) {
-             pc->printf("Notfall links drehen");}
-     }
-
-     else if(sensors[5] <= wand){
-         notfall1=2;
-         pwmLeft = 0.7;
-         pwmRight = 0.7;
-         if (pc) {
-             pc->printf("Notfall rechts drehen");}
-     }
-    */
-
-
-    // Wenn Front etwas sehen => drehen***********************************
-
-    else if(sensors[0]<0.25 && sensors [1]<=wenden) {
-        pwmLeft = 0.3;
-        pwmRight = 0.3;
-        if (pc) {
-            pc->printf("drehen links\n\n\n");
-        }
-    }
-
-    else if (sensors[0]<0.25 && sensors [5]<=wenden) {
-        pwmLeft = 0.7;
-        pwmRight = 0.7;
-        if (pc) {
-            pc->printf("drehen rechts\n\n\n");
-        }
-    }
-
-    else if(sensors[0]<0.25) {
-        if (rand()%2==0 && state != drehen) {
-            pwmLeft = 0.3;
-            pwmRight = 0.3;
-            if (pc) {
-                pc->printf("random drehen\n\n\n");
-            }
-        } else if (rand()%2 != 0 && state != drehen) {
-            pwmLeft = 0.7;
-            pwmRight = 0.7;
-            if (pc) {
-              pc->printf("random drehen\n\n\n");
-            }
-        }
-
-        state=drehen;
-    }
-    //Wenn Front-Left etwas sehen => nach Rechts**************************
-    else if(sensors[1] >= 0.08 && (sensors[5]<=wenden && sensors[5] >= 0.08)) {
-        if (pc) {
-            pc->printf("rechts\n");
-        }
-        pwmLeft = 0.65;
-        pwmRight = 0.45;
-        state=rechts;
-    }
-
-    // Wenn Front-Right etwas sehen => Links*******************************
-    else if(sensors[5] >= 0.08 && (sensors[1]<=wenden && sensors[1] >= 0.08)) {
-        if(pc) {
-            pc->printf("Links\n");
-        }
-        pwmLeft = 0.55;
-        pwmRight = 0.35;
-        state=links;
-    }
-
-    //Wenn kein Sensor anspricht => PixyCam wird abgerufen*****************************
-    else if(sensors[0]>=0.26) {
-        if (pixy.getX()>=5 && pixy.getX()<=215){
-            e = 160-pixy.getX();
-            diff = pid.calc( e, 0.005f );
-            pwmLeft = 0.65 - diff;
-            pwmRight = 0.35 - diff;
-        } else {
-            pwmLeft = 0.65;
-            pwmRight = 0.35;
-        }
-    }
-    } else {
+    //Userbutton ist Null also HALTEN!!
+    else {
         pwmLeft = 0.5;
         pwmRight = 0.5;
     }
-}
\ No newline at end of file
+}