Code:
/*******************************************************************************
*
* Description: Asuro Wettbewerb 1.2
*
*****************************************************************************/
#include "asuro.h"
#include <stdlib.h>
unsigned char speed;
int speedLeft,speedRight;
unsigned int lineData[2];
int i, i1, ADOffset;
void FollowLine (void)
{
LineData(lineData);
i = (lineData[0] - lineData[1]) - ADOffset;
if ( i > 4) { //Line is left
StatusLED(GREEN);
speedRight = speed - 2 * i;
if (speedRight < 0x01) speedRight = 0x00;
}
else if ( i < -4) { //Line is right
StatusLED(RED);
speedLeft = speed + 2 * i;
if (speedLeft < 0x01) speedLeft = 0x00;
}
else {
StatusLED(OFF);
speedLeft = speedRight = speed;
}
MotorSpeed(speedLeft,speedRight);
}
int main(void)
{
unsigned char weiter, flag=FALSE;
unsigned int data[2];
int weg, weg1;
Init();
DDRD |= (1 << DDD1); //initialisiert IR-Detektor
PORTD &= ~(1 << PD1);
OCR2 = 0xFE; //Pulsbreite 1
while(1){
MotorDir(FWD,FWD);
StatusLED(GREEN);
speed = 160;
switched=1;
while(switched){ // warte bis Schatz entwendet wird
Msleep(100);
StartSwitch(); // INT1 auf Eingang, Spannung geht hoch
Msleep(5); // wartet wegen der Zeitkonstante R23*C7
switched=0;StartSwitch(); // macht Interrupt endgültig scharf
}
StatusLED(RED); // Schatz ist fort (rotwerde)
Msleep(1000); // warte noch 1 sec, dann Suche
FrontLED(ON);
LineData(lineData);
ADOffset = 0;
speedLeft = speedRight = speed;
weg=0;
while((PIND & (1 << PD0))){ // fahre solange auf Linie bis IR-Det. was findet
FollowLine();
OdometrieData(data); // bestimme Weglänge
if ((data[0] < 560) && (flag == TRUE)) {flag = FALSE; weg++;}
if ((data[0] > 640) && (flag == FALSE)) {flag = TRUE; weg++;}
}
weg1=weg+10; // merke Wegstrecke
StatusLED(OFF);
MotorDir(BREAK,BREAK);
MotorDir(BREAK,RWD); // rechts drehen
MotorSpeed(160,160);
Msleep(900);
MotorDir(BREAK,BREAK); Msleep(200);
MotorDir(FWD,FWD);
MotorSpeed(160,160);
Msleep(300);
MotorDir(FWD,FWD); // fahre Halbkreis um Schatz
MotorSpeed(120,190);
Msleep(2800);
MotorDir(BREAK,BREAK); Msleep(200);
MotorDir(BREAK,FWD); // links drehen
MotorSpeed(160,160);
weiter=1;
while(weiter){ // solange bis Linie entdeckt wird
FrontLED(OFF);
LineData(lineData);
i = (lineData[1] - lineData[0]);
FrontLED(ON);
LineData(lineData);
i1 = (lineData[1] - lineData[0]);
if ( (i1-i) > 30) weiter=0; //Linie in Sicht
}
Msleep(40); //Nachlauf für Linienmitte
MotorDir(BREAK,BREAK); Msleep(100);
MotorDir(FWD,FWD);
speedLeft = speedRight = speed;
while((PIND & (1 << PD0))){ // fahre auf Linie bis IR-Det. was findet
FollowLine();
}
speed=100; // reduziere Geschwindigkeit zum Andocken
while(!switched){ // fahre bis angedockt ist
FollowLine();
}
StatusLED(GREEN);
speed=180;
MotorSpeed(speed,speed); // gib Gas zum Schieben des Schatzes
weg=0;
while(weg<weg1){ // schiebe gemerkte Strecke zurück
FollowLine();
OdometrieData(data);
if ((data[0] < 560) && (flag == TRUE)) {flag = FALSE; weg++;}
if ((data[0] > 640) && (flag == FALSE)) {flag = TRUE; weg++;}
}
MotorDir(BREAK,BREAK);
Msleep(100);
MotorDir(RWD,RWD);
MotorSpeed(160,160);
Msleep(100);
MotorDir(BREAK,BREAK);Msleep(200);
MotorDir(BREAK,RWD); // rechts drehen
MotorSpeed(160,160);
Msleep(850);
MotorDir(BREAK,BREAK); Msleep(200);
MotorDir(FWD,FWD);
MotorSpeed(160,160);
Msleep(300);
MotorDir(FWD,FWD); // Halbkreis
MotorSpeed(120,190);
Msleep(2800);
MotorDir(BREAK,BREAK); Msleep(200);
MotorDir(BREAK,FWD); // links drehen
MotorSpeed(160,160);
weiter=1;
while(weiter){ // solange bis Linie entdeckt wird
FrontLED(OFF);
LineData(lineData);
i = (lineData[1] - lineData[0]);
FrontLED(ON);
LineData(lineData);
i1 = (lineData[1] - lineData[0]);
if ( (i1-i) > 30) weiter=0; //Linie in Sicht
}
Msleep(40); //Nachlauf für Mitte
StatusLED(GREEN);
MotorDir(BREAK,BREAK); Msleep(100);
MotorDir(FWD,FWD);
speed=150;
speedLeft = speedRight = speed;
while((PIND & (1 << PD0))){ // fahre auf Linie bis IR-Det. was findet
FollowLine();
}
speed=100; // reduziere Geschwindigkeit zum Andocken
StartSwitch(); // INT1 auf Eingang, Spannung geht hoch
Msleep(5); // wartet wegen der Zeitkonstante R23*C7
switched=0;StartSwitch(); // macht Interrupt endgültig scharf
while(!switched){ // fahre bis angedockt ist
FollowLine();
}
MotorSpeed(0,0); // angedockt, bleib stehen
}
return 0;
}
Viel Spass beim Studieren!
Lesezeichen