Line follower Code

Hallo Leute ,
Ich habe seit Tagen ein Problem mit dem Linienfolger-Projekt. Ich hoffe jemand mit Erfahrung diesbezüglich nimmt sich etwas Zeit und hilft mir bei dieser Problematik.
Ich habe den Schaltplan erstellt ,den kleinen Roboter dementsprechend gebaut und anschließend den Programmierungscode geschrieben , allerdings lässt sich Nichts bewegen .

Den Schaltplan findet ihr im hochgeladenen Bild

und so sieht der Code aus :

#define SensLinks_Digital 10
#define SensLinks_PowerVcc 12
#define SensLinks_PowerGnd 11

#define SensRechts_Digital 1
#define SensRechts_PowerVcc 3
#define SensRechts_PowerGnd 2

#define Motor_links1 6
#define Motor_links2 5

#define Motor_rechts1 7 
#define Motor_rechts2 8

void setup() {

Serial.begin (9600);

pinMode ( SensLinks_Digital , INPUT );
pinMode ( SensRechts_Digital , INPUT );

pinMode ( SensLinks_PowerVcc , OUTPUT );
pinMode ( SensLinks_PowerGnd , OUTPUT);

pinMode (SensRechts_PowerVcc , OUTPUT );
pinMode ( SensRechts_PowerGnd, OUTPUT);

pinMode ( Motor_links1 , OUTPUT );
pinMode ( Motor_links2 , OUTPUT );
pinMode ( Motor_rechts1 , OUTPUT );
pinMode ( Motor_rechts2 , OUTPUT );

digitalWrite ( SensLinks_PowerVcc , HIGH );
digitalWrite ( SensLinks_PowerGnd , LOW );

digitalWrite ( SensRechts_PowerVcc , HIGH );
digitalWrite ( SensRechts_PowerGnd , LOW );


}

void loop()
{

if( ! digitalRead (SensLinks_Digital ) &&  ! digitalRead (SensRechts_Digital)) 
{

digitalWrite ( Motor_links1 , HIGH );
digitalWrite ( Motor_links2 , LOW );

digitalWrite ( Motor_rechts1 , HIGH );
digitalWrite ( Motor_rechts2 , LOW );

}


if(  digitalRead (SensLinks_Digital ) &&  ! digitalRead (SensRechts_Digital))
{

digitalWrite ( Motor_links1 ,LOW );
digitalWrite ( Motor_links2 , LOW );

digitalWrite ( Motor_rechts1 , HIGH );
digitalWrite ( Motor_rechts2 , LOW );

}

if( ! digitalRead (SensLinks_Digital ) &&  digitalRead (SensRechts_Digital) )

{

digitalWrite ( Motor_links1 ,HIGH );
digitalWrite ( Motor_links2 , LOW );

digitalWrite ( Motor_rechts1 , LOW );
digitalWrite ( Motor_rechts2 , LOW ) ;

}

}

Ich habe mehrmals den Code umgeschrieben um festzustellen , woran es genau liegt. Was ich allerdings festgestellt habe ist wahnsinnig und verwirrend. Es funktioniert erstaunlicheweise nur in zwei Fällen , und die erwähne ich auch :

Fall 1 :
In der if-Abfrage steht nur ein Infrarrotsensor ( also nur der eine Sensor liefert die Signale während der andere abgeschaltet ist ). Folgender Code erklärt das :
Kopf wie im obigen Code. Und jetzt direkt zum LoopTeil :

void loop()
{

if( ! digitalRead (SensLinks_Digital )) 
{

digitalWrite ( Motor_links1 , HIGH );
digitalWrite ( Motor_links2 , LOW );

digitalWrite ( Motor_rechts1 , HIGH );
digitalWrite ( Motor_rechts2 , LOW );

}

if(  digitalRead (SensLinks_Digital )))
{

digitalWrite ( Motor_links1 ,LOW );    // hier überall " LOW " nur um zu testen ob sich überhaupt was antut.
digitalWrite ( Motor_links2 , LOW );   // Test-Anweisung

digitalWrite ( Motor_rechts1 , LOW );
digitalWrite ( Motor_rechts2 , LOW );

Fall 2 :
in der if-Abfrage stehen beide Sensoren ( also beide Sensore liefern die Signale ) aber die zweite Bedingung ( was oben im ersten Code auch in eine andere if-Abfrage ausgeführt wurde ) steht diesesmal in eine " else " Verknüpfung. folgender Code erklärt das :

if( ! digitalRead (SensLinks_Digital ) &&  ! digitalRead (SensRechts_Digital))
{

digitalWrite ( Motor_links1 ,HIGH);
digitalWrite ( Motor_links2 , LOW );

digitalWrite ( Motor_rechts1 , HIGH );
digitalWrite ( Motor_rechts2 , LOW );

}

else
{

digitalWrite ( Motor_links1 ,LOW );   // Hier genauso überall " LOW " nur als Test -Anweisung .
digitalWrite ( Motor_links2 ,LOW );

digitalWrite ( Motor_rechts1 , LOW );
digitalWrite ( Motor_rechts2 , LOW ) ;

}
}

Nur unter die obigen Fälle läuft der Roboter schon gut . Jetzt und nach intensiver Überlegung kann ich in diesem Rätsel gar nicht den Fehler erkennen.
Villeicht hilft mir jemand hier . Darauf würde ich mich total freuen.
Vielen Dank

Dein Code ist sehr schlecht lesbar. Drücke in der IDE Strg-T, damit der Code zumindest schön eingerückt/strukturiert ist, lösche überflüssige Zeilen und fasse Dinge logisch zusammen.

Wenn Du das Ergebnis hier in Code-Tags postest, guckt man gleich viel lieber drüber.

Gruß

Gregor

Moin,
du hast ein sehr populäres Projekt.
Nehme eine Suchmaschine deiner Wahl und beschäftige diese mit: line follower arduino code

Hallo,

Warum schliesst Du die beiden Sensoren nicht direkt an 5V und GND an. Es gibt doch eigentlich nur drei Fälle.

  1. beide Sensoren erkennen Low, dann ist das Ding in der mitte und soll geradeaus fahren
  2. Sensor1 ist H, Sensor 2 ist Low , dann ist das Fahrzeug z.B zu weit links und muss nach rechts fahren.
  3. Sensor2 ist H , Sensor 1 ist low , dann ist das Fahrzeug zu weit rechts und muss nach links fahren.

Jetzt musst Du ein bischen aufpassen , wenn z.B im Fall b das Fahrzeug zu weit links ist dann erkennt der rechte Sensor ja zunächst mal den Streifen. Wenn es jetzt aber das Fahrzeug noch weiter nach links kommt und somit der rechte Sensor über den Streifen hinaus fährt sind beide wieder LOW, was eigendlich ja geradeaus bedeuten würde, das wäre aber falsch. Das Fahrzeug soll ja erst mal weiter nach rechts fahren, und zwar z.B so lange bis der linke Sensor einmal den Streifen wieder gesehen hat. Allerdings würde dann letztlich das Fahrzeug immer im Zick-Zack fahren, was auch nicht so toll ist.

Damit das Ganze jetzt optimal läuft gibt es verschieden Startegien, man könnte auch mit den passende Flanken arbeiten. Also dem Wechsel eines Sensors von L auf H , bzw von H auf L . Also fährt der Sensor gerade auf die Linie auf , oder verläß er sie gerade.

Was da jetzt optimal ist weiß ich nicht, dazu hat paulpauson Dir schon einen Tipp geschrieben.

Heinz

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.