Sfoglia il codice sorgente

Added Filters for Proximity and Line Sensor Values; Solved Problem with Function TimeUpdate

fstange 6 anni fa
parent
commit
eba4788a84
47 ha cambiato i file con 3014 aggiunte e 2761 eliminazioni
  1. BIN
      ArduinoOutput/Hauptprojekt.ino.elf
  2. 1367 1295
      ArduinoOutput/Hauptprojekt.ino.hex
  3. 1367 1295
      ArduinoOutput/Hauptprojekt.ino.with_bootloader.hex
  4. BIN
      ArduinoOutput/core/CDC.cpp.o
  5. BIN
      ArduinoOutput/core/HardwareSerial.cpp.o
  6. BIN
      ArduinoOutput/core/HardwareSerial0.cpp.o
  7. BIN
      ArduinoOutput/core/HardwareSerial1.cpp.o
  8. BIN
      ArduinoOutput/core/HardwareSerial2.cpp.o
  9. BIN
      ArduinoOutput/core/HardwareSerial3.cpp.o
  10. BIN
      ArduinoOutput/core/IPAddress.cpp.o
  11. BIN
      ArduinoOutput/core/PluggableUSB.cpp.o
  12. BIN
      ArduinoOutput/core/Print.cpp.o
  13. BIN
      ArduinoOutput/core/Stream.cpp.o
  14. BIN
      ArduinoOutput/core/Tone.cpp.o
  15. BIN
      ArduinoOutput/core/USBCore.cpp.o
  16. BIN
      ArduinoOutput/core/WInterrupts.c.o
  17. BIN
      ArduinoOutput/core/WMath.cpp.o
  18. BIN
      ArduinoOutput/core/WString.cpp.o
  19. BIN
      ArduinoOutput/core/abi.cpp.o
  20. BIN
      ArduinoOutput/core/core.a
  21. BIN
      ArduinoOutput/core/hooks.c.o
  22. BIN
      ArduinoOutput/core/main.cpp.o
  23. BIN
      ArduinoOutput/core/new.cpp.o
  24. BIN
      ArduinoOutput/core/wiring.c.o
  25. BIN
      ArduinoOutput/core/wiring_analog.c.o
  26. BIN
      ArduinoOutput/core/wiring_digital.c.o
  27. BIN
      ArduinoOutput/core/wiring_pulse.c.o
  28. BIN
      ArduinoOutput/core/wiring_shift.c.o
  29. 16 0
      ArduinoOutput/libraries/MedianFilter/MedianFilter.cpp.d
  30. BIN
      ArduinoOutput/libraries/MedianFilter/MedianFilter.cpp.o
  31. BIN
      ArduinoOutput/libraries/Wire/Wire.cpp.o
  32. BIN
      ArduinoOutput/libraries/Wire/utility/twi.c.o
  33. BIN
      ArduinoOutput/libraries/Zumo32U4/L3G.cpp.o
  34. BIN
      ArduinoOutput/libraries/Zumo32U4/LSM303.cpp.o
  35. BIN
      ArduinoOutput/libraries/Zumo32U4/PololuBuzzer.cpp.o
  36. BIN
      ArduinoOutput/libraries/Zumo32U4/PololuHD44780.cpp.o
  37. BIN
      ArduinoOutput/libraries/Zumo32U4/Pushbutton.cpp.o
  38. BIN
      ArduinoOutput/libraries/Zumo32U4/QTRSensors.cpp.o
  39. BIN
      ArduinoOutput/libraries/Zumo32U4/Zumo32U4Encoders.cpp.o
  40. BIN
      ArduinoOutput/libraries/Zumo32U4/Zumo32U4IRPulses.cpp.o
  41. BIN
      ArduinoOutput/libraries/Zumo32U4/Zumo32U4Motors.cpp.o
  42. BIN
      ArduinoOutput/libraries/Zumo32U4/Zumo32U4ProximitySensors.cpp.o
  43. 107 71
      ArduinoOutput/preproc/ctags_target_for_gcc_minus_e.cpp
  44. 88 60
      ArduinoOutput/sketch/Hauptprojekt.ino.cpp
  45. 2 1
      ArduinoOutput/sketch/Hauptprojekt.ino.cpp.d
  46. BIN
      ArduinoOutput/sketch/Hauptprojekt.ino.cpp.o
  47. 67 39
      Zumo32U4/Hauptprojekt/Hauptprojekt.ino

BIN
ArduinoOutput/Hauptprojekt.ino.elf


File diff suppressed because it is too large
+ 1367 - 1295
ArduinoOutput/Hauptprojekt.ino.hex


File diff suppressed because it is too large
+ 1367 - 1295
ArduinoOutput/Hauptprojekt.ino.with_bootloader.hex


BIN
ArduinoOutput/core/CDC.cpp.o


BIN
ArduinoOutput/core/HardwareSerial.cpp.o


BIN
ArduinoOutput/core/HardwareSerial0.cpp.o


BIN
ArduinoOutput/core/HardwareSerial1.cpp.o


BIN
ArduinoOutput/core/HardwareSerial2.cpp.o


BIN
ArduinoOutput/core/HardwareSerial3.cpp.o


BIN
ArduinoOutput/core/IPAddress.cpp.o


BIN
ArduinoOutput/core/PluggableUSB.cpp.o


BIN
ArduinoOutput/core/Print.cpp.o


BIN
ArduinoOutput/core/Stream.cpp.o


BIN
ArduinoOutput/core/Tone.cpp.o


BIN
ArduinoOutput/core/USBCore.cpp.o


BIN
ArduinoOutput/core/WInterrupts.c.o


BIN
ArduinoOutput/core/WMath.cpp.o


BIN
ArduinoOutput/core/WString.cpp.o


BIN
ArduinoOutput/core/abi.cpp.o


BIN
ArduinoOutput/core/core.a


BIN
ArduinoOutput/core/hooks.c.o


BIN
ArduinoOutput/core/main.cpp.o


BIN
ArduinoOutput/core/new.cpp.o


BIN
ArduinoOutput/core/wiring.c.o


BIN
ArduinoOutput/core/wiring_analog.c.o


BIN
ArduinoOutput/core/wiring_digital.c.o


BIN
ArduinoOutput/core/wiring_pulse.c.o


BIN
ArduinoOutput/core/wiring_shift.c.o


+ 16 - 0
ArduinoOutput/libraries/MedianFilter/MedianFilter.cpp.d

