Problem: einfacher Roboter

Hallo!
Ich hab vor kurzem einen Arduino Uno bekommen. Dazu hab ich mir bei www.physicalcomputing.at ein Roboter Chassis http://www.physicalcomputing.at/shop/article_ROB-00100/Roboter-Chassis.html?shop_param=cid%3D23%26aid%3DROB-00100%26, einen Motor Treiber http://www.physicalcomputing.at/shop/article_A-1123300/DC-Motor-Treiber-1A%2C-Dual.html?shop_param=cid%3D10%26aid%3DA-1123300%26 und einen digitalen Sensor http://www.physicalcomputing.at/shop/article_A-1123200/Line-Sensor-Digital.html?shop_param=cid%3D7%26aid%3DA-1123200%26 bestellt.
Den Sensor hab ich ich vorne am Roboter befestigt.
Ich will ein Programm für einen Roboter schreiben der immer geradeaus fährt und wenn ein Hinderniss vor ihm ist soll er zurückfahren und dann eine Linkskurve machen.
Mein Problem ist jetzt, dass wenn ich den Roboter einschalte und er ein Hinderniss erkennt, fährt er zurück und dann nach links aber danach bleibt er einfach stehen und ich muss den Taster wieder erneut drücken und dann beginnt das Ganze von vorne.

Was ist mein Fehler?
Ich bin für jede Hilfe dankbar!

mfg
Michael K.

#define ON 1
#define OFF 0

const int pwmA_rechts=10;  //rechter Motor
const int pwmB_links=11;   //linker Motoer
const int AIN1=2;    //AIN1,AIN2,BIN1 und BIN2 sind die steuereingänge des Motortreibers ( ob er Vorwährts oder Rückwährts fahren soll) 
const int AIN2=3;
const int BIN1=4;
const int BIN2=5;
const int stby=7;
const int power_button=8;
boolean button_state=0;
boolean robo_state=0;
int led_pin=13;
const int speed_pin=0;
int robo_speed;
const int robo_speed_min=100;  //minimalste Geschwindikeit
const int sensor_pin=9;
int sensor_value;

int readSensor();  
int readSensor()    //Unterprogramm zum Auslesen des Sensors; 
{          //Quelle: http://physicalcomputingaustria.blogspot.co.at/search?updated-min=2012-01-01T00:00:00-08:00&updated-max=2013-01-01T00:00:00-08:00&max-results=1
 long time;  //auf der Website heißst das Unterprogramm "readqd1()"
 int diff;
 pinMode(sensor_pin,OUTPUT);
 digitalWrite(sensor_pin,OUTPUT);
 delayMicroseconds(10);
 pinMode(sensor_pin,INPUT);
 time=micros(); 
 while(digitalRead(sensor_pin) == HIGH && micros()-time < 3000);
 diff = micros() - time;
 return diff;
}

void setup()
{
  Serial.begin(9600);
  pinMode(pwmA_rechts,OUTPUT);
  pinMode(pwmB_links,OUTPUT);
  pinMode(AIN1,OUTPUT);
  pinMode(AIN2,OUTPUT);
  pinMode(BIN1,OUTPUT);
  pinMode(BIN2,OUTPUT);
  pinMode(stby,OUTPUT);
  pinMode(power_button,INPUT);
  pinMode(led_pin,OUTPUT);
  digitalWrite(led_pin,LOW);
  digitalWrite(stby,HIGH);    //standby pin muss 1 seins damit die Motoren aktiv sind
}

void loop()
{
  sensor_value=readSensor();
  Serial.print("sensor_value: ");
  Serial.println(sensor_value);
  
  robo_speed=analogRead(speed_pin)/4;  //die Geschwindigkeit kann mit einem Potentiometer eingestellt werden
  if(robo_speed<robo_speed_min)        //Überprüfung ob das Eingangssignal kleiner ist als die minimalste erlaubte Geschwindikeit
    robo_speed=robo_speed_min;
  Serial.print("robo_speed: ");
  Serial.println(robo_speed);
  
  button_state=digitalRead(power_button);  //Taster zum Einschalten wird ausgelesen

  if((button_state==HIGH)&&(robo_state==OFF))  //Überprüfung ob der Roboter eingeschalten ist oder ausgeschalten
      robo_state=ON;
  else if((button_state==HIGH)&&(robo_state==ON))
      robo_state=OFF;
      
  delay(2);
  if(robo_state==ON)
  {
    digitalWrite(led_pin,HIGH);    //Roboter soll am Anfang nur geradeaus fahren
    digitalWrite(AIN1,HIGH);
    digitalWrite(AIN2,LOW);
    analogWrite(pwmA_rechts,robo_speed);
    digitalWrite(BIN1,HIGH);
    digitalWrite(BIN2,LOW);
    analogWrite(pwmB_links,robo_speed);
    if(sensor_value<=1000)    //wenn ein Hinderniss kommt, soll er zurück fahren und dann eine Linkskurve fahren
    {
      digitalWrite(AIN1,LOW);
      digitalWrite(AIN2,HIGH);
      analogWrite(pwmA_rechts,robo_speed);
      digitalWrite(BIN1,LOW);
      digitalWrite(BIN2,HIGH);
      analogWrite(pwmB_links,robo_speed);
      delay(1000);
      digitalWrite(AIN1,HIGH);
      digitalWrite(AIN2,LOW);
      analogWrite(pwmA_rechts,robo_speed);
      digitalWrite(BIN1,HIGH);
      digitalWrite(BIN2,LOW);
      analogWrite(pwmB_links,OFF);
      delay(500);
    }
  }
  else if(robo_state==OFF)
    analogWrite(pwmA_rechts,OFF);
    analogWrite(pwmB_links,OFF);
    digitalWrite(led_pin,LOW);
    
}

Hallo Michael,
ich bin mir nicht sicher, aber der "else if" Teil am Schluss ist nicht korrekt. Änder das mal folgendermaßen

  else if(robo_state==OFF) {
    analogWrite(pwmA_rechts,OFF);
    analogWrite(pwmB_links,OFF);
    digitalWrite(led_pin,LOW);
  }

Durch die fehlenden Klammern werden die nachfolgenden Befehle immer ausgeführt.

Gruß
Reinhard

Danke für die schnelle Antwort!
Leider funktioniert es immer noch nicht.

  1. Wenn ich meinen Taster zum einschalten drücke, startet das Programm nicht sofort sondern es Blinkt die Led am Arduino.(die man mit Pin 13 ansteuern kann) Wie ist das möglich?
    (Der Taster ist folgendermaßen angeschlossen: 1 Anschluss auf 5V und der Andere mit einem Pull-Down Widerstand von 2k2 auf Masse. Der Anschluss an dem Wid. geht auf den digitalen Eingang meines Arduinos.)
  2. Wenn der Roboter dann fahrt, und ein Hinderniss erkennt bleibt er einfach stehen und die Led geht aus.

mfg

Michael