Vivibot 2 - Workshop

Für alle, die den Vivibot 2 - Workshop besucht haben, finden hier weitere Anleitungen/Informationen.

Nachfolgend kannst Du die Akkordeons aufklappen und findest darin mehr Informationen.

Software und Treiber installieren

1. Arduino IDE installieren

Lade unter https://www.arduino.cc/en/Main/Software die Arduino IDE für Dein Betriebssystem herunter:

Installiere anschliessend diese Software.

2. Treiber installieren

Ein original Arduino UNO kostet 20.- € und ist ausverkauft.

Um geld zu sparen, wird hier für den Vivi Roboter Bausatz eine China Version verwendet, welche nur 4.-CHF kostet.
Programmiert, wird er genau gleich wie ein original Arduino.
Der einzige Nachteil ist, der Treiber für den “USB zu Seriell Chip”. Dieser Treiber wird nicht automatisch installiert.

Du musst ihn herunterladen.
Und falls die Meldung kommt der Treiber sei nicht signiert muss man auf “trozdem installieren” klicken.

Windows: Treiber download
Mac: Treiber download
Linux: Treiber download

Weitere Tipps zur Treiber installation findest du hier (englisch)

3. Benötigte Bibliothek installieren

Für unser Vivibot 2 Programm benötigen wir eine abgeänderte Version der NewPing-Bibliothek.

Diese kannst Du hier downloaden.

Enpacke den Download und kompiere der Ordner "NewPingMAS" in den "libraries"-Ordner der Arduion IDE-Installation. Bei Windows ist dies standardmässig unter "C:\Program Files (x86)\Arduino\libraries".

Arduino Verbinden

1. Arduino IDE starten

2. Falls ein Bluetooth-Chip mit dem Arduino-Board verbunden ist, sollte dieser getrennt werden

3. Arduino mit Micro- oder Mini-USB-Kabel anschliessen

4. Einstellungen für die Verbindung

Als erstes muss der Korrekte COM-Port ausgewählt werden:

Um herauszufinden, welcher COM-Port der Korrekte ist, kann man unter Windows den Gerätemanager öffnen und dann den Arduino einstecken. Dann sieht man, welcher COM-Port dazu kommt.

Als nächtes muss man noch das korrekte Board und Prozessor (siehe Screenshot oben) wählen. In unserem Workshop verwenden wir zwei Versionen:

USB-TypBoardProcessor
Micro USBArduino NanoATmega328P
Mini USBArduino Pro oder Pro MiniATmega168 (5V 16MHz)

Programmieren lernen

Um Arduino progranieren zu lernen benutzt Du am besten die Beispiele in der Arduino IDE. Dazu wählst Du "Files > Examples > 01.Basics > Blink" und danach erscheint dieser Code in der IDE.

Nun kannst Du den Code mit dem "Pfeil nach rechts" hochladen:

Falls der Upload geklappt hat, blinkt nun auf dem Arduino-Board das blaue LED. Nun kannst Du den Code nach belieben abändern, damit z.B,. das LED schneller oder langsamer blinkt. Natürklich kannst Du auch weitere Beispiele laden und abändern.

Vivibot 2 - Software

Die aktuelle Vivibot 2 Software findest Du untenstehend. Nun sind auch die Tischkantensensoren darin enthalten.

//Weil wir einen Servo und einen Ultraschall-Sensor benutzen, fügen wir zwei Bibliotheken ein, die deren Benutzung vereinfachen.
#include <Servo.h>
#include <NewPingMAS.h>

//damit wir uns nicht die Nummern der Pin's merken müssen, geben wir ihnen Namen, an denen wir die  Pinfunktion erkennen.
#define LeftMotorForward 6
#define LeftMotorBackward 5
#define RightMotorForward 8
#define RightMotorBackward 9
#define USTrigger 3
#define USEcho 2
#define MaxDistance 300
#define LED 13
#define InfraredLeft 11
#define InfraredRight 10
#define turn180 500
#define turn90 250

//Hier erstellen wir zwei 'objekte', eine für den Servo und eine für den Ultraschall-Sensor
Servo servo;
NewPingMAS sonar(USTrigger, USEcho, MaxDistance);

