Von A zu B mit Umrundung von Hindernissen

Hallo, zurzeit versuch ich ein Roboter mit Chassis zu programmieren, der von A zu B fährt und dabei auf dem Weg liegende Hindernisse umrundet. Da ich mirt zwei Gleichstrommotoren arbeite, kann ich nur mit Delays und nicht mit Gradzahlen arbeiten, wodurch das etwas ungenau wird…
Ist aber nicht das Problem. Mein Problem ist die Hindernisumrundung, und die Merken der Positionen. Ich habe versucht mit Variablen zu arbeiten, aber ich komme nicht weiter (siehe Datei im Anhang bei Taster 2).
Ich bin dankbar für Unterstützung.

Arduino_Skript_4.ino (14.7 KB)

maxim10042005:
Ich habe versucht mit Variablen zu arbeiten, aber ich komme nicht weiter (siehe Datei im Anhang bei Taster 2).
Ich bin dankbar für Unterstützung.

Dein Sketch kompiliert nicht.
Die Variable Wiederholung ist nicht deklariert und der Rest fehlt ebenfalls:

Wiederholung = 0;
    while (XPosition <        || YPosition <         )

Ich schau nochmal drüber, ob ich den Code nicht kleiner bekomme bei sovielen Leerzeichen… Und was ist " // Flaschendrehen"? - Ja, ich weiss was das ist. :wink:

Hallo,
willkommen im Forum.

Mir ist noch nicht so ganz klar was Du wie vorhast. "Hinderniss umfahren" wie erkennst Du ein Hinderniss. Wie sieht ein Hinderniss aus. Irgendwo im Sketch taucht ein sensor auf der eine hell / dunkel Erkennung hat. Damit willst Du für eine bestimmte Zeit nur einen Motor laufen lassen, also ein stück nach rechts. Dann ist der Sensor wieder frei. Dann passsiert das Gleiche für den anderen Motor. Kommt ein Hinderniss immer nur von einer Seite ? Was meinst Du mit Position meken ?

So wie ich das sehe dreht das Ding jetzt immer nur ein Stück nach rechts und dann nach links. Ich denke u solltest die Strategie nochmals überdenken.

Wenn man auf einem schwarzen Strich langfahen willl benötigt man eigendlich 3 informatonen nach links , ok, nach rechts. Das kann man mit 2 Sensoren hinbekommen. Damit fährt man dann auf die rechte und klinke Kante von dem Strich.

Du hast da auch ein paar for schleifen drin die nicht komplett sind . delay mit nix in der Klammer. Einen analogen Sensor an A1 mit dem nichts gemacht wird. Die Aufgabenstellung ist schon ziemlich komplex. Schau Dir nochmal die Grundlagen an.

Es würde auch Sinn machen den Ausgägen in1.. in4 vernüftige Namen zu geben.

Also schreibe ein Programmablauf wann was wie passieren soll, meist stellt man dabei schon fest wenn logisch was nicht richtig ist. Wenn Du ein bischen Übung darin hast kannst Du dann fast aus jeder Textzeile eine Codezeile machen.

Heinz

Heinz

maxim10042005:
Ich bin dankbar für Unterstützung.

Ich hab Deinen Code mal kurz umgeschrieben.
Deine ausgelassenen Werte alle mit 1 ersetzt - mach den erstmal so, das er funktioniert.
Meine Formatierung ist etwas anders, drückst einfach STRG-T, wenns nicht gefällt.

int Taster1 = 11;
int Taster2 = 12;
int Taster3 = 13;

int AnalogerSensor = A1;
int Wert1;
int LED = 13;
int XPosition;
int YPosition;
int v = 200;
int  DWert;
int GSM1 = 10;
int in1 = 9;
int in2 = 8;
int GSM2 = 5;
int in3 = 7;
int in4 = 6;
int Sensor  = 2;

