Zwei Programme zusammen geworfen
Moinsen,
habs endlich geschafft: hatte ein Ausweichprogramm geschrieben und hatte das Linienfolgeprogramm soweit abgeändert, dass der Bot einer Taschenlampe folgen kann. Und jetzt kommts: beide Programme zusammen funktionieren so, dass der Roboter der Lampe folgt und wenn er anstößt ausweicht um dann wieder der Lampe zu folgen. Hier ist der Code:
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
außerdem muß die Suchfunktion noch einen näheren Sinn bekommen. Ich stelle mir das so vor, dass er solange in der Suchfunktion verbleibt bis ein Helligkeitsunterschied ermittelt wurde und dann wieder der Lichtquelle folgt.
Was haltet ihr davon. Wenns einer ausprobiert hat dann sagt doch mal bescheid.
Kai