//Hier erstellen wir Variablen für Zahlen ohne Vorzeichen, welche wir weiter unten im Code brauchen für Messwerte, Geschwindigkeit etc.
unsigned int duration;
unsigned int distance;
unsigned int FrontDistance;
unsigned int LeftDistance;
unsigned int RightDistance;
unsigned int Time;
unsigned int Ton;

//Statmusik definition
int melody_freq[] = {262, 196, 196, 220, 196, 0, 247, 262 };
int melody_duration[] = { 250, 125, 125, 250, 250, 250, 250, 250 };

//Tonleiter
int tonleiter_freq[] = {65,73,82,98,110,131,147,165,196,220,262,294,330,392,440,523,587,659,784,880,1047,1175,1568,1760,2093,2349,2637,3136,3520,4186};

//Bluetooth State
int BTstate = 0;
int BTstateStatic = 'a';

//Motorensteuerung
int DelayRotate = 300;

void setup() {
  Serial.begin(9600); // Default communication rate of the Bluetooth module

  //Hier definieren wir die Pin Modus. Weil wir Signale ausgeben werden, stellen wir sie als Ausgänge
  pinMode(LeftMotorForward, OUTPUT);
  pinMode(LeftMotorBackward, OUTPUT);
  pinMode(RightMotorForward, OUTPUT);
  pinMode(RightMotorBackward, OUTPUT);
  pinMode(InfraredLeft, INPUT);
  pinMode(InfraredRight, INPUT);
  pinMode(LED, OUTPUT);
  servo.attach(4);                                    //Der Servo hängt an pin 4

  //Statmusik abspielen (MAS 1)
  for (int thisNote = 0; thisNote < 8; thisNote++) { // Loop through the notes in the array.
    tone(12, melody_freq[thisNote], melody_duration[thisNote]); // Play thisNote for duration.
    delay(melody_duration[thisNote]); // Short delay between notes.
  }
}

void loop() {
 // put your main code here, to run repeatedly:
 if(Serial.available() > 0){ // Checks whether data is comming from the serial port
    BTstate = Serial.read(); // Reads the data from the serial port nm,
 }

 if(BTstate == 'a'){
   BTstateStatic = 'a';
 }else if(BTstate == 'h'){
   BTstateStatic = 'h';
 }else if(BTstate == 'f'){
   BTstateStatic = 'f';
 }else if(BTstate == 'p'){
   BTstateStatic = 'p';
 }else if(BTstate == 'r'){
   BTstateStatic = 'r';
 }else if(BTstate == 'l'){
   BTstateStatic = 'l';
 }

 //Serial.println(BTstate);

 if(BTstateStatic == 'h'){
  tone(12, 110);
  moveStop();
  delay(100);
  noTone(12);
  delay(900);
 }else if(BTstateStatic == 'a'){

  servo.write(90);                                    //Der  Servo schaut vorwärts    
  delay(70);            
  scan();                                             //ruft die Scan Funktion auf
  FrontDistance = distance;                           //Setzt die Variable FrontDistance auf den Wert, den wir von der Scan Funktion bekommen haben
  if(FrontDistance > 20 || FrontDistance == 0)        //falls 20cm vor dem Roboter nichts ist, dann..
  {
   moveForward(0);                                     //rufe die moveForward Funktion auf
  }
  else                                                //andernfalls (allso falls etwas kommt innert 40cm ) dann...
  {
    moveStop();                                       //rufe die moveStop Funktion
    servo.write(167);                                 //Drehe den Servo nach links (möglicherweise kann der kleine Servo nicht die ganzen 180Grad)
    delay(500);                                       //Warte eine halbe Sekunde, bis der Servo links ankommt
    scan();                                           //Rufe die scan Funktion
    LeftDistance = distance;                          //Setze die Variable LeftDistance auf die Distanz von links
    servo.write(0);                                   //Drehe den Servo nach rechhts
    delay(500);                                       //Warte eine halbe Sekunde, bis der Servo rechts ankommt
    scan();                                           //Rufe die scan Funktion auf
    RightDistance = distance;                         //Setze die Variable RightDistance auf die Distanz von rechts
    if(RightDistance < LeftDistance)                  //Ist die Distanz rechts kleiner als der linke Abstand..
    {
     moveBackward(DelayRotate);
     //delay(DelayRotate);
     moveLeft(DelayRotate);                                      //Rufe die moveLeft Funktion auf
     //delay(DelayRotate);                              //Pausiere das Programm eine halbe Sekunde, bis der Roboter gedreht hat
    }
    else if(LeftDistance < RightDistance)             //Andernfalls, wenn die Distanz links kleiner ist als rechts dann..
    {
     moveBackward(DelayRotate);
     //delay(DelayRotate);
     moveRight(DelayRotate);                                     //Rufe die moveRight Funktion auf
     //delay(DelayRotate);                              //Pausiere das Programm eine halbe Sekunde, bis der Roboter gedreht hat
    }
    else                                              //falls die Distanz links und rechts gleich ist (das passiert sehr unwarscheindlich) dann..
    {
     moveBackward(DelayRotate);                                  //Rufe die moveBackward Funktion auf
     //delay(DelayRotate);                              //Pausiere das Programm für 200 Millisekunden um den Roboter rückwärts fahren zu lassen
     moveRight(DelayRotate);                                     //rufe die moveRight Funktion
     //delay(DelayRotate);                              //Pausiere das Programm für 200 Millisekunden um den Roboter nach rechts zu drehen
    }
  moveStop();
  }
 }else{

  if(BTstateStatic == 'l'){ // Bluetooth "l"
    tone(12, 220);
    moveStop();
    moveLeft(DelayRotate);
    //delay(DelayRotate);
    moveStop();
    noTone(12);
    BTstateStatic = 'h';
  }else if(BTstateStatic == 'r'){ // Bluetooth "r"
    tone(12, 165);
    moveStop();
    moveRight(DelayRotate);
    //delay(DelayRotate);
    moveStop();
    noTone(12);
    BTstateStatic = 'h';
  }else if(BTstateStatic == 'f'){ // Bluetooth "f"
    tone(12, 440);
    moveForward(0);
    noTone(12);
  }
 }
}

