Probleme mit meinem Rover-Code

Hallo!

Ich heiße Kai und bin gerade mit meinem ersten Arduino Projekt beschäftigt.
Es handelt sich dabei um einen Rover der zum Antrieb zwei gehackte Servos bekommen hat und zwei IR-Abstandssensoren von Sharp (Modell 2Y0A21) als seine Augen, damit er nicht überall gegenfährt.
Nach und nach sollen dann noch weitere Funktionen hinzugefügt werden, jedoch gibt es schon jetzt die ersten Probleme.

Und zwar reagiert der Rover nicht auf die Sensoren, die Servos drehen sich zwar jedoch auch immer sehr Ruckhaft und für nur kurze Zeit, nicht so schön flüssig wie man das immer auf Youtube so schön bestaunen kann. Ich habe nochmal meine Schaltung überprüft und kann dort keine Fehler finden, ich denke somit liegt es an meinen Programmierfähigkeiten.
Da es mein erstes Programm ist denke ich mal, dass ich ein paar fundermentale Dinge vergessen habe, bitte schaut euch das mal an und helft mir!

#include <Servo.h>

Servo servobr; //Rechter Servoantrieb
Servo servobl; //Linker Servoantrieb
int maxgeschw = 100; //Maximalgeschwindigkeit
int geschw = 0; //Momentan Geschwindigkeit
int sensorbr = 0; //Anfangswert Rechter Sensor
int sensorbl = 0; //Anfangswert Linker Sensor
int brstop = 90; //Stopwert für rechten Servoantrieb 
int blstop = 90; //Stopwert für linken Servoantrieb 
int richtung = 1; //Abwechselnder Richtungswert


void setup()
{
  pinMode(9, OUTPUT); //Setzt Pin9 von ServoBR als Output
  pinMode(10, OUTPUT); //Setzt Pin10 von ServoBL als Output
  servobr.attach(9); //Rechter Servoantrieb befindet sich auf Pin 9
  servobl.attach(10); //Linker Servoantrieb befindet sich auf Pin 10
}

void loop()
{
  sensorbr = analogRead(0); //Rechter Sensor liegt auf Pin Analog0
  sensorbl = analogRead(1); //Linker Sensor liegt auf Pin Analog1
  
  vorwaerts();
  
  
  if (sensorbr >= 300 && sensorbl >= 300) //Vollständiges Ausweichen
  {
    halt();
    delay(250);
    rueckwaerts();
    delay(1000);
    if (richtung%2==0)
    {
      rechts();
      delay(750);
    }
    else
    {
      links();
      delay(1000);
    }
    richtung+=1;
  }
  
  if (sensorbr >= 300) //Ausweichen nach Links
  {
    halt();
    delay(250);
    links();
    delay(750);
  } 
  
  if (sensorbl >= 300) //Ausweichen nach Rechts
  {
    halt();
    delay(250);
    rechts();
    delay(750);
  }
}

void vorwaerts() //Unterprogramm Vorwärts
{
  for (int i=0; i<=maxgeschw; i+=10)
  {
    geschw = i;
    servobr.write(brstop +geschw);
    servobl.write(blstop -geschw);
  }
}

void rueckwaerts() //Unterprogramm Rückwärts
{
  for (int i=0; i<=maxgeschw; i+=10)
  {
    geschw = i;
    servobr.write(brstop -geschw);
    servobl.write(blstop +geschw);
  }
}

void links() //Unterprogramm links abbiegen
{
  for (int i=0; i<=maxgeschw; i+=10)
  {
    geschw = i;
    servobr.write(brstop -geschw);
    servobl.write(blstop +geschw);
  }
}

void rechts() //Unterprogramm rechts abbiegen
{
  for (int i=0; i<=maxgeschw; i+=10)
  {
    geschw = i;
    servobr.write(brstop +geschw);
    servobl.write(blstop -geschw);
  }
}
void halt() //Unterprogramm anhalten
{
  servobr.write(brstop);
  servobl.write(blstop);
}

Hallo,

vielleicht geht es so besser:

#include <Servo.h>

Servo servobr; //Rechter Servoantrieb
Servo servobl; //Linker Servoantrieb
int maxgeschw = 100; //Maximalgeschwindigkeit
int geschw = 0; //Momentan Geschwindigkeit
int sensorbr = 0; //Anfangswert Rechter Sensor
int sensorbl = 0; //Anfangswert Linker Sensor
int brstop = 90; //Stopwert für rechten Servoantrieb
int blstop = 90; //Stopwert für linken Servoantrieb
int richtung = 1; //Abwechselnder Richtungswert
int geschw; // Servogeschwindigkeit


