Hallo
Mit etwas Glück und gleichmässiger Raumbeleuchtung fährt mein asuro nun mit deinem leicht geänderten Programm nach dunklen Fliesenfugen:
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 -=2; //rechts bremsen
if (speedRight < 100) speedRight = 100; //min speed rechts
}
void LineRight (void) //fahre nach links zu linie
{
speedLeft -=2; //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;
}
Nachtrag: Mit einer Geschw. Korrektur von +-5 macht er's etwas besser! Ich setze den asuro beim Start ungefähr mittig in Fahrtrichtung auf die Linie.
Gruß
mic
Lesezeichen