void moveForward(int execution_period)                                    //Diese Funktion macht das der Roboter vorwärts fährt
{
  unsigned long execution_start;
  execution_start=millis();

  //if((digitalRead(InfraredLeft) && digitalRead(InfraredRight))==false){
  if(digitalRead(InfraredLeft)==LOW && digitalRead(InfraredRight)==LOW){

      digitalWrite(LeftMotorBackward, LOW);
      digitalWrite(LeftMotorForward, HIGH);
      digitalWrite(RightMotorBackward, LOW);
      digitalWrite(RightMotorForward, HIGH);
  }
  else{
    moveStop();
    delay(300);
    //moveBackward(500);

    if(digitalRead(InfraredLeft)==HIGH && digitalRead(InfraredRight)==HIGH){

        moveBackward(500);
        moveLeft(turn180);
        return 1;

    }
    else if(digitalRead(InfraredLeft)==LOW && digitalRead(InfraredRight)==HIGH){

        moveBackward(500);
        moveLeft(turn90);
        return 1;

    }
    else if(digitalRead(InfraredLeft)==HIGH && digitalRead(InfraredRight)==LOW){

        moveBackward(500);
        moveRight(turn90);
        return 1;

    }
  }
  if(execution_period!=0){
    while(millis()-execution_start <= execution_period){
      if(digitalRead(InfraredLeft)==HIGH || digitalRead(InfraredRight)==HIGH){
      //if((digitalRead(InfraredLeft) && digitalRead(InfraredRight))==false){
            moveStop();
            delay(300);
            //moveBackward(500);

            if(digitalRead(InfraredLeft)==HIGH && digitalRead(InfraredRight)==HIGH){

                moveBackward(500);
                moveLeft(turn180);
                return 2;

            }
            else if(digitalRead(InfraredLeft)==LOW && digitalRead(InfraredRight)==HIGH){

                moveBackward(500);
                moveLeft(turn90);
                return 2;

            }
            else if(digitalRead(InfraredLeft)==HIGH && digitalRead(InfraredRight)==LOW){

                moveBackward(500);
                moveRight(turn90);
                return 2;

            }
      }
      else{

      }

    }
  }
  return 0;

}

void moveBackward(int execution_period)                                  //Diese Funktion macht das der Roboter rückwärts fährt
{
  unsigned long execution_start;
  execution_start=millis();

  digitalWrite(LeftMotorForward, LOW);
  digitalWrite(LeftMotorBackward, HIGH);
  digitalWrite(RightMotorForward, LOW);
  digitalWrite(RightMotorBackward, HIGH);
  while(millis()-execution_start <= execution_period){
    //Mache Irgendwas
  }

}