void setup()
{
  servobr.attach(9); //Rechter Servoantrieb befindet sich auf Pin 9
  servobl.attach(10); //Linker Servoantrieb befindet sich auf Pin 10
  geschw = 0; // starten mit Geschwindigkeit 0
}

void loop()
{
  sensorbr = analogRead(0); //Rechter Sensor liegt auf Pin Analog0
  sensorbl = analogRead(1); //Linker Sensor liegt auf Pin Analog1

  vorwaerts();


  if (sensorbr >= 300 && sensorbl >= 300) //Vollständiges Ausweichen
  {
    int i;

    halt();
    for (geschw = 0; geschw < maxgeschw; geschw += 10) {
      rueckwaerts();
      delay(50);
    }
//    delay(250);
    halt();
    for (geschw = 0; geschw < maxgeschw; geschw += 10) {
      if (richtung%2==0)
          rechts();
      else
        links();
      delay(50);
    }
//    delay(250);
    richtung+=1;
    halt();
  }
  else if (sensorbr >= 300) //Ausweichen nach Links
  {
    halt();
    for (geschw = 0; geschw < maxgeschw; geschw += 10) {
      links();
      delay(50);
    }
//    delay(250);
    halt();
  }
  else if (sensorbl >= 300) //Ausweichen nach Rechts
  {
    halt();
    for (geschw = 0; geschw < maxgeschw; geschw += 10) {
      rechts();
      delay(50);
    }
    delay(250);
    halt();
  }
}

void vorwaerts() //Unterprogramm Vorwärts
{
  if (geschw > maxgesch) geschw = maxgeschw;
  servobr.write(brstop +geschw);
  servobl.write(blstop -geschw);
}

void rueckwaerts() //Unterprogramm Rückwärts
{
  if (geschw > maxgesch) geschw = maxgeschw;
  servobr.write(brstop -geschw);
  servobl.write(blstop +geschw);
}

void links() //Unterprogramm links abbiegen
{
  if (geschw > maxgesch) geschw = maxgeschw;
  servobr.write(brstop -geschw);
  servobl.write(blstop +geschw);
}

void rechts() //Unterprogramm rechts abbiegen
{
  if (geschw > maxgesch) geschw = maxgeschw;
  servobr.write(brstop +geschw);
  servobl.write(blstop -geschw);
}

void halt() //Unterprogramm anhalten
{
  servobr.write(brstop);
  servobl.write(blstop);
}

Michael

Ich hätte auch als ersten Test die verschiedenen Verzögerungen (Delay) deaktiviert.

Falls du auch nicht sicher bist ob die Sensoren richtige Werte liefern, würde ich zuerst ein Test-Sketch schreiben und die Analogwerte prüfen.
Anschliessend würde ich jede einzelne Funktion einzeln austesten. Einfach systematisch vorgehen und nicht zu viel aufs Mal testen wollen.
Je mehr ungeprüfter Code vorhanden ist, umso mehr Fehler können sich darin befinden.

Wenn die einzelnen Funktion (Vorwärts, Rückwerts, Halt) wie erwartet laufen, kannst du diese zum gesamten Programm zusammenfügen.

Viel Erfolg.

Hallo Kai,

ich kann mich dem Post von Webmeister nur anschließen. Probiere die verschiedenen Funktionen einzeln aus.

Habe auch einen halb fertigen Bot hier liegen. Ebenfalls mit gehackten Servos. Dazu kann ich sagen das sie bei mir nicht mit gleichen Werten stoppen. Der eine Wert steht auf 90, der andere auf 88!

Das nur auch noch einmal als Tipp.

Lieben Gruß
Poldi

Hallo!

Danke für eure ganzen Tipps ich werde es dann erstmal so machen wir ihr mir geraten habt und das ganze Programm aufdröseln.
Leider hatte ich dazu bis jetzt noch keine Zeit ich hoffe aber das ich die ganze Geschichte an diesem Wochenende zum Ende bringen kann.

Mein Vorwärts-Unterprogramm läuft jetzt auch recht gut, aber es scheint wirklich Probleme mit den Sensoren zu geben, muss ich die noch Deklarieren (Dachte bei analogen Eingängen entfällt das) oder muss ich noch eine Abfragefrequenz oder ähnliches einbauen?

Letzte Frage: Stimmt es denn, dass ich mit der bisherig eingebauten Servo Bilbliothek nur zwei Servos ansteuern kann?