@@ -0,0 +1,16 @@
+c:\Users\Carolin\Downloads\VSCode\Zumo32U4\ArduinoOutput\libraries\MedianFilter\MedianFilter.cpp.o: \
+ C:\Users\Carolin\Documents\Arduino\libraries\MedianFilter\MedianFilter.cpp \
+ C:\Users\Carolin\Documents\Arduino\libraries\MedianFilter\MedianFilter.h \
+ C:\Users\Carolin\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.20\cores\arduino/Arduino.h \
+ C:\Users\Carolin\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.20\cores\arduino/binary.h \
+ C:\Users\Carolin\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.20\cores\arduino/WCharacter.h \
+ C:\Users\Carolin\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.20\cores\arduino/WString.h \
+ C:\Users\Carolin\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.20\cores\arduino/HardwareSerial.h \
+ C:\Users\Carolin\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.20\cores\arduino/Stream.h \
+ C:\Users\Carolin\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.20\cores\arduino/Print.h \
+ C:\Users\Carolin\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.20\cores\arduino/Printable.h \
+ C:\Users\Carolin\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.20\cores\arduino/USBAPI.h \
+ C:\Users\Carolin\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.20\cores\arduino/Arduino.h \
+ C:\Users\Carolin\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.20\cores\arduino/USBDesc.h \
+ C:\Users\Carolin\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.20\cores\arduino/USBCore.h \
+ C:\Users\Carolin\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.20\variants\leonardo/pins_arduino.h

BIN
ArduinoOutput/libraries/MedianFilter/MedianFilter.cpp.o


BIN
ArduinoOutput/libraries/Wire/Wire.cpp.o


BIN
ArduinoOutput/libraries/Wire/utility/twi.c.o


BIN
ArduinoOutput/libraries/Zumo32U4/L3G.cpp.o


BIN
ArduinoOutput/libraries/Zumo32U4/LSM303.cpp.o


BIN
ArduinoOutput/libraries/Zumo32U4/PololuBuzzer.cpp.o


BIN
ArduinoOutput/libraries/Zumo32U4/PololuHD44780.cpp.o


BIN
ArduinoOutput/libraries/Zumo32U4/Pushbutton.cpp.o


BIN
ArduinoOutput/libraries/Zumo32U4/QTRSensors.cpp.o


BIN
ArduinoOutput/libraries/Zumo32U4/Zumo32U4Encoders.cpp.o


BIN
ArduinoOutput/libraries/Zumo32U4/Zumo32U4IRPulses.cpp.o


BIN
ArduinoOutput/libraries/Zumo32U4/Zumo32U4Motors.cpp.o


BIN
ArduinoOutput/libraries/Zumo32U4/Zumo32U4ProximitySensors.cpp.o


+ 107 - 71
ArduinoOutput/preproc/ctags_target_for_gcc_minus_e.cpp

@@ -1,19 +1,29 @@
 # 1 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 # 1 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 //Verfassser: Felix Stange, 4056379, MET2016 
-//Datum: erstellt am 19.07.2017, zuletzt geändert am 04.05.2018 
-//Projektbeschreibung: Der Zumo fährt automatisch zwischen 2 Linien ohne diese zu überfahren mithilfe 
-//der Liniensensoren (3), ähnlich einer Spurhalteautomatik (heller Belag und dunkle Streifen). 
-//Außerdem werden Kollisionen verhindert durch Nutzung der vorderen Abstandssensoren. Kommt es 
-//dennoch zu einer Kollision, wird diese durch den Beschleunigungssensor (LSM303) erkannt. 
-//Für den Überholvorgang werden die seitlichen Abstandssensoren und der Drehbewegungssensor (L3G) 
-//genutzt. Mithilfe der Quadraturencoder in den Motoren können Wegstrecken vermessen werden. 
-//Der Zumo kommuniziert über ein Bluetooth-Modul (HC-05) mit anderen Geräten. Die 
-//Kommunikation erfolgt seriell ('SERIAL' für USB, 'SERIAL1' für Bluetooth). 
-//Das LCD kann bei Bluetoothnutzung nicht verwendet werden. 
-
-# 14 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino" 2
+//Datum: erstellt am 19.07.2017, zuletzt geändert am 08.05.2018 
+//Projektthema: Untersuchungen und Implementierung eines automatisierten Fahrens mittels Pololu Zumo
+/*Kurzbeschreibung: Der Zumo fährt automatisch zwischen 2 Linien ohne diese zu überfahren mithilfe 
+
+der Liniensensoren (3), ähnlich einer Spurhalteautomatik (heller Belag und dunkle Streifen). 
+
+Außerdem werden Kollisionen verhindert durch Nutzung der vorderen Abstandssensoren. Kommt es 
+
+dennoch zu einer Kollision, wird diese durch den Beschleunigungssensor (LSM303) erkannt. 
+
+Für den Überholvorgang werden die seitlichen Abstandssensoren und der Drehbewegungssensor (L3G) 
+
+genutzt. Mithilfe der Quadraturencoder in den Motoren können Wegstrecken vermessen werden. 
+
+Für die Filterung der Messwerte werden Medianfilter genutzt. Der Zumo kommuniziert über ein 
+
+Bluetooth-Modul (HC-05) mit anderen Geräten. Die Kommunikation erfolgt seriell ('SERIAL' für USB, 
+
+'SERIAL1' für Bluetooth). Das LCD kann bei Bluetoothnutzung nicht verwendet werden.*/
+# 14 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 # 15 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino" 2
+# 16 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino" 2
+# 17 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino" 2
 
 Zumo32U4ProximitySensors proxSensors; //Abstandssensoren
 Zumo32U4LineSensors lineSensors; //Liniensensoren
@@ -22,7 +32,15 @@ Zumo32U4ButtonA buttonA; //Taste A
 Zumo32U4Encoders encoders; //Motorencoder
 LSM303 compass; //Beschleunigungssensor x-Achse
 L3G gyro; //Drehbewegungssensor z-Achse
-# 38 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
+
+MedianFilter LineFilter0(3, 0); //erstellen der Filter für Liniensensoren
+MedianFilter LineFilter1(3, 0); //Medianfilter geben mittleren Wert einer Reihe aus
+MedianFilter LineFilter2(3, 0); //Fenstergröße: 3, Basiswerte: 0 0 0
+MedianFilter ProxFilter0(3, 0); //erstellen der Filter für Abstandssensoren
+MedianFilter ProxFilter1(3, 0);
+MedianFilter ProxFilter2(3, 0);
+MedianFilter ProxFilter3(3, 0);
+# 48 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 int16_t lineValue[3]; //Liniensensoren
 uint16_t lineOffset[3]; //von links (0) nach rechts (2)
 
