sitemap link mailform link home

Linienerkennung

Die Liniensensoren übergeben ihre Messwerte mittels der Funktion LineData() an das Hauptprogramm "main". Mit diesem Programm können die Messwerte mittels Infrarot am PC dargestellt werden - z.B. mit dem Terminalprogramm "Hercules":

#include "asuro.h"
#include "stdlib.h"

int main (void) {
    unsigned int data[2];
    Init ();
    FrontLED (ON);
    while (1) {
       LineData(data);
       char text[16];
       SerPrint("Sensorwerte links und rechts:");
       itoa(data[0], text, 10); /* Sensorwert links senden */
       SerPrint(text);
       SerPrint("+");
       itoa(data[1], text, 10); /* Sensorwert rechts senden */

       SerPrint(text);
       SerPrint("\r\n"); /* Zeilenvorschub */

       Msleep(1000);
      }
}

Screenshot10

Bei Verwendung dieses Testprogramms wird schnell deutlich, dass "feste" Werte für hellen bzw. dunklen Untergrund nicht zuverlässig funktionieren werden. Bei eingeschalteteter Deckenbeleuchtung ergeben sich ganz andere Werte als bei "Dämmerlicht".

 


 

Trotzdem versuchen wir es erst einmal mit festen Werten - zum Üben:

Das folgende Programm lässt die linke BackLED leuchten, wenn ein dunkler Untergrund "auftaucht". Ausgewertet wird erstmal nur der linke Liniensensor. Der Test ergab Werte für Schwarz bei 50 und für Weiß bei 100. Der Mittelwert ist  also 75. Die gemessenen Werte variieren aber stark - je nach Umgebungslicht.

#include "asuro.h"

#define OFFSET 75


int main (void) {
    unsigned int data[2];
    Init ();
    FrontLED (ON);
    while (1) {
      LineData (data);
       if (data[0] > OFFSET)
          BackLED (ON, OFF);
       else
          BackLED (OFF, OFF);
       }

}

 


 

Linienverfolgung "Typ Simpel"

Nun wollen wir einen einfachen Zweipunktregler programmieren.

Die Absolutwerte der Liniensensoren interessieren eigentlich nicht. Dieses simple Programm zeigt daher, dass allein mit der Differenz von linkem und rechtem Sensorwert ganz gut gearbeitet werden kann.

Es wird nur der Zustand "links heller als rechts" ausgewertet. Der ASURO pendelt ständig hin und her - auch bei geraden Linienstücken. Scharfe Knicke und enge Kurven werden nicht bewältigt. Außerdem funktioniert der Algorithmus am Besten, wenn der ASURO nach links (und nicht nach rechts) ausbricht. Dennoch ist es eindrucksvoll, dass der ASURO einer breiten und mäßig geschwungenen Linie gut folgen kann:

#include "asuro.h"

int main(void) {
    unsigned int data[2]; //Speicher bereitstellen
    Init();
    FrontLED(ON); // Linienbeleuchtung einschalten
    MotorDir(FWD,FWD); // Beide Motoren auf vorwärts
    while(1){ // Endlosschleife
       LineData(data); // aktuelle Helligkeitswerte erfassen
       if (data [0] > data [1] ) // links heller als rechts...
         {MotorSpeed(200,100);} // ... dann links mehr Gas geben...
       else
         {MotorSpeed(100,200);} // ... sonst rechts mehr Gas geben!
       }
return 0;
}

Ein gewisses Fine-Tuning kann man erreichen, indem man verschiedene Geschwindigkeitskombinationen ausprobiert.

Etwas besser geht es noch mit der Kombination MotorSpeed(50,200). Dann "wackelt" der ASURO zwar etwas mehr - aber die Linienverfolgung kann auch engeren Kurven besser folgen.


.

Letzte Änderung:
March 23. 2023 21:04:40
«    top    »