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;
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert