Programmierung eines Roboterarms mit Ultraschallsensor.

(deleted)

noiasca:
die 1te Herausforderung ist dir beizubringen, wie mach Code postet.

Die einfachste Variante: In der IDE mit der rechten Maustauste in den Codebereich klicken, 'für Forum kopieren' auswählen, hier im Post einfügen.

Und....geht es auch ein wenig genauer ?
Was macht dein Sketch ?
Was soll er machen ?
Was macht er nicht?

Alte Programmierweisheit:

In 99,5% aller Fälle: Der Bug hat seine Hände auf der Tastatur und starrt auf den Bildschirm.

Wenn das Programm etwas anderes macht als man erwartet. Dann versteht man sein Programm noch nicht ganz.
Dagegen hilft in vielen Fällen ausführlicher Debug-Output auf den seriellen Monitor.

      if (stellung = true) //Anschlüsse definieren hat bereits stellung = true gesetzt
        {
		  Serial.print( "1: if (stellung = true) stellung hat Wert #");
		  Serial.println(stellung);
		  Serial.println("#");
		  
          //led's wechseln status
          digitalWrite(12,LOW);
          digitalWrite(13,HIGH);
          //servos stellung 2 wird angefahren
          myservo1.write(50,20,false);
          myservo2.write(50,20,false);
          myservo3.write(80,20,false);
          myservo4.write(60,20,true);
          delay(3000); //Zeit zum Anfahren
        } 
		
		stellung =! stellung; //Damit das Board weiß, wo der Roboter steht, wird die bool geändert.
		Serial.print( "2: stellung =! stellung; stellung hat Wert #");
		Serial.println(stellung);
		Serial.println("#");
		  
     
         // NUN SOLL NICHTS GESCHEHEN, BIS DIE ERSTE if-bedingung (entfernung < 5) ERNEUT AUSGELÖST WIRD.
         // Da stellung = false ist, wird die zweite if-schleife ausgeführt

//FRAGE: Überspringt das Programm, nachdem es stellung = true ausgeführt hat, die nachfolgende if-schleife? Ich habe das Gefühl nein.
//Antwort: nicht auf das "Gefühl" verlassen sondern die Warheit ans Licht bringen durch debug-output
       if (stellung = false)
        {
		  Serial.print( "3: if (stellung = false) stellung hat Wert #");
		  Serial.println(stellung);
		  Serial.println("#");
		  
          //led's wechseln status
          digitalWrite(12,LOW);
          digitalWrite(13,HIGH);
          //servos stellung 1 wird angefahren
          myservo1.write(10,20,false);
          myservo2.write(10,20,false);
          myservo3.write(100,20,false);
          myservo4.write(60,20,true);
          delay(3000);
        } 
		stellung =! stellung; //Damit das Board weiß, wo der Roboter steht, wird die bool geändert.
		Serial.print( "4: stellung =! stellung; stellung hat Wert #");
		Serial.println(stellung);
		Serial.println("#");

viele Grüße Stefan

(deleted)

(deleted)

(deleted)

(deleted)

noiasca:
mit

stellung = true

weist du der Variable stellung den Wert true zu.

Das Problem dabei ist, dass es kein syntaktischer Fehler ist, weshalb der Compiler keine Fehlermeldung erzeugt. Der Wert der Zuweisung ist in diesem Fall eben 'true', und das wird dann in der if-Bedingung verwendet ( was heißt, dass der vom if abhängig Codeblock immer ausgeführt wird).

Ich kann nur empfehlen, in den Voreinstellungen die 'Compiler-Warnungen' einzuschalten. Dann gibt es auch Meldungen bei Konstrukten, die zwar nicht generell falsch sind, aber zu Fehlern führen können oder dem Compiler 'suspekt' sind weil es nicht sinnvoll ist. Wenn man 'sauber' programmiert, sollte es auch keine - oder zumindest fast keine - Warnings geben. Und es lohnt sich auf jeden Fall jeder Compiler-Warnung auf den Grund zu gehen. Sehr häufig steckt ein echter Fehler dahinter, der sich erst im Ablauf bemerkbar macht.