void moveLeft(int execution_period)                                      //Diese Funktion macht das der Roboter nach links dreht
{
  unsigned long execution_start;
  execution_start=millis();

  //if((digitalRead(InfraredLeft) && digitalRead(InfraredRight))==false){
  if(digitalRead(InfraredLeft)==LOW && digitalRead(InfraredRight)==LOW){

    digitalWrite(LeftMotorForward, LOW);
    digitalWrite(LeftMotorBackward, HIGH);
    digitalWrite(RightMotorBackward, LOW);
    digitalWrite(RightMotorForward, HIGH);
  }
  else{
    moveStop();
    return 1;
  }

  while(millis()-execution_start <= execution_period){
      if(digitalRead(InfraredLeft)==HIGH || digitalRead(InfraredRight)==HIGH){
      //if((digitalRead(InfraredLeft) && digitalRead(InfraredRight))==false){         
          moveStop();
          return 2;
    }
    else{

    }

  }
  return 0;

}

void moveRight(int execution_period)                                    //Diese Funktion macht das der Roboter nach rechts dreht
{
  unsigned long execution_start;
  execution_start=millis();

  //if((digitalRead(InfraredLeft)==false && digitalRead(InfraredRight))==false){
  if(digitalRead(InfraredLeft)==LOW && digitalRead(InfraredRight)==LOW){

    digitalWrite(LeftMotorBackward, LOW);
    digitalWrite(LeftMotorForward, HIGH);
    digitalWrite(RightMotorForward, LOW);
    digitalWrite(RightMotorBackward, HIGH);
  }
  else{
    moveStop();
    return 1;
  }

  while(millis()-execution_start <= execution_period){
      if(digitalRead(InfraredLeft)==HIGH || digitalRead(InfraredRight)==HIGH){
      //if((digitalRead(InfraredLeft) && digitalRead(InfraredRight))==false){ 
          moveStop();
          return 2;
    }
    else{

    }

  }
  return 0;
}

void moveStop()                                     //Diese Funktion macht das der Roboter still steht
{
  digitalWrite(LeftMotorBackward, LOW);
  digitalWrite(LeftMotorForward, LOW);
  digitalWrite(RightMotorForward, LOW);
  digitalWrite(RightMotorBackward, LOW);
}
void scan()                                         //Diese Funktion misst die Distanz vor dem Ultraschallsensor
{
  delay(50);
  Time = sonar.ping();
  distance = Time / US_ROUNDTRIP_CM;

  // Sound depence on distance
  Ton = round(distance/10)+1;
  if(Ton > 0 && Ton < 31){
    tone(12, tonleiter_freq[Ton]*5);            // Ton ausgeben
  }else{
    noTone(12);
  }


}

Vivibot 2 - Software (mit PWM)

Diese Version der Software ist inkl. PWN (Motoren-Geschwindigkeit kann gesteuert werden).

Diese braucht zusätzlich noch folgende beiden Bibliotheken:
ServoTimer2-master.zip
TimerFreeTone_v1.5.zip

//Weil wir einen Servo und einen Ultraschall-Sensor benutzen, fügen wir zwei Bibliotheken ein, die deren Benutzung vereinfachen.
//#include <Servo.h>
#include <NewPingMAS.h>
#include <ServoTimer2.h>  // the servo library
#include <TimerFreeTone.h>

//damit wir uns nicht die Nummern der Pin's merken müssen, geben wir ihnen Namen, an denen wir die  Pinfunktion erkennen.
#define LeftMotorForward 6
#define LeftMotorBackwardPWM 5
#define RightMotorForward 8
#define RightMotorBackwardPWM 9
#define USTrigger 3
#define USEcho 2
#define MaxDistance 300
#define LED 13
#define InfraredLeft 11
#define InfraredRight 10
#define turn180 500
#define turn90 250
//#define pwm_out_high 150
//#define pwm_out_low 0
#define servo_pin  4
#define tone_pin 12
#define distance_threshold 0

//Hier erstellen wir zwei 'objekte', eine für den Servo und eine für den Ultraschall-Sensor
//Servo servo;
ServoTimer2 servo;    // declare variables for up to eight servos
NewPingMAS sonar(USTrigger, USEcho, MaxDistance);