@@ -71,8 +89,8 @@ void LineSetup()
   uint32_t total[3] = {0, 0, 0};
   for(uint8_t i = 0; i < 120; i++)
   {
-    if (i > 30 && i <= 90) motors.setSpeeds(106, -100);
-    else motors.setSpeeds(-106, 100);
+    if (i > 30 && i <= 90) motors.setSpeeds(104, -100);
+    else motors.setSpeeds(-104, 100);
     lineSensors.read(lineOffset);
     total[0] += lineOffset[0];
     total[1] += lineOffset[1];
@@ -240,20 +258,20 @@ void LoopTiming()
 void ProxUpdate()
 {
   proxSensors.read();
-  proxValue[0] = proxSensors.countsLeftWithLeftLeds();
-  proxValue[1] = proxSensors.countsFrontWithLeftLeds();
-  proxValue[2] = proxSensors.countsFrontWithRightLeds();
-  proxValue[3] = proxSensors.countsRightWithRightLeds();
+  proxValue[0] = ProxFilter0.in(proxSensors.countsLeftWithLeftLeds());
+  proxValue[1] = ProxFilter1.in(proxSensors.countsFrontWithLeftLeds());
+  proxValue[2] = ProxFilter2.in(proxSensors.countsFrontWithRightLeds());
+  proxValue[3] = ProxFilter3.in(proxSensors.countsRightWithRightLeds());
 }
 
 //Update Liniensensoren
 void LineUpdate()
 {
   uint16_t lineRaw[3];
-  lineSensors.read(lineRaw);
-  lineValue[0] = lineRaw[0] - lineOffset[0];
-  lineValue[1] = lineRaw[1] - lineOffset[1];
-  lineValue[2] = lineRaw[2] - lineOffset[2];
+  lineSensors.read(lineRaw); //lese Messwerte der Liniensensoren aus
+  lineValue[0] = LineFilter0.in(lineRaw[0] - lineOffset[0]); //ziehe Offsetwerte von Messwerten ab und gib diese in Filter ein
+  lineValue[1] = LineFilter1.in(lineRaw[1] - lineOffset[1]); //erhält neue mittlere Werte der Filter
+  lineValue[2] = LineFilter2.in(lineRaw[2] - lineOffset[2]); //"LineFilter.out" um gefilterte Werte auszugeben ohne neue Werte einzugeben
 }
 
 //Update Drehbewegungssensor
@@ -304,7 +322,7 @@ void Kontaktvermeiden()
   while(proxValue[1] == 0 || proxValue[2] == 0)
   {
     ProxUpdate();
-    motors.setSpeeds(-53, -50);
+    motors.setSpeeds(-52, -50);
     if(lineValue[0] > 150 || lineValue[2] > 120) break;
   }
   motors.setSpeeds(0, 0);
@@ -324,11 +342,18 @@ void Hindernisumfahren()
   turnAngle = 0;
   rotationAngle = 0;
   GyroUpdate();
+  while(rotationAngle < 20)
+  {
+    GyroUpdate();
+    LineUpdate();
+    motors.setSpeeds(26, 100);
+  }
+  GyroUpdate();
   while(rotationAngle < 45)
   {
     GyroUpdate();
     LineUpdate();
-    motors.setSpeeds(27, 100);
+    motors.setSpeeds(26, 100);
     if(lineValue[2] > 120 && lineValue[2] < 500) break;
   }
   //geradeaus über Mittellinie fahren
@@ -336,7 +361,7 @@ void Hindernisumfahren()
   while(lineValue[2] < 120)
   {
     LineUpdate();
-    motors.setSpeeds(106, 100);
+    motors.setSpeeds(104, 100);
     //if(lineValue[0] > MARKLINE0) break;
   }
   //rechts drehen
@@ -345,12 +370,12 @@ void Hindernisumfahren()
   {
     GyroUpdate();
     LineUpdate();
-    if(lineValue[0] > 150 && lineValue[0] < 500) motors.setSpeeds(106, 0);
-    else if(lineValue[2] > 120 && lineValue[2] < 500) motors.setSpeeds(106, 100);
-    else motors.setSpeeds(106, 25);
+    if(lineValue[0] > 150 && lineValue[0] < 500) motors.setSpeeds(104, 0);
+    else if(lineValue[2] > 120 && lineValue[2] < 500) motors.setSpeeds(104, 100);
+    else motors.setSpeeds(104, 25);
   }
   //geradeaus fahren
-  motors.setSpeeds(106, 100);
+  motors.setSpeeds(104, 100);
 
   //Gegenverkehr beachten
   ProxUpdate();
@@ -359,14 +384,16 @@ void Hindernisumfahren()
     //Schritt 2: Hindernis passieren
     //Serial1.println("Aufholen"); 
     lastUpdate = millis();
-    while(proxValue[3] < 6 && eventTime < 3000)
+    while(proxValue[3] < 6)
     {
-      TimeUpdate();
       ProxUpdate();
       LineUpdate();
       Spurhalten();
+      TimeUpdate();
+      //Serial1.println(eventTime);
+      if(eventTime > 3000) break;
     }
-    //Serial1.println("Überholen"); 
+    //Serial1.println("Vorbeifahren"); 
     ProxUpdate();
     while(proxValue[3] == 6)
     {
@@ -379,10 +406,10 @@ void Hindernisumfahren()
     TimeUpdate();
     while(eventTime < 3000)
     {
-      //Serial1.println(eventTime); 
-      TimeUpdate();
       LineUpdate();
       Spurhalten();
+      TimeUpdate();
+      //Serial1.println(eventTime);
     }
   //}
 
@@ -391,11 +418,18 @@ void Hindernisumfahren()
   turnAngle = 0;
   rotationAngle = 0;
   GyroUpdate();
+  while(rotationAngle > -20)
+  {
+    GyroUpdate();
+    LineUpdate();
+    motors.setSpeeds(104, 25);
+  }
+  GyroUpdate();
   while(rotationAngle > -45)
   {
     GyroUpdate();
     LineUpdate();
-    motors.setSpeeds(106, 25);
+    motors.setSpeeds(104, 25);
     if(lineValue[0] > 150 && lineValue[0] < 500) break;
   }
   //geradeaus über Mittellinie fahren
@@ -403,7 +437,7 @@ void Hindernisumfahren()
   while(lineValue[0] < 150)
   {
     LineUpdate();
-    motors.setSpeeds(106, 100);
+    motors.setSpeeds(104, 100);
     //if(lineValue[0] > MARKLINE0) break;
   }
   //links drehen
@@ -413,13 +447,13 @@ void Hindernisumfahren()
     GyroUpdate();
     LineUpdate();
     if(lineValue[2] > 120 && lineValue[2] < 500) motors.setSpeeds(0, 100);
-    else if(lineValue[0] > 150 && lineValue[0] < 500) motors.setSpeeds(106, 100);
-    else motors.setSpeeds(27, 100);
+    else if(lineValue[0] > 150 && lineValue[0] < 500) motors.setSpeeds(104, 100);
+    else motors.setSpeeds(26, 100);
   }
   //geradeaus fahren
   //Serial1.println("Umfahren beendet");
   Serial1.print(0);
-  motors.setSpeeds(106, 100);
+  motors.setSpeeds(104, 100);
 }
 
 //Funktion Abbiegen
@@ -433,9 +467,9 @@ void Abbiegen()
   LineUpdate();
   bool leftCode; //links => 1
   bool rightCode; //rechts => 2
-  if((lineValue[0] > 500 && lineValue[0] < 1400) && (lineValue[1] > 300 && lineValue[1] < 700)) leftCode = true;
+  if((lineValue[0] > 500 && lineValue[0] < 1600) && (lineValue[1] > 300 && lineValue[1] < 800)) leftCode = true;
   else leftCode = false;
