#include // Import der Servo-Libraries //TODO: Startknopf einbauen Eingan A3 /** MERKZETTEL: malloc() nachschlagen. Koennte uns sehr mit RAM helfen. Beispiel: ptr = malloc(100) ...oder so. **/ // Pins // Start-Knopf const int startButton = A3; // Stepper - Motoren /* Zusatz-Infos zu den Steppern: Pololu 1 für den Linken Stepper befindet sich direkt neben dem Arduino, Pololu 2 für den Rechten Stepper ist der Andere. Den Linken Stepper so anbringen, dass das schwarze Kabel direkt neben dem Kondensator ist, den Rechten so, dass das blaue Kabel direkt daneben ist. */ const int dirL = 2; //Linker Stepper const int stpL = 3; const int dirR = 7; //Rechter-Stepper const int stpR = 9; const int stepDelay = 15; // Delay zwischen steps. Steuer die Geschwindigkeit const double stepLength = 1.414; // Länge eines Schrittes mit den 90mm Rädern. boolean driveStraight = false; // Sonar const int inPinSonar = A4; const int pingPinSonar = 12; // Arm-Servos für Drehbewegung + Heben const int rotor = 6; //mittlerer Anschluss const int lifter = 4; //innerer Anschluss // Servo mit Ventil-Funktion - 0 ist weitestmöglich Richtung geschlossen, 180 ist weitestmöglich geöffnet. const int vent = 5; //äußerer Anschluss const int valveShut = 40; // Grandzahl, bei welcher der Servo vollständi geschlossen ist. const int valveOpen = 180; // LEDs const int led = 12; // LED für die Beleuchtung der Steuerungs-Phototransistoren const int resetLed = 13; // LED auf dem Arduino, soll Leuchten, wenn der Arduino abstürzt und sich resetted // Phototransistoren const int photoL = A6; const int photoR = A7; // Das blaue Kabel // Kontakt für Fuellstand, Erdung G56 (schwarz), Einspeisung G55 (rot) const int fuellstandsPin =A5; // Konstanten const int armLength = 235; // Armlänge in mm const int armOffAxis = 30; //TODO: einbauen const double pi= 3.15; const int threshold = 1020; // für Fuellstanderkennung TODO: testen const int distSonar = 310; const int radiusGlas = 20; // Variablen // für Glaserkennung long length = 0; // Speichert die Anzahl der Schritte, die der Roboter an einem Glas vorbei fährt boolean found = false; //Boolean, ob Roboter an einem Glas vorbei fährt boolean passed = false; //Boolean, ob Roboter ein Glas passiert hat int glassDistanz = 0; int glassCounts = 0; // für Fahrfunktion boolean rightWasLast = false; //Boolean, ob Roboter vorher nach rechts gefahren ist boolean leftWasLast = false; //Boolean, ob Roboter vorher nach links gefahren ist int brightnessLeft = 0; //Wert des Phototransitoren auf der linken Seite int brightnessRight = 0; //Wert des Phototransistoren auf der rechten Seite const int lightThreshold = 150; // Abfrage, wie viel heller der helle Bereich ist, als die schwarze Linie const int lightBlack = 600; // Lichtintensität, ab welcher wir von Erkennung der schwarzen Linie ausgehen const int photoCorrection = 100; // Korrektur, die auf den rechten Phototransistor angewendet wird. // Servos Servo rotate; Servo lift; Servo ventil; void setup(){ //TODO Serielle Ausgabe entfernen Serial.begin(9600); Serial.println("ABSTURZ oder vielleicht auch erster Start"); // Arduino-LED: Leuchtet auf, wenn der Arduino neu startet. pinMode(resetLed,OUTPUT); digitalWrite(resetLed,HIGH); delay(100); digitalWrite(resetLed,LOW); //Initialisierungen // Steuerungs-LED anmachen pinMode(led,OUTPUT); digitalWrite(led,HIGH); // Arm-Servos anschließen und ausrichten rotate.attach(rotor, 800, 2100); lift.attach(lifter, 800, 2100); resetArm(); // Ventil-Servo anschließen TODO: ausrichten - benötigt wahrscheinlich nicht die Korrekturwerte ventil.attach(vent); ventil.write(valveShut); // Ventil schliessen. TODO Wert gegen valveShut ersetzen. // Stepper-Motoren initialisieren pinMode(dirL, OUTPUT); pinMode(stpL, OUTPUT); pinMode(dirR, OUTPUT); pinMode(stpR, OUTPUT); // Stepper-Motoren Richtung auf vorwärts stellen. digitalWrite(dirL,LOW); digitalWrite(dirR,LOW); // TODO testen, ob der Startknopf so funktioniert. while(analogRead(startButton)<1020) delay(1); } void loop(){ Glaserkennung(); // prüfe, ob sich ein Glas vor dem Sonar befindet. /* Merke: Jedes Objekt, das auf weniger als die Armlänge des Roboters von ihm entfernt zu seiner Rechten aufgestellt ist, wird als Glas erkannt. */ if(found){ // found ist true, wenn ein Glas entdeckt wurde. Serial.println("Glas gefunden"); driveStraight = true; if(passed){ // wird ausgeführt, wenn ein Glas gefunden und vom Sonar passiert wurde Serial.println("Glas passed"); glassDistanz = glassDistanz/glassCounts; Serial.print("GlassDistanz = "); Serial.println(glassDistanz); double h = calcH(); //fahre restliche Distanz Serial.print("h = "); Serial.println(h); double steps = convertToSteps(h)-(length/2); Serial.print("steps = "); Serial.println(steps); Glaserkennung(); //damit drive length nicht abändert for(int i=0; i