Hallo,

anbei das Programm, mit welchem myIrAsuro im Qualifying der RobotChallenge letztes Wochenende in Wien die 354cm lange Strecke in 10.1s (mit 35.05cm/s) schaffte (12. Platz, der erste Robby schaffte 60.00cm/s).
Mit diesem Programm schaffte Robertor, als er noch ein Standard-Asuro war (mit roter LED, bei völliger Dunkelheit im Raum) 9.22s auf 357cm der Strecke Qualifying 2006, also 38.72cm/s (siehe folgenden Beitrag), bei einer Maximalgeschwindigkeit von 45cm/s (geradeaus).

Das Programm ist recht einfach, ohne PID-Regler oder ähnliches. Bis zur Standard-Asuro-Geschwindigkeit von 45cm/s war dies auch ausreichend; jetzt mit Endgeschwindigkeiten von 1.1m/s (myIrAsuro) und 1.8m/s (Robertor, siehe Beitrag Asuro "upside down") werde ich mich wohl doch mit dem Thema (PID-)Regelung auseinandersetzen müssen ...

Das ganze Programm ist als state-machine realisiert -- der Asuro weiß zu jedem Zeitpunkt, ob er auf der Linie ist (ON_LINE), links daneben (OFF_LEFT) oder rechts daneben (OFF_RIGHT).

Auf der Linie fährt er einfach voll geradeaus, wenn er links daneben ist, fährt er einen Kreis nach rechts, und wenn er rechts daneben ist, fährt er einen Kreis nach links -- das war's!

Dieses Programm hat die Eigenschaft, daß "normalerweise" der Asuro beim Verlassen am Ende der Linie er diese wieder mittels eines Kreises nach rechts oder links sucht, und dann dieselbe Strecke wieder zurückfährt ...
Code:
//
// Program used by "myIrAsuro" in qualifying for competition 
// "Parallel Slalom" of RobotChallenge 2007 in Vienna (24th march):
// http://www.robotchallenge.at
//
// Time 10.1s for 354cm, that is speed 35.05cm/s (best was 60.00 cm/s).
//
// myIrAsuro has reduction of 1:12.5 (Asuro standard is 1:25), see:
// https://www.roboternetz.de/phpBB2/viewtopic.php?t=28876
//
// The entries 0xFF for both SPEED values below will work on 
// a standard Asuro with speed < 0.5m/s.
//
// The value for THRESHOLD must be changed if no IR-FrontLED 
// with white shield is used, see:
// https://www.roboternetz.de/phpBB2/viewtopic.php?t=29109
//
//
// Robot will have to be placed on the line for starting!
//
// After starting the StatusLED of Asuro will blink [ready].
// After (any) switch is pressed both BackLED's turn on [steady].
// Releasing the switch will start the Robot [go].
//
#include <asuro.h>

#define OFF_LEFT  -1 
#define ON_LINE   0
#define OFF_RIGHT +1

#define SPEED  0xdF // 0xFF
#define SPEED1 0xbF // 0xFF
#define SPEED2 0x00 

#define THRESHOLD  1100 

void RaceStart(void); // blink until any switch is pressed, 
                      // then wait until switch is released


int main(void)
{
  unsigned int sum,data[2];

  int position = ON_LINE;

  Init();

  RaceStart();
  
  FrontLED(ON);   
  MotorDir(FWD,FWD);
  MotorSpeed(SPEED,SPEED);

  while (1)                  // state machine: position on/off the line
  {
    LineData(data);
    sum = data[LEFT] + data[RIGHT];


	 if (sum>=THRESHOLD)      // not on the line
    {
	   if (position==ON_LINE) // switch state if previously on the line
      {
 	    position = (data[LEFT]<data[RIGHT]) ? OFF_RIGHT : OFF_LEFT;

        BackLED( (position==OFF_LEFT)?ON:OFF, (position==OFF_RIGHT)?ON:OFF );
      }
	 } 
    else                     // on the line
    {
	   if (position!=ON_LINE) // switch state if previously not on the line
      {
	     position = ON_LINE;

        BackLED(OFF,OFF);
      }
    }
	  

	      if (position==ON_LINE)   { MotorSpeed(SPEED,SPEED);   } // full FWD
    else if (position==OFF_RIGHT) { MotorSpeed(SPEED2,SPEED1); } // turn left
    else if (position==OFF_LEFT)  { MotorSpeed(SPEED1,SPEED2); } // turn right
  }


  while (1);                 // code unreachable

  return 0;
}


void RaceStart(void)    // blink until any switch is pressed,
{                       // then wait until switch is released
  uint8_t t1, t2;
  unsigned int col=OFF;

  while (1)             // blinking StatusLED until any switch is pressed
  {
    t1 = PollSwitch();
    t2 = PollSwitch();
    if (t1==t2)
    {
      if (t1)
      {
        break;
      }
      else
      {
        col ^= GREEN;
        StatusLED(col);
      }
    }
    Msleep(50);
  }

  StatusLED(OFF);       // turn off StatusLED and ...
  BackLED(ON,ON);       // ... turn on both BackLED's

  while (1)             // wait until switch is released
  {
    t1 = PollSwitch();
    t2 = PollSwitch();
    if (t1==t2)
    {
      if (!t1)
      {
        break;
      }
    }
    Msleep(50);
  }

  BackLED(OFF,OFF);     // turn off BackLED's indication start of race
}
Vielleicht schaut Ihr ja mal, ob das Programm bei Euch auch funktioniert (Anpassen von THRESHOLD nicht vergessen), viel Spaß!