-  if((lineValue[2] > 500 && lineValue[2] < 1400) && (lineValue[1] > 300 && lineValue[1] < 700)) rightCode = true;
+  if((lineValue[2] > 500 && lineValue[2] < 1600) && (lineValue[1] > 300 && lineValue[1] < 800)) rightCode = true;
   else rightCode = false;
 
   //Zufallszahl erzeugen
@@ -458,19 +492,19 @@ void Abbiegen()
   {
     //Serial1.println("links Abbiegen von der Verbindungsstrecke"); 
     //geradeaus zur Mittellinie fahren
-    motors.setSpeeds(106, 100 +10);
+    motors.setSpeeds(104, 100 +10);
     lastUpdate = millis();
     TimeUpdate();
-    while(eventTime < 300)
+    while(eventTime < 1000)
     {
       TimeUpdate();
-      motors.setSpeeds(106, 100 +10);
+      motors.setSpeeds(104, 100 +10);
     }
     LineUpdate();
     while(lineValue[0] < 150 && lineValue[2] < 120)
     {
       LineUpdate();
-      motors.setSpeeds(106, 100);
+      motors.setSpeeds(104, 100);
     }
     //links drehen
     turnAngle = 0;
@@ -481,11 +515,11 @@ void Abbiegen()
       GyroUpdate();
       LineUpdate();
       if(lineValue[2] > 120 && lineValue[2] < 500) motors.setSpeeds(0, 100);
-      else if(lineValue[0] > 150 && lineValue[0] < 500) motors.setSpeeds(53, 100);
-      else motors.setSpeeds(27, 100);
+      else if(lineValue[0] > 150 && lineValue[0] < 500) motors.setSpeeds(52, 100);
+      else motors.setSpeeds(26, 100);
     }
     //geradeaus fahren
-    motors.setSpeeds(106, 100);
+    motors.setSpeeds(104, 100);
   }
 
   //links Abbiegen (vom Rundkurs)
@@ -501,7 +535,7 @@ void Abbiegen()
     {
       GyroUpdate();
       EncoderUpdate();
-      motors.setSpeeds(27, 100);
+      motors.setSpeeds(26, 100);
       //if(driveRotation[1] > 1) break;
     }
     driveRotation[1] = 0;
@@ -510,11 +544,11 @@ void Abbiegen()
     {
       GyroUpdate();
       EncoderUpdate();
-      motors.setSpeeds(27, 100);
+      motors.setSpeeds(26, 100);
       //if(driveRotation[1] > 1) break;
     }
     //geradeaus fahren
-    motors.setSpeeds(106, 100);
+    motors.setSpeeds(104, 100);
     lastUpdate = millis();
     TimeUpdate();
     while(eventTime < 1000)
@@ -547,7 +581,7 @@ void Abbiegen()
       GyroUpdate();
       EncoderUpdate();
       LineUpdate();
-      motors.setSpeeds(106, 25);
+      motors.setSpeeds(104, 25);
       if(lineValue[0] > 150 && lineValue[0] < 500) break;
     }
     GyroUpdate();
@@ -558,10 +592,10 @@ void Abbiegen()
       GyroUpdate();
       LineUpdate();
       if(eventTime > 3000) break;
-      if(lineValue[0] > 150 && lineValue[0] < 500) motors.setSpeeds(106, 0);
+      if(lineValue[0] > 150 && lineValue[0] < 500) motors.setSpeeds(104, 0);
       //else if(lineValue[1] > MARKLINE1 && lineValue[1] < SIGN1) motors.setSpeeds(-SLOWSPEEDLEFT, -SLOWSPEEDRIGHT);
-      else if(lineValue[2] > 120 && lineValue[2] < 500) motors.setSpeeds(106, 50);
-      else motors.setSpeeds(106, 25);
+      else if(lineValue[2] > 120 && lineValue[2] < 500) motors.setSpeeds(104, 50);
+      else motors.setSpeeds(104, 25);
     }
   }
 
