Problem mit meinem Roboter

Hallo!
Ich hab mir einen Roboter gebaut, der wenn er ein Hinderniss vor sich hat, zurückfahren und dann nach links fahren soll.
Den Sensor habe ich mir aus einem LDR und einer weißer LED gebaut(siehe Bild).
https://dl.dropbox.com/u/43915921/Foto%2003.01.13%2016%2056%2046.jpg
Mein Problem ist, dass wenn der Roboter ein Hinderniss entdeckt, schaltet er sich kurz aus, dann wieder ein und erst dann fährt er zurück und nach links.
Meine Frage ist, warum macht er das?

const int pwmA_rechts=10;  //rechter Motor
const int pwmB_links=11;   //linker Motoer
const int AIN1=2, AIN2=3, BIN1=4, BIN2=5; //AIN1,AIN2,BIN1 und BIN2 sind die steuereingänge des Motortreibers ( ob er Vorwährts oder Rückwährts fahren soll)
const int stby=6;
const int sensor_pin=1;
const int speed_pin=0;
const int sensor_led_pin=7, sensor_value_min=150;
int sensor_value;
int robo_speed;
int help=0, value;

//Unterprogramm zum Ansteuern der Motoren
void move(int motor, int motor_speed, int motor_direction);// motor: 1 oder 2(1: Motor A, 2: Motor B), speed: 0-255, direction: 1 oder 2 (1: vorwährts, 2: rückwährts)
void move(int motor, int motor_speed, int motor_direction)
{
 switch(motor)
 {
   case 1:
         switch(motor_direction)
         {
           case 1:
                 digitalWrite(AIN1,HIGH);
                 digitalWrite(AIN2,LOW);
                 break;
           case 2:
                 digitalWrite(AIN1,LOW);
                 digitalWrite(AIN2,HIGH);
                 break;
         }
         analogWrite(pwmA_rechts,motor_speed);
         break;
    case 2:
          switch(motor_direction)
          {
             case 1:
                   digitalWrite(BIN1,HIGH);
                   digitalWrite(BIN2,LOW);
                   break;
             case 2:
                   digitalWrite(BIN1,LOW);
                   digitalWrite(BIN2,HIGH);
                   break;
          }
         analogWrite(pwmB_links,motor_speed);
         break;
 }
}
           
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(sensor_led_pin,OUTPUT);
  digitalWrite(stby,HIGH);  //standby pin muss 1 seins damit die Motoren aktiv sind
  digitalWrite(sensor_led_pin,HIGH);
}

void loop()
{
  sensor_value=analogRead(sensor_pin);
  Serial.print("sensor_value: ");
  Serial.println(sensor_value);
  
  value=analogRead(speed_pin);  //die Geschwindigkeit kann mit einem Potentiometer eingestellt werden
  robo_speed=map(value,0,1023,200,255);
  Serial.print("robo_speed: ");
  Serial.println(robo_speed);
  
    if(help==0)// damit nicht immer nur ein Motor zuerst angsteuert wird und somit der Roboter eine leichte Kurve fahren würde
    {
      move(1,robo_speed,1);
      move(2,robo_speed,1);
    }
    else if(help==1)
    {
      move(2,robo_speed,1);
      move(1,robo_speed,1);
      help=0;
    }
    if(sensor_value > sensor_value_min)    //wenn ein Hinderniss kommt, soll er zurück fahren und dann eine Linkskurve fahren
    {
      move(1,robo_speed,2);
      move(2,robo_speed,2);
      delay(1000);
      move(1,robo_speed,1);
      move(2,robo_speed,2);
      delay(500);
    }
    help++;
}

Ich bin für jede Hilfe dankbar!

mfg
Michael

Netten Flitzer hast du da :). Ich könnt mich wegschmeißen :smiley: Der Roboter fährt, pflop, aus.

Wackelkontakt können wir ausschließen? So wie der gegen die Wand donnert, könnte ich es verstehen.

Was soll denn das sein?

//Unterprogramm zum Ansteuern der Motoren
void move(int motor, int motor_speed, int motor_direction);// motor: 1 oder 2(1: Motor A, 2: Motor B), speed: 0-255, direction: 1 oder 2 (1: vorwährts, 2: rückwährts)
void move(int motor, int motor_speed, int motor_direction)
{

Die erste Programmzeile mit dem Semikolon am Ende muss gelöscht werden.

Das ist der Prototyp vom Unterprogramm.
Hab die Zeile geschlöscht aber am Verhalten hat sich nichts geändert.

mfg
Michael

Mardetuino:
Wackelkontakt können wir ausschließen? So wie der gegen die Wand donnert, könnte ich es verstehen.

Einen Wackelkontakt kann man ausschließen, denn wenn ich den Roboter in der Hand halte und die andere Hand vor den Sensor halte passiert das selbe.

mfg
Michael

Wenn ich den Arduino statt den Batterien mit dem USB Kabel versorge, ist alles ganz normal.

mfg
Michael

Könntest du mal versuchen, mit der minimalen Geschwindigkeit rückwärts zu fahren?
Wenn das Problem dann noch besteht testweise einen delay von 200ms zwischen beiden Motoren beim Rückwärsfahren einbauen.

Ist das ein Reset ?

Kannst ja mal zum Überprüfen in setup was einbauen ( z.B. den Scheinwerfer 3* blinken lassen )
Kann sein, dass deine Batterie einen zu großen Spannungseinbruch hat, wenn die Motoren von volle Kraft voraus sofort auf rückwärts schalten.

Ist ja schon flott dein Kleiner, aber wenn er nicht vor der Wand zum Stehen kommt, ist er halt zu schnell. Dann brauchst du kein LDR sondern einen mechanischen Schalter :wink:

Das ist der Prototyp vom Unterprogramm.
Hab die Zeile geschlöscht aber am Verhalten hat sich nichts geändert.

Klar. Prototyp brauchst du nur für Funktionen, die verwendet werden bevor sie implementiert werden. ( Oder wenn sie in einer anderen Datei stehen )
Direkt hintereinander wie bei dir, ist es egal, ob du erst eine Dklaration schreibst oder nicht.

Ich hab vorhin zusätzlich eine 9V Batterie als Versorgung für die beiden Motoren verwendet und es funktioniert!
Danke für die für die ganzen Antworten!

mfg
Michael

michael_x:
Ist das ein Reset ?

Ja es ist ein Reset!

mfg
Michael

Ich hab es jetzt folgendermaßen gelöst.

  1. 2 neue Unterprogramme geschrieben:
void motorStop(int stbyPin)
{
  digitalWrite(stbyPin,LOW);
}

void motorStart(int stbyPin)
{
  digitalWrite(stbyPin,HIGH);
}
  1. Im setup() die Motoren gestartet mit motorStart(stby);
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);
  motorStart(stby);
  pinMode(sensor_led_pin,OUTPUT);
  digitalWrite(sensor_led_pin,HIGH);
}

und 3. wenn ein Hinderniss erkannt wurde, beide Motoren für eine Sekunde ausschalten und dann rückwährts fahren.

if(sensor_value > sensor_value_min)  
    {
      motorStop(stby);
      delay(1000);
      motorStart(stby);  
      motorMove(1,150,2);
      motorMove(2,150,2);
      delay(1000);
      motorMove(1,robo_speed,1);
      motorMove(2,robo_speed,2);
      delay(500);
    }

Habt ihr eine bessere Lösung?

mfg
Michael