void setup()
  {
  pinMode(Taster1, INPUT);
  pinMode(Taster2, INPUT);
  pinMode(Taster3, INPUT);
  Serial.begin(9600);
  pinMode(GSM1, OUTPUT); // Die Motoren dienen als Output
  pinMode(GSM2, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(LED, OUTPUT);
  }


enum  {vorwaerts, halt, rueckwaerts};

void fahrlinks(const byte richtung)
  {
  switch (richtung)
    {
    case vorwaerts:
        {
        digitalWrite(in1, HIGH); // Da sich der Chassis vorwärts bewegen soll, wird das Signal an (in1, HIGH) und das Signal an (in2, LOW) gesetzt.
        digitalWrite(in2, LOW); // Eine Rückwärtsbewegung würde durch (in1, LOW) und (in2, HIGH) erzeugt werden
        break;
        }
    case halt:
        {
        digitalWrite(in1, LOW);
        digitalWrite(in2, LOW);
        break;
        }
    case rueckwaerts:
        {
        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);
        break;
        }
    }
  }

void fahrrechts(const byte richtung)
  {
  switch (richtung)
    {
    case vorwaerts:
        {
        digitalWrite(in3, HIGH);
        digitalWrite(in4, LOW);
        break;
        }
    case halt:
        {
        digitalWrite(in3, LOW);
        digitalWrite(in4, LOW);
        break;
        }
    case rueckwaerts:
        {
        digitalWrite(in3, LOW);
        digitalWrite(in4, HIGH);
        break;
        }
    }
  }