@@ -569,7 +603,7 @@ void Abbiegen()
   else
   {
     //Serial1.println("nicht Abbiegen");
-    motors.setSpeeds(106, 100);
+    motors.setSpeeds(104, 100);
     lastUpdate = millis();
     TimeUpdate();
     while(eventTime < 1000)
@@ -586,17 +620,20 @@ void Abbiegen()
 //Funktion Spurhalten
 void Spurhalten()
 {
+  uint16_t StartTime = millis();
+  uint16_t Update = millis();
+  uint16_t Time = Update - StartTime;
+
   //linke Linie erreicht, nach rechts fahren
   if(lineValue[0] > 150 && lineValue[0] < 500)
   {
     ledYellow(1);
     //Serial1.println("Spur nach rechts korrigieren");  
-    motors.setSpeeds(106/eventSpeed, 25/eventSpeed);
-    lastUpdate = millis();
-    TimeUpdate();
-    while(eventTime < 100)
+    motors.setSpeeds(104/eventSpeed, 25/eventSpeed);
+    while(Time < 100)
     {
-      TimeUpdate();
+      Update = millis();
+      Time = Update - StartTime;
       LineUpdate();
       if(lineValue[2] > 120) break;
     }
@@ -607,12 +644,11 @@ void Spurhalten()
   {
     ledYellow(1);
     //Serial1.println("Spur nach links korrigieren");  
-    motors.setSpeeds(27/eventSpeed, 100/eventSpeed);
-    lastUpdate = millis();
-    TimeUpdate();
-    while(eventTime < 100)
+    motors.setSpeeds(26/eventSpeed, 100/eventSpeed);
+    while(Time < 100)
     {
-      TimeUpdate();
+      Update = millis();
+      Time = Update - StartTime;
       LineUpdate();
       if(lineValue[0] > 150) break;
     }
@@ -622,7 +658,7 @@ void Spurhalten()
   else
   {
     ledGreen(1);
-    motors.setSpeeds(106/eventSpeed, 100/eventSpeed);
+    motors.setSpeeds(104/eventSpeed, 100/eventSpeed);
   }
 }
 
@@ -637,7 +673,7 @@ void Spurfinden()
   {
     TimeUpdate();
     LineUpdate();
-    motors.setSpeeds(-106, -100);
+    motors.setSpeeds(-104, -100);
     if(eventTime > 3000) break;
   }
   //Serial1.println("Spur gefunden"); 
@@ -695,8 +731,8 @@ void loop()
     eventSpeed = 1.0;
     //if(abs(moveRate) > 1500 && eventTime > 1000) Kontaktvermeiden();           
     if(proxValue[1] == 6 && proxValue[2] == 6) Hindernisumfahren();
-    else if((lineValue[0] > 500 && lineValue[0] < 1400) && (lineValue[1] > 300 && lineValue[1] < 700)) Abbiegen();
-    else if((lineValue[2] > 500 && lineValue[2] < 1400) && (lineValue[1] > 300 && lineValue[1] < 700)) Abbiegen();
+    else if((lineValue[0] > 500 && lineValue[0] < 1600) && (lineValue[1] > 300 && lineValue[1] < 800)) Abbiegen();
+    else if((lineValue[2] > 500 && lineValue[2] < 1600) && (lineValue[1] > 300 && lineValue[1] < 800)) Abbiegen();
     else if(lineValue[1] > 100 && lineValue[1] < 300) Spurfinden();
     else Spurhalten();
   }

+ 88 - 60
ArduinoOutput/sketch/Hauptprojekt.ino.cpp

@@ -2,19 +2,21 @@
 #line 1 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 #line 1 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 //Verfassser: Felix Stange, 4056379, MET2016 
-//Datum: erstellt am 19.07.2017, zuletzt geändert am 04.05.2018 
-//Projektbeschreibung: Der Zumo fährt automatisch zwischen 2 Linien ohne diese zu überfahren mithilfe 
-//der Liniensensoren (3), ähnlich einer Spurhalteautomatik (heller Belag und dunkle Streifen). 
-//Außerdem werden Kollisionen verhindert durch Nutzung der vorderen Abstandssensoren. Kommt es 
-//dennoch zu einer Kollision, wird diese durch den Beschleunigungssensor (LSM303) erkannt. 
-//Für den Überholvorgang werden die seitlichen Abstandssensoren und der Drehbewegungssensor (L3G) 
-//genutzt. Mithilfe der Quadraturencoder in den Motoren können Wegstrecken vermessen werden. 
-//Der Zumo kommuniziert über ein Bluetooth-Modul (HC-05) mit anderen Geräten. Die 
-//Kommunikation erfolgt seriell ('SERIAL' für USB, 'SERIAL1' für Bluetooth). 
-//Das LCD kann bei Bluetoothnutzung nicht verwendet werden. 
+//Datum: erstellt am 19.07.2017, zuletzt geändert am 08.05.2018 
+//Projektthema: Untersuchungen und Implementierung eines automatisierten Fahrens mittels Pololu Zumo
+/*Kurzbeschreibung: Der Zumo fährt automatisch zwischen 2 Linien ohne diese zu überfahren mithilfe 
+der Liniensensoren (3), ähnlich einer Spurhalteautomatik (heller Belag und dunkle Streifen). 
+Außerdem werden Kollisionen verhindert durch Nutzung der vorderen Abstandssensoren. Kommt es 
+dennoch zu einer Kollision, wird diese durch den Beschleunigungssensor (LSM303) erkannt. 
+Für den Überholvorgang werden die seitlichen Abstandssensoren und der Drehbewegungssensor (L3G) 
+genutzt. Mithilfe der Quadraturencoder in den Motoren können Wegstrecken vermessen werden. 
+Für die Filterung der Messwerte werden Medianfilter genutzt. Der Zumo kommuniziert über ein 
+Bluetooth-Modul (HC-05) mit anderen Geräten. Die Kommunikation erfolgt seriell ('SERIAL' für USB, 
+'SERIAL1' für Bluetooth). Das LCD kann bei Bluetoothnutzung nicht verwendet werden.*/
 
 #include  <Wire.h>
 #include  <Zumo32U4.h>
+#include  <MedianFilter.h>
 
 Zumo32U4ProximitySensors  proxSensors;  //Abstandssensoren
 Zumo32U4LineSensors       lineSensors;  //Liniensensoren
@@ -24,6 +26,14 @@ Zumo32U4Encoders          encoders;     //Motorencoder
 LSM303                    compass;      //Beschleunigungssensor x-Achse
 L3G                       gyro;         //Drehbewegungssensor z-Achse
 
+MedianFilter LineFilter0(3, 0);         //erstellen der Filter für Liniensensoren
+MedianFilter LineFilter1(3, 0);         //Medianfilter geben mittleren Wert einer Reihe aus
+MedianFilter LineFilter2(3, 0);         //Fenstergröße: 3, Basiswerte: 0 0 0
+MedianFilter ProxFilter0(3, 0);         //erstellen der Filter für Abstandssensoren
+MedianFilter ProxFilter1(3, 0);
+MedianFilter ProxFilter2(3, 0);
+MedianFilter ProxFilter3(3, 0);
+
 #define   MARKLINE0       150
 #define   MARKLINE1       100
 #define   MARKLINE2       120
@@ -31,9 +41,9 @@ L3G                       gyro;         //Drehbewegungssensor z-Achse
 #define   SIGN1           300
 #define   SIGN2           500
 #define   MAXSPEED        400
-#define   FULLSPEEDLEFT   106
-#define   HALFSPEEDLEFT   53
-#define   SLOWSPEEDLEFT   27
+#define   FULLSPEEDLEFT   104
+#define   HALFSPEEDLEFT   52
+#define   SLOWSPEEDLEFT   26
 #define   FULLSPEEDRIGHT  100
 #define   HALFSPEEDRIGHT  50
 #define   SLOWSPEEDRIGHT  25
@@ -68,47 +78,47 @@ bool      alarm = false;                //zeigt Manöver abhängig von btData
 /*-----------------------------------------------------------------*/
 
 //Setup Bluetoothverbindung
-#line 68 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
+#line 78 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 void BlueSetup();
-#line 77 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
+#line 87 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 void LineSetup();
-#line 106 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
+#line 116 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 void ProxSetup();
-#line 112 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
+#line 122 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 void GyroSetup();
-#line 145 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
+#line 155 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 void CompassSetup();
-#line 176 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
+#line 186 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 void setup();
-#line 202 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
+#line 212 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 void TimeUpdate();
-#line 208 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
+#line 218 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 void LoopTiming();
-#line 252 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
-void ProxUpdate();
 #line 262 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
-void LineUpdate();
+void ProxUpdate();
 #line 272 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
+void LineUpdate();
+#line 282 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 void GyroUpdate();
-#line 285 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
+#line 295 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 void CompassUpdate();
-#line 298 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
+#line 308 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 void EncoderUpdate();
-#line 309 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
+#line 319 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 void Kontaktvermeiden();
-#line 328 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
+#line 338 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 void Hindernisumfahren();
-#line 438 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
+#line 464 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 void Abbiegen();
-#line 599 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
+#line 625 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 void Spurhalten();
-#line 642 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
+#line 670 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 void Spurfinden();
-#line 660 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
+#line 688 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 void SerielleAusgabe();
-#line 675 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
+#line 703 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 void loop();
-#line 68 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
+#line 78 "c:\\Users\\Carolin\\Downloads\\VSCode\\Zumo32U4\\Zumo32U4\\Hauptprojekt\\Hauptprojekt.ino"
 void BlueSetup()
 {
   Serial1.begin(9600);                              //Initialisierung mit Datengeschwindigkeit(Baud)
@@ -296,20 +306,20 @@ void LoopTiming()
 void ProxUpdate()
 {
   proxSensors.read();
-  proxValue[0] = proxSensors.countsLeftWithLeftLeds();
-  proxValue[1] = proxSensors.countsFrontWithLeftLeds();
-  proxValue[2] = proxSensors.countsFrontWithRightLeds();  
-  proxValue[3] = proxSensors.countsRightWithRightLeds(); 
+  proxValue[0] = ProxFilter0.in(proxSensors.countsLeftWithLeftLeds());
+  proxValue[1] = ProxFilter1.in(proxSensors.countsFrontWithLeftLeds());
+  proxValue[2] = ProxFilter2.in(proxSensors.countsFrontWithRightLeds());  
+  proxValue[3] = ProxFilter3.in(proxSensors.countsRightWithRightLeds()); 
 }
 
 //Update Liniensensoren
 void LineUpdate()
 {
   uint16_t  lineRaw[3];
-  lineSensors.read(lineRaw);
-  lineValue[0] = lineRaw[0] - lineOffset[0];
-  lineValue[1] = lineRaw[1] - lineOffset[1];
-  lineValue[2] = lineRaw[2] - lineOffset[2];
+  lineSensors.read(lineRaw);                                  //lese Messwerte der Liniensensoren aus
+  lineValue[0] = LineFilter0.in(lineRaw[0] - lineOffset[0]);  //ziehe Offsetwerte von Messwerten ab und gib diese in Filter ein
+  lineValue[1] = LineFilter1.in(lineRaw[1] - lineOffset[1]);  //erhält neue mittlere Werte der Filter
+  lineValue[2] = LineFilter2.in(lineRaw[2] - lineOffset[2]);  //"LineFilter.out" um gefilterte Werte auszugeben ohne neue Werte einzugeben
 }
 
 //Update Drehbewegungssensor
@@ -380,6 +390,13 @@ void Hindernisumfahren()
   turnAngle = 0;                    
   rotationAngle = 0;                                                      
   GyroUpdate();                                                 
+  while(rotationAngle < 20)          
+  {
+    GyroUpdate();  
+    LineUpdate();
+    motors.setSpeeds(SLOWSPEEDLEFT, FULLSPEEDRIGHT); 
+  }
+  GyroUpdate();                                                 
   while(rotationAngle < 45)          
   {
     GyroUpdate();  
@@ -415,14 +432,16 @@ void Hindernisumfahren()
     //Schritt 2: Hindernis passieren
     //Serial1.println("Aufholen"); 
     lastUpdate = millis();
-    while(proxValue[3] < 6 && eventTime < 3000)
+    while(proxValue[3] < 6)
     {
-      TimeUpdate();
       ProxUpdate();
       LineUpdate();
       Spurhalten();
+      TimeUpdate();
+      //Serial1.println(eventTime);
+      if(eventTime > 3000) break;
     }
-    //Serial1.println("Überholen"); 
+    //Serial1.println("Vorbeifahren"); 
     ProxUpdate(); 
     while(proxValue[3] == 6)
     {
@@ -435,10 +454,10 @@ void Hindernisumfahren()
     TimeUpdate();
     while(eventTime < 3000)
     {
-      //Serial1.println(eventTime); 
-      TimeUpdate();
       LineUpdate();
       Spurhalten();
+      TimeUpdate();
+      //Serial1.println(eventTime);
     }
   //}
   
@@ -447,6 +466,13 @@ void Hindernisumfahren()
   turnAngle = 0;                
   rotationAngle = 0;                                                      
   GyroUpdate();                                                 
+  while(rotationAngle > -20)          
+  {
+    GyroUpdate();  
+    LineUpdate();
+    motors.setSpeeds(FULLSPEEDLEFT, SLOWSPEEDRIGHT); 
+  }
+  GyroUpdate();                                                 
   while(rotationAngle > -45)          
   {
     GyroUpdate();  
@@ -489,9 +515,9 @@ void Abbiegen()
   LineUpdate(); 
   bool  leftCode;                                                         //links => 1
   bool  rightCode;                                                        //rechts => 2
-  if((lineValue[0] > SIGN0 && lineValue[0] < 1400) && (lineValue[1] > SIGN1 && lineValue[1] < 700)) leftCode = true;
+  if((lineValue[0] > SIGN0 && lineValue[0] < 1600) && (lineValue[1] > SIGN1 && lineValue[1] < 800)) leftCode = true;
   else leftCode = false;
-  if((lineValue[2] > SIGN2 && lineValue[2] < 1400) && (lineValue[1] > SIGN1 && lineValue[1] < 700)) rightCode = true;
+  if((lineValue[2] > SIGN2 && lineValue[2] < 1600) && (lineValue[1] > SIGN1 && lineValue[1] < 800)) rightCode = true;
   else rightCode = false;
 
   //Zufallszahl erzeugen
@@ -517,7 +543,7 @@ void Abbiegen()
     motors.setSpeeds(FULLSPEEDLEFT, FULLSPEEDRIGHT+10); 
     lastUpdate = millis();
     TimeUpdate();
-    while(eventTime < 300)
+    while(eventTime < 1000)
     {
       TimeUpdate();
       motors.setSpeeds(FULLSPEEDLEFT, FULLSPEEDRIGHT+10); 
@@ -642,17 +668,20 @@ void Abbiegen()
 //Funktion Spurhalten
 void Spurhalten()                                                   
 {
+  uint16_t StartTime = millis();
+  uint16_t Update = millis();
+  uint16_t Time = Update - StartTime;
+
   //linke Linie erreicht, nach rechts fahren
   if(lineValue[0] > MARKLINE0 && lineValue[0] < SIGN0)                      
   {
     ledYellow(1); 
     //Serial1.println("Spur nach rechts korrigieren");  
     motors.setSpeeds(FULLSPEEDLEFT/eventSpeed, SLOWSPEEDRIGHT/eventSpeed);
-    lastUpdate = millis();
-    TimeUpdate();
-    while(eventTime < 100)
+    while(Time < 100)
     {
-      TimeUpdate();
+      Update = millis();
+      Time = Update - StartTime;
       LineUpdate();
       if(lineValue[2] > MARKLINE2) break;
     }   
@@ -664,11 +693,10 @@ void Spurhalten()
     ledYellow(1); 
     //Serial1.println("Spur nach links korrigieren");  
     motors.setSpeeds(SLOWSPEEDLEFT/eventSpeed, FULLSPEEDRIGHT/eventSpeed);   
-    lastUpdate = millis();
-    TimeUpdate();
-    while(eventTime < 100)
+    while(Time < 100)
     {
-      TimeUpdate();
+      Update = millis();
+      Time = Update - StartTime;
       LineUpdate();
       if(lineValue[0] > MARKLINE0) break;
     }   
@@ -751,8 +779,8 @@ void loop()
     eventSpeed = 1.0;
     //if(abs(moveRate) > 1500 && eventTime > 1000) Kontaktvermeiden();           
     if(proxValue[1] == 6 && proxValue[2] == 6) Hindernisumfahren();
-    else if((lineValue[0] > SIGN0 && lineValue[0] < 1400) && (lineValue[1] > SIGN1 && lineValue[1] < 700)) Abbiegen();
-    else if((lineValue[2] > SIGN2 && lineValue[2] < 1400) && (lineValue[1] > SIGN1 && lineValue[1] < 700)) Abbiegen();
+    else if((lineValue[0] > SIGN0 && lineValue[0] < 1600) && (lineValue[1] > SIGN1 && lineValue[1] < 800)) Abbiegen();
+    else if((lineValue[2] > SIGN2 && lineValue[2] < 1600) && (lineValue[1] > SIGN1 && lineValue[1] < 800)) Abbiegen();
     else if(lineValue[1] > MARKLINE1 && lineValue[1] < SIGN1) Spurfinden();
     else Spurhalten();
   }

+ 2 - 1
ArduinoOutput/sketch/Hauptprojekt.ino.cpp.d

@@ -31,4 +31,5 @@ c:\Users\Carolin\Downloads\VSCode\Zumo32U4\ArduinoOutput\sketch\Hauptprojekt.ino
  C:\Users\Carolin\Documents\Arduino\libraries\Zumo32U4/Zumo32U4LineSensors.h \
  C:\Users\Carolin\Documents\Arduino\libraries\Zumo32U4/QTRSensors.h \
  C:\Users\Carolin\Documents\Arduino\libraries\Zumo32U4/Zumo32U4Motors.h \
- C:\Users\Carolin\Documents\Arduino\libraries\Zumo32U4/Zumo32U4ProximitySensors.h
+ C:\Users\Carolin\Documents\Arduino\libraries\Zumo32U4/Zumo32U4ProximitySensors.h \
+ C:\Users\Carolin\Documents\Arduino\libraries\MedianFilter/MedianFilter.h

BIN
ArduinoOutput/sketch/Hauptprojekt.ino.cpp.o


+ 67 - 39
Zumo32U4/Hauptprojekt/Hauptprojekt.ino

@@ -1,17 +1,19 @@
 //Verfassser: Felix Stange, 4056379, MET2016 
-//Datum: erstellt am 19.07.2017, zuletzt geändert am 04.05.2018 
-//Projektbeschreibung: Der Zumo fährt automatisch zwischen 2 Linien ohne diese zu überfahren mithilfe 
-//der Liniensensoren (3), ähnlich einer Spurhalteautomatik (heller Belag und dunkle Streifen). 
-//Außerdem werden Kollisionen verhindert durch Nutzung der vorderen Abstandssensoren. Kommt es 
-//dennoch zu einer Kollision, wird diese durch den Beschleunigungssensor (LSM303) erkannt. 
-//Für den Überholvorgang werden die seitlichen Abstandssensoren und der Drehbewegungssensor (L3G) 
-//genutzt. Mithilfe der Quadraturencoder in den Motoren können Wegstrecken vermessen werden. 
-//Der Zumo kommuniziert über ein Bluetooth-Modul (HC-05) mit anderen Geräten. Die 
-//Kommunikation erfolgt seriell ('SERIAL' für USB, 'SERIAL1' für Bluetooth). 
-//Das LCD kann bei Bluetoothnutzung nicht verwendet werden. 
+//Datum: erstellt am 19.07.2017, zuletzt geändert am 08.05.2018 
+//Projektthema: Untersuchungen und Implementierung eines automatisierten Fahrens mittels Pololu Zumo
+/*Kurzbeschreibung: Der Zumo fährt automatisch zwischen 2 Linien ohne diese zu überfahren mithilfe 
+der Liniensensoren (3), ähnlich einer Spurhalteautomatik (heller Belag und dunkle Streifen). 
+Außerdem werden Kollisionen verhindert durch Nutzung der vorderen Abstandssensoren. Kommt es 
+dennoch zu einer Kollision, wird diese durch den Beschleunigungssensor (LSM303) erkannt. 
+Für den Überholvorgang werden die seitlichen Abstandssensoren und der Drehbewegungssensor (L3G) 
+genutzt. Mithilfe der Quadraturencoder in den Motoren können Wegstrecken vermessen werden. 
+Für die Filterung der Messwerte werden Medianfilter genutzt. Der Zumo kommuniziert über ein 
+Bluetooth-Modul (HC-05) mit anderen Geräten. Die Kommunikation erfolgt seriell ('SERIAL' für USB, 
+'SERIAL1' für Bluetooth). Das LCD kann bei Bluetoothnutzung nicht verwendet werden.*/
 
 #include  <Wire.h>
 #include  <Zumo32U4.h>
+#include  <MedianFilter.h>
 
 Zumo32U4ProximitySensors  proxSensors;  //Abstandssensoren
 Zumo32U4LineSensors       lineSensors;  //Liniensensoren
@@ -21,6 +23,14 @@ Zumo32U4Encoders          encoders;     //Motorencoder
 LSM303                    compass;      //Beschleunigungssensor x-Achse
 L3G                       gyro;         //Drehbewegungssensor z-Achse
 
+MedianFilter LineFilter0(3, 0);         //erstellen der Filter für Liniensensoren
+MedianFilter LineFilter1(3, 0);         //Medianfilter geben mittleren Wert einer Reihe aus
+MedianFilter LineFilter2(3, 0);         //Fenstergröße: 3, Basiswerte: 0 0 0
+MedianFilter ProxFilter0(3, 0);         //erstellen der Filter für Abstandssensoren
+MedianFilter ProxFilter1(3, 0);
+MedianFilter ProxFilter2(3, 0);
+MedianFilter ProxFilter3(3, 0);
+
 #define   MARKLINE0       150
 #define   MARKLINE1       100
 #define   MARKLINE2       120
@@ -28,9 +38,9 @@ L3G                       gyro;         //Drehbewegungssensor z-Achse
 #define   SIGN1           300
 #define   SIGN2           500
 #define   MAXSPEED        400
-#define   FULLSPEEDLEFT   106
-#define   HALFSPEEDLEFT   53
-#define   SLOWSPEEDLEFT   27
+#define   FULLSPEEDLEFT   104
+#define   HALFSPEEDLEFT   52
+#define   SLOWSPEEDLEFT   26
 #define   FULLSPEEDRIGHT  100
 #define   HALFSPEEDRIGHT  50
 #define   SLOWSPEEDRIGHT  25
@@ -252,20 +262,20 @@ void LoopTiming()
 void ProxUpdate()
 {
   proxSensors.read();
-  proxValue[0] = proxSensors.countsLeftWithLeftLeds();
-  proxValue[1] = proxSensors.countsFrontWithLeftLeds();
-  proxValue[2] = proxSensors.countsFrontWithRightLeds();  
-  proxValue[3] = proxSensors.countsRightWithRightLeds(); 
+  proxValue[0] = ProxFilter0.in(proxSensors.countsLeftWithLeftLeds());
+  proxValue[1] = ProxFilter1.in(proxSensors.countsFrontWithLeftLeds());
+  proxValue[2] = ProxFilter2.in(proxSensors.countsFrontWithRightLeds());  
+  proxValue[3] = ProxFilter3.in(proxSensors.countsRightWithRightLeds()); 
 }
 
 //Update Liniensensoren
 void LineUpdate()
 {
   uint16_t  lineRaw[3];
-  lineSensors.read(lineRaw);
-  lineValue[0] = lineRaw[0] - lineOffset[0];
-  lineValue[1] = lineRaw[1] - lineOffset[1];
-  lineValue[2] = lineRaw[2] - lineOffset[2];
+  lineSensors.read(lineRaw);                                  //lese Messwerte der Liniensensoren aus
+  lineValue[0] = LineFilter0.in(lineRaw[0] - lineOffset[0]);  //ziehe Offsetwerte von Messwerten ab und gib diese in Filter ein
+  lineValue[1] = LineFilter1.in(lineRaw[1] - lineOffset[1]);  //erhält neue mittlere Werte der Filter
+  lineValue[2] = LineFilter2.in(lineRaw[2] - lineOffset[2]);  //"LineFilter.out" um gefilterte Werte auszugeben ohne neue Werte einzugeben
 }
 
 //Update Drehbewegungssensor
@@ -336,6 +346,13 @@ void Hindernisumfahren()
   turnAngle = 0;                    
   rotationAngle = 0;                                                      
   GyroUpdate();                                                 
+  while(rotationAngle < 20)          
+  {
+    GyroUpdate();  
+    LineUpdate();
+    motors.setSpeeds(SLOWSPEEDLEFT, FULLSPEEDRIGHT); 
+  }
+  GyroUpdate();                                                 
   while(rotationAngle < 45)          
   {
     GyroUpdate();  
@@ -371,14 +388,16 @@ void Hindernisumfahren()
     //Schritt 2: Hindernis passieren
     //Serial1.println("Aufholen"); 
     lastUpdate = millis();
-    while(proxValue[3] < 6 && eventTime < 3000)
+    while(proxValue[3] < 6)
     {
-      TimeUpdate();
       ProxUpdate();
       LineUpdate();
       Spurhalten();
+      TimeUpdate();
+      //Serial1.println(eventTime);
+      if(eventTime > 3000) break;
     }
-    //Serial1.println("Überholen"); 
+    //Serial1.println("Vorbeifahren"); 
     ProxUpdate(); 
     while(proxValue[3] == 6)
     {
@@ -391,10 +410,10 @@ void Hindernisumfahren()
     TimeUpdate();
     while(eventTime < 3000)
     {
-      //Serial1.println(eventTime); 
-      TimeUpdate();
       LineUpdate();
       Spurhalten();
+      TimeUpdate();
+      //Serial1.println(eventTime);
     }
   //}
   
@@ -403,6 +422,13 @@ void Hindernisumfahren()
   turnAngle = 0;                
   rotationAngle = 0;                                                      
   GyroUpdate();                                                 
+  while(rotationAngle > -20)          
+  {
+    GyroUpdate();  
+    LineUpdate();
+    motors.setSpeeds(FULLSPEEDLEFT, SLOWSPEEDRIGHT); 
+  }
+  GyroUpdate();                                                 
   while(rotationAngle > -45)          
   {
     GyroUpdate();  
@@ -445,9 +471,9 @@ void Abbiegen()
   LineUpdate(); 
   bool  leftCode;                                                         //links => 1
   bool  rightCode;                                                        //rechts => 2
-  if((lineValue[0] > SIGN0 && lineValue[0] < 1400) && (lineValue[1] > SIGN1 && lineValue[1] < 700)) leftCode = true;
+  if((lineValue[0] > SIGN0 && lineValue[0] < 1600) && (lineValue[1] > SIGN1 && lineValue[1] < 800)) leftCode = true;
   else leftCode = false;
-  if((lineValue[2] > SIGN2 && lineValue[2] < 1400) && (lineValue[1] > SIGN1 && lineValue[1] < 700)) rightCode = true;
+  if((lineValue[2] > SIGN2 && lineValue[2] < 1600) && (lineValue[1] > SIGN1 && lineValue[1] < 800)) rightCode = true;
   else rightCode = false;
 
   //Zufallszahl erzeugen
@@ -473,7 +499,7 @@ void Abbiegen()
     motors.setSpeeds(FULLSPEEDLEFT, FULLSPEEDRIGHT+10); 
     lastUpdate = millis();
     TimeUpdate();
-    while(eventTime < 300)
+    while(eventTime < 1000)
     {
       TimeUpdate();
       motors.setSpeeds(FULLSPEEDLEFT, FULLSPEEDRIGHT+10); 
@@ -598,17 +624,20 @@ void Abbiegen()
 //Funktion Spurhalten
 void Spurhalten()                                                   
 {
+  uint16_t StartTime = millis();
+  uint16_t Update = millis();
+  uint16_t Time = Update - StartTime;
+
   //linke Linie erreicht, nach rechts fahren
   if(lineValue[0] > MARKLINE0 && lineValue[0] < SIGN0)                      
   {
     ledYellow(1); 
     //Serial1.println("Spur nach rechts korrigieren");  
     motors.setSpeeds(FULLSPEEDLEFT/eventSpeed, SLOWSPEEDRIGHT/eventSpeed);
-    lastUpdate = millis();
-    TimeUpdate();
-    while(eventTime < 100)
+    while(Time < 100)
     {
-      TimeUpdate();
+      Update = millis();
+      Time = Update - StartTime;
       LineUpdate();
       if(lineValue[2] > MARKLINE2) break;
     }   
@@ -620,11 +649,10 @@ void Spurhalten()
     ledYellow(1); 
     //Serial1.println("Spur nach links korrigieren");  
     motors.setSpeeds(SLOWSPEEDLEFT/eventSpeed, FULLSPEEDRIGHT/eventSpeed);   
-    lastUpdate = millis();
-    TimeUpdate();
-    while(eventTime < 100)
+    while(Time < 100)
     {
-      TimeUpdate();
+      Update = millis();
+      Time = Update - StartTime;
       LineUpdate();
       if(lineValue[0] > MARKLINE0) break;
     }   
@@ -707,8 +735,8 @@ void loop()
     eventSpeed = 1.0;
     //if(abs(moveRate) > 1500 && eventTime > 1000) Kontaktvermeiden();           
     if(proxValue[1] == 6 && proxValue[2] == 6) Hindernisumfahren();
-    else if((lineValue[0] > SIGN0 && lineValue[0] < 1400) && (lineValue[1] > SIGN1 && lineValue[1] < 700)) Abbiegen();
-    else if((lineValue[2] > SIGN2 && lineValue[2] < 1400) && (lineValue[1] > SIGN1 && lineValue[1] < 700)) Abbiegen();
+    else if((lineValue[0] > SIGN0 && lineValue[0] < 1600) && (lineValue[1] > SIGN1 && lineValue[1] < 800)) Abbiegen();
+    else if((lineValue[2] > SIGN2 && lineValue[2] < 1600) && (lineValue[1] > SIGN1 && lineValue[1] < 800)) Abbiegen();
     else if(lineValue[1] > MARKLINE1 && lineValue[1] < SIGN1) Spurfinden();
     else Spurhalten();
   }