Hallo

Mit SPEED gibt man die maximale Geschwindigkeit an, mit STEP die Stärke der Reaktion auf eine Abweichung von der Linie. Diese Reaktion sollte man noch vom Helligkeitsunterschied abhängig machen:

Code:
#include "asuro.h"

#define SPEED  175
#define STEP 5

int speedLeft,speedRight;
unsigned int lineData[2];
int ADOffset;

void LineLeft (void)
{
   speedLeft  += STEP;
   if (speedLeft > SPEED)
	{
		speedLeft = SPEED;
		speedRight  -= STEP;
	}
}

void LineRight (void)
{
   speedRight  += STEP;
   if (speedRight > SPEED)
	{
		speedRight = SPEED;
		speedLeft  -= STEP;
	}
}

int main(void)
{
int i;
unsigned char j;

   Init();

   FrontLED(ON);
   for (j = 0; j < 0xFF; j++) LineData(lineData);
   LineData(lineData);
   ADOffset = lineData[0] - lineData[1];
   speedLeft = speedRight = SPEED;
   for(;;) {
      LineData(lineData);
      i = (lineData[0] - lineData[1]) - ADOffset;
      if ( i > 4) {
         StatusLED(GREEN);
         LineLeft();
      }
      else if ( i < -4) {
         StatusLED(RED);
         LineRight();
      }
      else {
         StatusLED(OFF);
         speedLeft = speedRight = SPEED;
      }
      MotorSpeed(speedLeft,speedRight);
   }
   return(0);
}
Ich kann es nicht testen weil mein asuro grad zerlegt ist.

speedLeft = speedRight = SPEED;

Das ist kritisch weil nicht sicher ist ob beide Seiten bei gleicher SPEED gleichschnell drehen wenn wir genau auf der Linie sind.

Bauchgefühlsmässig könnte nach dem MotorSpeed(speedLeft,speedRight); noch ein Sleep(100); reinpassen.

Gruß

mic