//Hier erstellen wir Variablen für Zahlen ohne Vorzeichen, welche wir weiter unten im Code brauchen für Messwerte, Geschwindigkeit etc.
unsigned int duration;
unsigned int distance;
unsigned int FrontDistance;
unsigned int LeftDistance;
unsigned int RightDistance;
unsigned int Time;
unsigned int Ton;
unsigned int pwm_out_high = 180;
unsigned int pwm_out_low = 0;

//Statmusik definition
int melody_freq[] = {262, 196, 196, 220, 196, 0, 247, 262 };
int melody_duration[] = { 83, 42, 42, 83, 83, 83, 83, 83 };

//Tonleiter
int tonleiter_freq[] = {65,73,82,98,110,131,147,165,196,220,262,294,330,392,440,523,587,659,784,880,1047,1175,1568,1760,2093,2349,2637,3136,3520,4186};

//Bluetooth State
int BTstate = 0;
int BTstateStatic = 'a';

//Motorensteuerung
int DelayRotate = 300;

void setup() {
  Serial.begin(9600); // Default communication rate of the Bluetooth module

  //Hier definieren wir die Pin Modus. Weil wir Signale ausgeben werden, stellen wir sie als Ausgänge
  pinMode(LeftMotorForward, OUTPUT);
  //pinMode(LeftMotorBackward, OUTPUT);
  pinMode(RightMotorForward, OUTPUT);
  //pinMode(RightMotorBackward, OUTPUT);
  pinMode(InfraredLeft, INPUT);
  pinMode(InfraredRight, INPUT);
  pinMode(LED, OUTPUT);
  servo.attach(servo_pin);                                    //Der Servo hängt an pin 4

  //Statmusik abspielen (MAS 1)
  for (int thisNote = 0; thisNote < 8; thisNote++) { // Loop through the notes in the array.
    TimerFreeTone(tone_pin, melody_freq[thisNote], melody_duration[thisNote]); // Play thisNote for duration.
    delay(melody_duration[thisNote]); // Short delay between notes.
  }
}

void loop() {
 // put your main code here, to run repeatedly:
 if(Serial.available() > 0){ // Checks whether data is comming from the serial port
    BTstate = Serial.read(); // Reads the data from the serial port nm,
 }

 if(BTstate == 'a'){
   BTstateStatic = 'a';
 }else if(BTstate == 'h'){
   BTstateStatic = 'h';
 }else if(BTstate == 'f'){
   BTstateStatic = 'f';
 }else if(BTstate == 'p'){
   BTstateStatic = 'p';
 }else if(BTstate == 'r'){
   BTstateStatic = 'r';
 }else if(BTstate == 'l'){
   BTstateStatic = 'l';
 }

 //Serial.println(BTstate);

 if(BTstateStatic == 'h'){
  TimerFreeTone(tone_pin, 110, 10);
  moveStop();
  delay(100);
  //noTone(tone_pin);
  delay(900);
 }else if(BTstateStatic == 'a'){

  servo.write(1500);                                    //Der  Servo schaut vorwärts 90
  delay(70);            
  scan();                                             //ruft die Scan Funktion auf
  FrontDistance = distance;                           //Setzt die Variable FrontDistance auf den Wert, den wir von der Scan Funktion bekommen haben
  if(FrontDistance > 20 || FrontDistance == 0)        //falls 20cm vor dem Roboter nichts ist, dann..
  {
   moveForward(0);                                     //rufe die moveForward Funktion auf
  }
  else                                                //andernfalls (allso falls etwas kommt innert 40cm ) dann...
  {
    moveStop();                                       //rufe die moveStop Funktion
    servo.write(2000);                                 //Drehe den Servo nach links (möglicherweise kann der kleine Servo nicht die ganzen 180Grad)167
    delay(500);                                       //Warte eine halbe Sekunde, bis der Servo links ankommt
    scan();                                           //Rufe die scan Funktion
    LeftDistance = distance;                          //Setze die Variable LeftDistance auf die Distanz von links
    servo.write(1000);                                   //Drehe den Servo nach rechhts 0
    delay(500);                                       //Warte eine halbe Sekunde, bis der Servo rechts ankommt
    scan();                                           //Rufe die scan Funktion auf
    RightDistance = distance;                         //Setze die Variable RightDistance auf die Distanz von rechts
    if(RightDistance < LeftDistance)                  //Ist die Distanz rechts kleiner als der linke Abstand..
    {
     moveBackward(DelayRotate);
     //delay(DelayRotate);
     moveLeft(DelayRotate);                                      //Rufe die moveLeft Funktion auf
     //delay(DelayRotate);                              //Pausiere das Programm eine halbe Sekunde, bis der Roboter gedreht hat
    }
    else if(LeftDistance < RightDistance)             //Andernfalls, wenn die Distanz links kleiner ist als rechts dann..
    {
     moveBackward(DelayRotate);
     //delay(DelayRotate);
     moveRight(DelayRotate);                                     //Rufe die moveRight Funktion auf
     //delay(DelayRotate);                              //Pausiere das Programm eine halbe Sekunde, bis der Roboter gedreht hat
    }
    else                                              //falls die Distanz links und rechts gleich ist (das passiert sehr unwarscheindlich) dann..
    {
     moveBackward(DelayRotate);                                  //Rufe die moveBackward Funktion auf
     //delay(DelayRotate);                              //Pausiere das Programm für 200 Millisekunden um den Roboter rückwärts fahren zu lassen
     moveRight(DelayRotate);                                     //rufe die moveRight Funktion
     //delay(DelayRotate);                              //Pausiere das Programm für 200 Millisekunden um den Roboter nach rechts zu drehen
    }
  moveStop();
  }
 }else{

  if(BTstateStatic == 'l'){ // Bluetooth "l"
    TimerFreeTone(tone_pin, 220, 10);
    moveStop();
    moveLeft(DelayRotate);
    //delay(DelayRotate);
    moveStop();
    //noTone(tone_pin);
    BTstateStatic = 'h';
  }else if(BTstateStatic == 'r'){ // Bluetooth "r"
    TimerFreeTone(tone_pin, 165, 10);
    moveStop();
    moveRight(DelayRotate);
    //delay(DelayRotate);
    moveStop();
    //noTone(tone_pin);
    BTstateStatic = 'h';
  }else if(BTstateStatic == 'f'){ // Bluetooth "f"
    TimerFreeTone(tone_pin, 440, 10);
    moveForward(0);
    //noTone(tone_pin);
  }
 }
}