marvinbayer_:
2) Eine eher allgemeine Frage: Ich habe hier zwei If-Schleifen ohne else. Kann das über längere Sicht zu einem Problem werden? Z.B. Laufzeit-Error?

Es gibt keine if-Schleifen ( da wiederholt sich nichts ) sondern nur if-Bedingungen bzw. if-Blöcke. Und der else-Zweig ist optional, den kann man ohne weiteres weglassen.

marvinbayer_:
Nach Anfahren der zweiten Position fährt er jedoch sofort wieder automatisch in die erste Position zurück…

Deshalb sind mir jetzt noch zwei Sachen unklar:

  1. Muss ich den Controller den Entfernungswert vergessen lassen? Z.b. durch Entfernung = 10 (Mir kommt es so vor als würde er sie eine Zeit speichern und deshalb gleich wieder zurückfahren) Evtl. fehlt auch ein break um aus der Schleife zu springen?

Du misst in jedem loop-Durchlauf die Entfernung, und solange das einen Wert < 5 ergibt, wird auch dein entsprechender if-Block in jedem loop-Durchlauf ausgeführt. Durch das Toggeln von ‘Led’ abwechsselnd der erste, und beim nächsten der 2. if Block und dann wieder von vorn.

Deine beiden Abfragen von ‘led’ sind eigentlich ein typische Anwendungsfall von ‘else’: wenn led nicht ‘true’ ist ( erste Abfrage ) kann es nur ‘false’ sein ( 2. Abfrage ). Also ist

if ( led == true ) {
  ..
} else {
..
}

Das Gleiche wie deine beiden Abfragen.

P.S. Das mit der ‘Herausforderung’ im Thread-Titel sollte Du wiklich ändern …

(deleted)

marvinbayer_:
Sozusagen arbeitet er nach einmaligem Ultraschallsensor-Signal, beide inneren If-Blöcke ab.

Was meinst Du mit 'einmaligem Ultraschallsignal' ? Du hast kein einmaliges Ultraschallsignal. Wie ich schon geschrieben habe wertest Du das Ultraschallsignal doch in jedem loop aus. Dementsprechend reagiert er auch in jedem loop darauf.
Was bezweckst Du denn mit dieser Anweisung:

        led =! led;

Dadurch wird ja das ständige Hin- und Herfahren ausgelöst.

Und was soll denn passieren wenn entfernung > 5 wird? Da passiert im Sketch ja gar nichts.

(deleted)

marvinbayer_:
Der Roboter fährt, nach dem ich über den Sensor gewischt habe, von Position 1 in Position 2. Dort sollte er dann eigentlich solange warten, bis ich wieder über den Sensor wische. Aber er wartet nicht, sonder fährt direkt wieder von Position 2 in Position 1.

Verstehe ich das richtig: sobald die entfernung < 5 erkannt wird soll er einen Schritt machen, dann warten bis entfernung wieder größer 5 wird, und wenn’s dann wieder kleiner wird als 5 den nächsten Schritt?

Dann musst Du dir merken, dass er einen Schritt gemacht hast. Wenn der Merker gesetzt ist, macht er erstmal nichts mehr. Wenn die Entfernung dann wieder >5 erkannt wird, dann kannst Du den Merker wieder zurücksetzen, damit er den nächsten Schritt machen kann.
Also etwa so:

  if (entfernung < 5 && !schrittAusgefuehrt )
  {
    schrittAusgefuehrt = true;
    ...
    ...
  }
  if (entfernung >= 5  )
  {
    schrittAusgefuehrt = false;
  }

(deleted)

Das entspricht aber nicht dem, was ich vorgeschlagen habe, und kann auch eigentlich nicht wirklich funktionieren.
Was willst Du z.B. damit erreichen:

      schrittAusgefuehrt != true;

Das ist ein einfacher Vergleich, der aber nicht ausgewertet wird.
Du veränderst dein 'schrittAusgefuehrt' nie.

(deleted)