void loop()
  {
  if (digitalRead(Taster1) == HIGH)
    {
    DWert = digitalRead(Sensor);
    Serial.print("Wert : ");
    Serial.println(DWert);
    if (DWert == 1) // Wenn der digitale Wert 1 entspricht (also ein weißer Untergrund erfasst wird) ...
      {
      analogWrite(GSM1, v); // ... soll sich der linke Motor (GSM1) in Bewegung setzen, der Chassis also mit der Geschwindigkeit "v" nach rechts  fahren.
      fahrlinks(vorwaerts);
      fahrrechts(halt);
      }
    if (DWert == 0) //  ... Bis der digitale Wert 0 (also ein schwarzer Untergrund) erfasst wird. ...
      {
      analogWrite(GSM2, v); // ... Dann soll sich der rechte Motor (GSM2) in Bewegung setzen, der Chassis also mit der Geschwindigkeit "v" nach links fahren.
      fahrlinks(halt);
      fahrrechts(vorwaerts);
      }
    }
  if (digitalRead(Taster2) == HIGH)
    {
    Wert1 = analogRead(AnalogerSensor);
    Serial.println(Wert1);
    int XPosition = 0;
    int YPosition = 0;
    int Wiederholung = 0;
    while (XPosition < 1 || YPosition < 1)
      {
      if (Wert1 > 50)
        {
        digitalWrite(LED, LOW);
        analogWrite(GSM1, v);
        analogWrite(GSM2, v);
        fahrlinks(vorwaerts);
        fahrrechts(vorwaerts);
        YPosition++;
        }
      else  //wenn nicht...
        {
        digitalWrite(LED, HIGH); // …geht die LED an…
        analogWrite(GSM1, 0);
        analogWrite(GSM2, 0);
        analogWrite(GSM1, v);
        fahrlinks(vorwaerts);
        fahrrechts(halt);
        delay(1); //!
        if (Wiederholung < 50)
          {
          if (Wert1 > 50)
            {
            digitalWrite(LED, LOW);
            analogWrite(GSM1, v);
            analogWrite(GSM2, v);
            fahrlinks(vorwaerts);
            fahrrechts(vorwaerts);
            XPosition++;
            delay(1000);
            analogWrite(GSM1, 0);
            analogWrite(GSM2, 0);
            analogWrite(GSM2, v);
            fahrlinks(halt);
            fahrrechts(vorwaerts);
            delay(1); //!
            if (Wert1 > 50)
              {
              digitalWrite(LED, LOW);
              analogWrite(GSM1, v);
              analogWrite(GSM2, v);
              fahrlinks(vorwaerts);
              fahrrechts(vorwaerts);
              YPosition++;
              }
            else  //wenn nicht...
              {
              digitalWrite(LED, HIGH); // …geht die LED an…
              analogWrite(GSM1, 0);
              analogWrite(GSM2, 0);
              analogWrite(GSM1, v);
              fahrlinks(vorwaerts);
              fahrrechts(halt);
              delay(1);  //!
              digitalWrite(LED, LOW);
              analogWrite(GSM1, v);
              analogWrite(GSM2, v);
              fahrlinks(vorwaerts);
              fahrrechts(vorwaerts);
              XPosition++;
              Wiederholung++;
              }
            }
          }
        else  //wenn nicht...
          {
          digitalWrite(LED, HIGH); // …geht die LED an…
          analogWrite(GSM1, 0);
          analogWrite(GSM2, 0);
          analogWrite(GSM2, v);
          fahrlinks(halt);
          fahrrechts(vorwaerts);
          delay(1);  //!
          }  // von A zu B fahren mit Hindernissen
        if (Wiederholung < 50)
          {
          if (Wert1 > 50)
            {
            digitalWrite(LED, LOW);
            analogWrite(GSM1, v);
            analogWrite(GSM2, v);
            fahrlinks(vorwaerts);
            fahrrechts(vorwaerts);
            XPosition--;
            delay(1000);
            analogWrite(GSM1, 0);
            analogWrite(GSM2, 0);
            analogWrite(GSM1, v);
            fahrlinks(vorwaerts);
            fahrrechts(halt);
            delay(1);  //!
            if (Wert1 > 50)
              {
              digitalWrite(LED, LOW);
              analogWrite(GSM1, v);
              analogWrite(GSM2, v);
              fahrlinks(vorwaerts);
              fahrrechts(vorwaerts);
              YPosition++;
              }
            else  //wenn nicht...
              {
              digitalWrite(LED, HIGH);
              analogWrite(GSM1, 0);
              analogWrite(GSM2, 0);
              analogWrite(GSM2, v);
              fahrlinks(halt);
              fahrrechts(vorwaerts);
              delay(1);  //!
              digitalWrite(LED, LOW);
              analogWrite(GSM1, v);
              analogWrite(GSM2, v);
              fahrlinks(vorwaerts);
              fahrrechts(vorwaerts);
              XPosition--;
              }
            }
          }
        else  //wenn nicht...
          {
          digitalWrite(LED, HIGH);
          analogWrite(GSM1, 0);
          analogWrite(GSM2, 0);
          analogWrite(GSM2, v);
          fahrlinks(halt);
          fahrrechts(vorwaerts);
          delay(1);  //!
          digitalWrite(LED, LOW);
          analogWrite(GSM1, v);
          analogWrite(GSM2, v);
          fahrlinks(vorwaerts);
          fahrrechts(vorwaerts);
          YPosition--;
          delay(1000);
          analogWrite(GSM1, 0);
          analogWrite(GSM2, 0);
          analogWrite(GSM2, v);
          fahrlinks(halt);
          fahrrechts(vorwaerts);
          delay(1);   //!
          if (Wiederholung < 50)
            {
            if (Wert1 > 50)
              {
              digitalWrite(LED, LOW);
              analogWrite(GSM1, v);
              analogWrite(GSM2, v);
              fahrlinks(vorwaerts);
              fahrrechts(vorwaerts);
              XPosition++;
              }
            else
              {
              digitalWrite(LED, HIGH);
              analogWrite(GSM1, 0);
              analogWrite(GSM2, 0);
              analogWrite(GSM1, v);
              fahrlinks(vorwaerts);
              fahrrechts(halt);
              delay(1);  //!
              digitalWrite(LED, LOW);
              analogWrite(GSM1, v);
              analogWrite(GSM2, v);
              fahrlinks(vorwaerts);
              fahrrechts(vorwaerts);
              YPosition--;
              delay(1000);
              analogWrite(GSM1, 0);
              analogWrite(GSM2, 0);
              analogWrite(GSM2, v);
              fahrlinks(halt);
              fahrrechts(vorwaerts);
              delay(1);  //!
              }
            }
          }
        }
      }
    }
  if (digitalRead(Taster3) == HIGH)
    {
    delay(1000);
    analogWrite(GSM1, v);
    analogWrite(GSM2, v);
    fahrlinks(vorwaerts);
    fahrrechts(rueckwaerts); //Flaschendrehen
    delay(2000);
    analogWrite(GSM1, v);
    analogWrite(GSM2, v);
    fahrlinks(vorwaerts);
    fahrrechts(vorwaerts);
    delay(500);
    }
  }