void moveForward(int execution_period)                                    //Diese Funktion macht das der Roboter vorwärts fährt
{
  unsigned long execution_start;
  execution_start=millis();
 
  //if((digitalRead(InfraredLeft) && digitalRead(InfraredRight))==false){
  if(digitalRead(InfraredLeft)==LOW && digitalRead(InfraredRight)==LOW && analogRead(A0)>distance_threshold){   //vorwaerts wenn nicht am abgrund oder nichts im weg

      pwm_out_low = 255-pwm_out_high;
      analogWrite(LeftMotorBackwardPWM, pwm_out_low);
      digitalWrite(LeftMotorForward, HIGH);
      analogWrite(RightMotorBackwardPWM, pwm_out_low);
      digitalWrite(RightMotorForward, HIGH);
  }
  else{
    moveStop();
    delay(300);
    //moveBackward(500);

    if(digitalRead(InfraredLeft)==HIGH && digitalRead(InfraredRight)==HIGH){

        moveBackward(500);
        moveLeft(turn180);
        return 1;
       
    }
    else if(digitalRead(InfraredLeft)==LOW && digitalRead(InfraredRight)==HIGH){

        moveBackward(500);
        moveLeft(turn90);
        return 1;
       
    }
    else if(digitalRead(InfraredLeft)==HIGH && digitalRead(InfraredRight)==LOW){

        moveBackward(500);
        moveRight(turn90);
        return 1;
       
    }
    else if(analogRead(A0)<distance_threshold){
       
        moveBackward(500);
        moveRight(turn180);
        return 1;   
    }
  }
 
  if(execution_period!=0){
    while(millis()-execution_start <= execution_period){
      if(digitalRead(InfraredLeft)==HIGH || digitalRead(InfraredRight)==HIGH || analogRead(A0)<distance_threshold){   //stop wenn am abgrund oder was im weg
   
      //if((digitalRead(InfraredLeft) && digitalRead(InfraredRight))==false){
            moveStop();
            delay(300);
            //moveBackward(500);

            if(digitalRead(InfraredLeft)==HIGH && digitalRead(InfraredRight)==HIGH){
       
                moveBackward(500);
                moveLeft(turn180);
                return 2;
               
            }
            else if(digitalRead(InfraredLeft)==LOW && digitalRead(InfraredRight)==HIGH){
       
                moveBackward(500);
                moveLeft(turn90);
                return 2;
               
            }
            else if(digitalRead(InfraredLeft)==HIGH && digitalRead(InfraredRight)==LOW){
       
                moveBackward(500);
                moveRight(turn90);
                return 2;
               
            }
            else if(analogRead(A0)<distance_threshold){
       
                moveBackward(500);
                moveRight(turn180);
                return 2;
               
            }           
      }
      else{
       
      }
     
    }
  }
  return 0;
 
}

