verbessertes Programm zum Linienfolger
In einem früheren Post ist eine PDF-Datei hinterlegt, welche das einfache und das verbesserte Linienfolger-Programme als Listing enthält und den Bestückungsplan dazu. Damit Ihr das verbesserte Programm direkt mit Kopieren/Einfügen auf Eurem PC verwenden könnt, ist es hier nochmal direkt gelistet:
void folgeLinieProVersion( void )
{
// Variablen müssen ganz am Anfang einer Funktion erstellt werden
uint korrektur = 0; // wir setzen den Korrekturwert gleich auf 0, damit nicht korrigiert wird.
// Das ist ganz praktisch wenn wir außerhalb der Linie starten, denn dann fährt der
// Roboter erstmal geradeaus bis er die Linie findet.
uint hellLinks;
uint hellRechts;
// Endlosschleife
while ( 1 )
{
// beide Sensoren einlesen
hellLinks = SensorLinks();
hellRechts = SensorRechts();
// sind wir mit beiden Sensoren auf der Linie, also der linke UND (&&) der rechte Sensor dunkel?
if ( ( hellLinks <= 50 ) && ( hellRechts <= 50 ) )
{
// ja, also geradeaus
setzeMotorLinks( 1 );
setzeMotorRechts( 1 );
}
else
{
// sind wir links, halb auf der Linie?
if ( ( hellLinks > 50 ) && ( hellRechts <= 50 ) )
{
// ja, also nach rechts korrigieren.
setzeMotorLinks( 1 );
setzeMotorRechts( 0 );
// wir merken uns, dass wir zu weit links waren
korrektur = 1;
}
else
{
// sind wir rechts, halb auf der Linie?
if ( ( hellLinks <= 50 ) && ( hellRechts > 50 ) )
{
// ja, also nach links korrigieren
setzeMotorLinks( 0 );
setzeMotorRechts( 1 );
// wir merken uns, dass wir zu weit rechts waren
korrektur = 2;
}
else
{
// hier kann nur noch hell / hell vorliegen, also dass wir komplett weg von der Linie sind.
// Jetzt kommt es darauf an, auf welche Seite wir die Linie verlassen haben.
// Zum Glück haben wir uns das in der Variable "korrektur" gemerkt!
if ( korrektur == 1 )
{
// wir waren zu weit links, also nach rechts korrigieren
setzeMotorLinks( 1 );
setzeMotorRechts( 0 );
}
else
{
if (korrektur == 2 )
{
// wir waren zu weit rechts, also nach links fahren
setzeMotorLinks( 0 );
setzeMotorRechts( 1 );
}
else
{
// Sonderfall: sollten wir schon neben einer Linie starten, also korrektur noch 0 sein, fahren wir
// einfach geradeaus und hoffen, dass irgendwann eine Linie kommt.
setzeMotorLinks( 1 );
setzeMotorRechts( 1 );
}
}
}
}
}
}
}
int main( void )
{
initHardware();
//fahreQuadrat();
//folgeLinie();
folgeLinieProVersion();
// Endlosschleife, damit die LED und die Motoren weiter arbeiten
while (1)
;
return 0;
}
