Klar, sobald er den Strich verlässt gilt Bedingung 3: Mit SPEED vorwärts.
Hier sind wir nun am Beginn eines tollen neuen Linienfolgeprogramms made by inka ...
Nachtrag: Das ist mir natürlich peinlich, aber man sollte immer die Version Posten die auch im asuro läuft. Es war oben ein Bug drin, bei i==0 wurde MotorSpeed erst nach der } gesetzt. Sorry. Hier das selbe mit Korrektur:
Code:
#include "asuro.h"
#define SPEED 200
int speedLeft,speedRight;
unsigned int lineData[2];
int ADOffset;
void LineLeft (void) //fahre nach rechts zu linie
{
speedRight -=5; //rechts bremsen
if (speedRight < 100) speedRight = 100; //min speed rechts
}
void LineRight (void) //fahre nach links zu linie
{
speedLeft -=5; //links bremsen
if (speedLeft < 100) speedLeft = 100; //min speed links
}
void LineDemo(void)
{
int i;
unsigned char j;
FrontLED(ON);
// Die folgende Mehrfachabrage der LineDatas ist völlig sinnfrei!
for (j = 0; j < 255; j++) LineData(lineData); //differenzberechnung li-re
// Hier beginnt der Ernst des asurolebens
LineData(lineData);
// bei data[0]=data[1] ist adoffset=0 d.H. der Unterschied wird einmalig
// berechnet und als adoffset gespeichert das gibt Probleme bei
// Helligkeitsänderungen von der Seite bei der Fahrt.
// Es wird dann später auf grösser/kleiner null geprüft.
ADOffset = lineData[0] - lineData[1];
speedLeft = speedRight = SPEED;
MotorSpeed(speedLeft,speedRight);
for(;;) {
LineData(lineData);
i = (lineData[0] - lineData[1]) - ADOffset;
SerWrite("\n\r i: ",9);
PrintInt(i);
/* dadurch muss auch darauf geprüft werden, also i<0 oder i>0
aber bei i==0 darf nichts passieren, sonst ewige Kurve!
deshalb vorsichtshalber 3 vollwertige ifs
*/
if ( i > 0 ) {
//StatusLED(GREEN);
BackLED(OFF,ON); //blinker rechts
LineLeft(); //fahre nach rechts zu linie
}
if ( i < 0) {
//StatusLED(RED);
BackLED(ON,OFF); //blinker links
LineRight(); //fahre nach links zu linie
}
if ( i == 0) {
StatusLED(YELLOW);
speedLeft = speedRight = SPEED;
MotorSpeed(speedLeft,speedRight);
}
}
}
int main(void)
{
Init();
LineDemo ();
while(1);
return 0;
}
Das ganze ist natürlich nicht optimal. Der in adoffset gespeicherte Wert gilt nur für den Startpunkt, wirkt sich aber immer aus! Wie geschrieben, viel Spass beim Entwickeln eines eigenen Programms.
Lesezeichen