void moveBackward(int execution_period)                                  //Diese Funktion macht das der Roboter rückwärts fährt
{
  unsigned long execution_start;
  execution_start=millis();

  pwm_out_low = 255-pwm_out_high;
  digitalWrite(LeftMotorForward, LOW);
  analogWrite(LeftMotorBackwardPWM, pwm_out_high);
  digitalWrite(RightMotorForward, LOW);
  analogWrite(RightMotorBackwardPWM, pwm_out_high);
  while(millis()-execution_start <= execution_period){
    //Mache Irgendwas
  }
 
}

void moveLeft(int execution_period)                                      //Diese Funktion macht das der Roboter nach links dreht
{
  unsigned long execution_start;
  execution_start=millis();
 
  //if((digitalRead(InfraredLeft) && digitalRead(InfraredRight))==false){
  if(digitalRead(InfraredLeft)==LOW && digitalRead(InfraredRight)==LOW){

    pwm_out_low = 255-pwm_out_high;
    digitalWrite(LeftMotorForward, LOW);
    analogWrite(LeftMotorBackwardPWM, pwm_out_high);
    analogWrite(RightMotorBackwardPWM, pwm_out_low);
    digitalWrite(RightMotorForward, HIGH);
  }
  else{
    moveStop();
    return 1;
  }

  while(millis()-execution_start <= execution_period){
      if(digitalRead(InfraredLeft)==HIGH || digitalRead(InfraredRight)==HIGH){
      //if((digitalRead(InfraredLeft) && digitalRead(InfraredRight))==false){         
          moveStop();
          return 2;
    }
    else{
     
    }
   
  }
  return 0;
 
}

void moveRight(int execution_period)                                    //Diese Funktion macht das der Roboter nach rechts dreht
{
  unsigned long execution_start;
  execution_start=millis();
 
  //if((digitalRead(InfraredLeft)==false && digitalRead(InfraredRight))==false){
  if(digitalRead(InfraredLeft)==LOW && digitalRead(InfraredRight)==LOW){

    pwm_out_low = 255-pwm_out_high;
    analogWrite(LeftMotorBackwardPWM, pwm_out_low);
    digitalWrite(LeftMotorForward, HIGH);
    digitalWrite(RightMotorForward, LOW);
    analogWrite(RightMotorBackwardPWM, pwm_out_high);
  }
  else{
    moveStop();
    return 1;
  }

  while(millis()-execution_start <= execution_period){
      if(digitalRead(InfraredLeft)==HIGH || digitalRead(InfraredRight)==HIGH){
      //if((digitalRead(InfraredLeft) && digitalRead(InfraredRight))==false){ 
          moveStop();
          return 2;
    }
    else{
     
    }
   
  }
  return 0;
}

void moveStop()                                     //Diese Funktion macht das der Roboter still steht
{
  pwm_out_low = 255-pwm_out_high;
  analogWrite(LeftMotorBackwardPWM, pwm_out_low);
  digitalWrite(LeftMotorForward, LOW);
  digitalWrite(RightMotorForward, LOW);
  analogWrite(RightMotorBackwardPWM, pwm_out_low);
}
void scan()                                         //Diese Funktion misst die Distanz vor dem Ultraschallsensor
{
  delay(50);
  Time = sonar.ping();
  distance = Time / US_ROUNDTRIP_CM;

  // Sound depence on distance
  Ton = round(distance/10)+1;
  if(Ton > 0 && Ton < 31){
    TimerFreeTone(tone_pin, tonleiter_freq[Ton]*5, 10);            // Ton ausgeben
  }else{
    //noTone(tone_pin);
  }

 
}