Was macht er nicht? Beschreibe genau was er macht (z.B. fährt geradeaus, trifft auf Hindernis, dreht sich nach links und fährt nicht mehr geradeaus sondern dreht weiter).

Grundsätzlich entspricht das Programm nicht dem was ich oben als Pseudocode geschrieben habe (ist aber egal). An deiner Stelle würde ich nicht nur mit einfachen "If" Anweisungen sondern mit "If-else" Anweisungen arbeiten. Der Grund ist relativ einfach. Als Beispiel:
Code:
if (drehrichtung == linksdrehung)
{
...
...
...
drehrichtung = rechtsdrehung;
} if (drehrichtung == rechtsdrehung) {
...
...
...
drehrichtung = linksdrehung;
}
Somit wird zuerst die Schleife mit Linksdrehung ausgeführt, dort wird der Wert geändert. Anschließend wird in der nächsten Schleife auf Rechtsdrehung geprüft, diese ist auch war und wird deswegen ausgeführt. Wenn du stattdessen ein else einsetzt ist das nur eine Schleife und der else Zweig wird nicht ausgeführt (außer wenn das Programm wieder auf diese if Schleife kommt).

Wenn du auf mehrere Werte prüfen willst kannst du z.B so schreiben
Code:
if (variable == 1)
{
}
else if (variable == 2)
{
}
else
{
}
Wo die Delays hinkommen ist grundsätzlich egal (optimal wäre wenn du garkeines brauchst da der Controller in dieser Zeit nichts macht). Du musst immer bedenken was passiert wenn du das Delay an einen Platz setzt.
Als Beispiel du liest einen Sensor ein und steuerst daraufhin einen Motor an.
Code:
Lese Infrarot
Delay
if (Infrarot <100)
{
Motor (200,-200)
} Motor (200,200)
So wie das Programm jetzt ist ist es sinnlos, da du nach dem Einlesen des Sensors zwar den Motor so ansteuerst das er ausweicht, jedoch im "selben" Moment den Motor wieder geradeausfahren lässt. Das Motor (200,-200) wirst du nicht merken da das viel zu schnell geht, gleichzeitig ist das Delay sinnlos da du nach dem auslesen wartest bis du den Motor ansteuerst.

Wenn du hingegen das Delay nach Motor(200,-200) hinschreibst wird der für die Zeit des Delays in die Gegenrichtung drehen. Dann ist es sinnvoller. In etwa so:
Code:
Lese Infrarot
if (Infrarot < 100)
{
Motor (200, -200) Delay
} Motor (200, 200)



Wenn du die Entfernung auf die er reagiert ändern willst musst du den Wert des Limits ändern. Du musst wissen üb der Wert proportional oder nicht proportional zur Entfernung ist. Je nachdem muss der Wert größer oder kleiner werden. Wenn du es nicht weißt wäre es am einfachsten wenn du ein Messgerät nimmst und misst.

Das mit dem Hängenbleiben könntest du lösen indem du die Werte für rechten Motor und linken Motor änderst. z.B. Motor(0, -200) => ein Motor steht und der andere Dreht mit Geschw. 200.

So wie ich dein Programm jetzt verstanden habe (habe mir jetzt den Zeig für Linksdrehung angeschaut):
> Du fährst vorwärts bis zum Hindernis
> drehst nach links bis kein Hindernis erkannt wurde
> anschließend fährst du zurück bis das Infrarot über einem Limit ist
> jetzt fährst du langsamer als vorher nach rechts (motor (-100, 100))

Geradeaus fährst du garnichmehr da du die Variable Drehrichtung nicht mehr auf geradeaus stellst.

MfG Hannes