Code:
/* fahrenlightfeiner
der Roboter folgt einem Licht über die zwei Phototransistoren oder fährt, bei gleichmäßiger Ausleuchtung gerade aus.
Stößt er mit den Tastern an wird ein Ausweichmanöver eingeleitet
kai 29.09.2005 */
#include "asuro.h"
#define KNOPF PollSwitch() //Funktion PollSwitch() wird als KNOPF derfiniert
#define SPEED 0x8F //SPEED wird als 248 definiert
int speedleft, speedright; //globale Variablen
unsigned int lineDaten[2]; // "
int ADOffset, i, j, k=0, l; // "
void search_left(void); //Funktionsprototyp
void search_right(void); // "
void LineLeft(void){ //Funktion der main Funktion
//für die Erhöhung der Geschwindigkeit des linken Motors
speedleft+= 1;
if(speedleft>0xFE)
speedleft = 0xFF;
}
void LineRight(void){ //Funktion der main Funktion
//für die Erhöhung der Geschwindigkeit des rechten Motors
speedright += 1;
if(speedright>0xFE)
speedright = 0xFF;
}
void back(void){ //Funktion back() der Funktion taster()
//für zurücksetzen
StatusLED(RED);
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(254,255);
for(i=0;i<=100;i++)
Sleep(255);
}
void pause(void){ //Funktion pause() der Funktion taster()
//für eine kleine Pause mit Lichteffekten (nicht unbedingt erforderlich)
MotorSpeed(BREAK,BREAK);
while(k<=4){
StatusLED(RED);
BackLED(OFF,OFF);
FrontLED(ON);
for(i=0;i<=35;i++)
Sleep(255);
StatusLED(OFF);
BackLED(ON,ON);
FrontLED(OFF);
for(i=0;i<=35;i++)
Sleep(255);
k++;
}
}
void taster(void){ //Funktion zur Steuerung des Ausweichens
KNOPF; //mehrmaliger Aufruf von PollSwitch, wegen dem bekannten Problem mit
KNOPF; //dem Kondensator
KNOPF;
KNOPF;
KNOPF;
KNOPF;
KNOPF;
KNOPF;
KNOPF;
KNOPF;
if(KNOPF > 0 && KNOPF < 8){ //falls Tasten 1-3 gedrückt wurden, fahre hier fort
back();
pause();
search_left();
BackLED(ON,OFF);
MotorDir(RWD,FWD); //Abdrehen des Roboters in entgegengesetzter Richtung zur gedrückten Taste
MotorSpeed(180,180);
for(j=0;j<=170;j++)
Sleep(255);
}
else if(KNOPF > 7 && KNOPF < 60 && KNOPF != 12 && KNOPF != 18 && KNOPF != 30){ //falls Tasten 4-6 gedrückt wurden, fahre hier fort
back();
pause();
search_right();
BackLED(OFF,ON);
MotorDir(FWD,RWD); //Abdrehen des Roboters in entgegengesetzter Richtung zur gedrückten Taste
MotorSpeed(180,180);
for(j=0;j<=170;j++)
Sleep(255);
}
else if(KNOPF == 12 || KNOPF == 18 || KNOPF == 30){ //falls Tasten 2-4 gedrückt wurden, fahre hier fort
back();
pause();
search_left();
BackLED(ON,ON);
MotorDir(RWD,FWD); //Abdrehen des Roboters in entgegengesetzer Richtung zur bisherigen Fahrtrichtung
MotorSpeed(180,180);
for(j=0;j<=240;j++)
Sleep(255);
}
}
int main(void){ //Hauptfunktion
Init();
StatusLED(GREEN);
for (l = 0; l < 0xFF; l++)
LineData(lineDaten); //Überschreiben des Speicherinhalts aus lineDaten[0,1] in die Funktion LineData
LineData(lineDaten);
ADOffset = lineDaten[0] - lineDaten[1]; //Berechnen von ADOffset
speedleft = speedright = SPEED; //Geschwindigkeit links und rechts gleich SPEED
for(;;){ //Endlosschleife
LineData(lineDaten); //Auswerten von LineData
i = (lineDaten[0] - lineDaten[1]) - ADOffset; //Berechnung von i zur Bestimmung des heller beschienen Transistiors
if(i > 50){ //falls rechter Transistor höhere Helligkeit-->
BackLED(ON,OFF);
LineRight(); //Erhöhe links die Geschwindigkeit
if(KNOPF > 0){ //Bedingung für Ausweichsequenz
taster(); //Aufruf der Ausweichfunktion
}
}
else if(i < -50){ //falls linker Transistor höhere Helligkeit-->
BackLED(OFF,ON);
LineLeft(); //Erhöhe rechts die Geschwindigkeit
if(KNOPF > 0){ //Bedingung für Ausweichsequenz
taster(); //Aufruf der Ausweichfunktion
}
}
else{ //bei gleichmäßiger Beleuchtung-->
BackLED(OFF,OFF);
speedleft = speedright = SPEED; //beide Motoren gleiche Geschwindigkeit
if(KNOPF > 0){ //Bedingung für Ausweichsequenz
taster(); //Aufruf der Ausweichfunktion
}
}
MotorDir(FWD,FWD);
MotorSpeed(speedleft,speedright); //Einsetzen der Variablen für die Geschwindigkeit der Motoren
}
while(1); //Endlosschleife (ASURO spezifisch)
return 0;
}
void search_left(void){ //Funktion search_left für Funktion taster()
//für Sucheffekt(nicht unbedingt erforderlich)
StatusLED(GREEN);
for(k=0;k<=0;k++){
BackLED(OFF,OFF);
MotorDir(RWD,FWD);
MotorSpeed(150,150);
for(i=0;i<=250;i++)
Sleep(255);
MotorDir(FWD,RWD);
MotorSpeed(150,150);
for(i=0;i<=250;i++)
Sleep(255);
}
Sleep(255);
}
void search_right(void){ //Funktion search_right für Funktion taster()
//für Sucheffekt(nicht unbedingt erforderlich)
StatusLED(GREEN);
for(k=0;k<=0;k++){
BackLED(OFF,OFF);
MotorDir(FWD,RWD);
MotorSpeed(150,150);
for(i=0;i<=250;i++)
Sleep(255);
MotorDir(RWD,FWD);
MotorSpeed(150,150);
for(i=0;i<=250;i++)
Sleep(255);
}
Sleep(255);
}
So das wärs. Endlich. Aber es gibt noch einiges zutun. Nämlich möchte ich gerne die zeitgesteuerten Elemente durch die Odometriedaten ersetzen und
Lesezeichen