PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Linienverfolgung, bei Kollision -> 180° Dreh und weiter mit Linienverfolgung



chido72
06.03.2011, 21:57
hallo,
das programm soll eigentlich wie im titel beschrieben ablaufen...
funktioniert aber irgendwie nicht...

bitte werft mal´nen kurzen blick drauf, wo grob der fehler stecken könnte.

Danke!


#include "asuro.h"
#define SPEED 100
int speedLeft,speedRight;
unsigned int lineData[2];
int ADOffset;
unsigned char t1, t2;
void LineLeft (void)
{
speedLeft += 5; /* links mehr Gas geben */
speedRight -= 5; /* rechts weniger Gas geben */
if (speedLeft > 200) speedLeft = 200;
if (speedRight < 60) speedRight = 60;
}

void LineRight (void)
{
speedRight += 5; /* rechts mehr Gas geben */
speedLeft -= 5; /* links weniger Gas geben */
if (speedRight > 200) speedRight = 200;
if (speedLeft < 60) speedLeft = 60;
}
void Dreh (void)
{
EncoderInit ();
StatusLED(RED);
MotorDir (BREAK,BREAK);
GoTurn (-20, 0, 100);
GoTurn (0 ,160, 100);
MotorDir (FWD,FWD);
speedLeft = speedRight = SPEED;
}
void Kollision (void)
{
t1 = PollSwitch();
t2 = PollSwitch();
if (t1 == 0 && t2 == 0) /* keine Taste */
{
StatusLED(YELLOW);
}
else
{
Dreh();
}
}
int main(void)
{
int i;

Init();
FrontLED(ON);
StatusLED(OFF);
LineData(lineData);
ADOffset = lineData[LEFT] - lineData[RIGHT];
speedLeft = speedRight = SPEED;
for (;;)
MotorDir (FWD,FWD);
{
LineData(lineData);
i = (lineData[LEFT] - lineData[RIGHT]) - ADOffset;

if ( i >= 4)
{
BackLED(OFF,ON);
LineLeft();
}
else if ( i <= -4)
{
BackLED(ON,OFF);
LineRight();
}
else
{
BackLED(OFF,OFF);
speedLeft = speedRight = SPEED;
}

MotorSpeed(speedLeft,speedRight);

{
Kollision();
}

}
}

bitte werft mal´nen kurzen blick drauf, wo grob der fehler stecken könnte.

Danke!

Valen
07.03.2011, 12:06
hallo,
das programm soll eigentlich wie im titel beschrieben ablaufen...
funktioniert aber irgendwie nicht...

bitte werft mal´nen kurzen blick drauf, wo grob der fehler stecken könnte....Was ist irgendwie nicht? Was macht er was er nicht machen soll?

Eines das ich mit sicherheit sagen kann ist das du Odometrie verwendest wann auch die BackLEDs noch angeschaltet können sein. (BackLEDs an/auf auf Basis von i, ... wann aber ein Kollision erkannt wird geht es im Dreh-funktion und kann es die Flachen nicht mehr zählen) Das geht nicht zusammen weil die Schaltung das ausschließt.

Zweiter:
int main(void)
{
int i;

Init();
FrontLED(ON);
StatusLED(OFF);
LineData(lineData);
ADOffset = lineData[LEFT] - lineData[RIGHT];
speedLeft = speedRight = SPEED;
for (;;)
MotorDir (FWD,FWD); // Dein for-schleife wiederholt nur dass für immer!!!
{ // Diese klammern ist kein teil der for-Schleife!!!
LineData(lineData);
i = (lineData[LEFT] - lineData[RIGHT]) - ADOffset;

if ( i >= 4)
{
BackLED(OFF,ON);
LineLeft();
}
else if ( i <= -4)
{
BackLED(ON,OFF);
LineRight();
}
else
{
BackLED(OFF,OFF);
speedLeft = speedRight = SPEED;
}

MotorSpeed(speedLeft,speedRight);
Kollision();
}
}