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