Y0yo
07.07.2014, 19:17
Hallo Community,
Ich soll für meine Seminararbeit ein Programm für meinen Asuro schreiben, bei dem er einer schwarzen Linie folgen soll an deren Ende ein Kasten steht, wenn der Asuro da dagegen stoßt soll er sofort stehen bleiben und die Status-LED grün aufleuchten.
Nun habe ich mithilfe des AsuroWiki es bereits geschafft ein funktionsfähiges Linienverfolgungsprogramm sowie ein Tastenkollisionsprogramm zu erstellen, aber ich schaffe es nicht beide zu kombinieren.
Wenn ich Asuro starte, fährt er gar nicht los sondern es leuchtet sofort die Status-LED grün. Das soll eigentlich nur passieren, wenn ein Taster betätigt wurde.
Wenn ich nun in der Unendlichschleife eine Sleep() Funktion einbaue klappt zwar das mit den Tastern, aber die Linienverfolgung nicht mehr, da der Asuro dann zu langsam reagiert.
Hier mein Programmcode, hoffe ihr könnt mir helfen.
#include "asuro.h"
#include <stdbool.h>
void wait(float seconds);
int main(void)
{
Init();
StatusLED(RED);
wait(1);
StatusLED(OFF);
unsigned int fototransdata[2];
unsigned int SpeedLeft= 120;
unsigned int SpeedRight= 130;
unsigned char j;
int Offset;
unsigned char T1,T2;
bool Stop= false; // Sobald ein Taster aktiviert wurde soll ASURO nichts mehr machen
FrontLED(ON);
for(j = 0; j < 0xFF; j++)
{
LineData(fototransdata);
}
Offset = fototransdata[0] - fototransdata[1];
MotorDir(FWD,FWD);
MotorSpeed(SpeedLeft,SpeedRight);
while (1)
{
T1= PollSwitch();
T2= PollSwitch();
if( (T1 > 0 && T2 > 0 && T1 == T2) || Stop == true)
{
MotorDir(BREAK,BREAK);
BackLED(OFF,OFF);
FrontLED(OFF);
StatusLED(GREEN);
Stop= true;
}
else
{
LineData(fototransdata);
int dif = (fototransdata[0] - fototransdata[1]);
if((dif - Offset) > 4)
{
StatusLED(OFF);
BackLED(ON,OFF);
if(SpeedLeft > 0 && SpeedLeft < 254)
{
SpeedLeft++;
}
}
else if((dif - Offset) < -4 )
{
StatusLED(OFF);
BackLED(OFF,ON);
if(SpeedRight > 0 && SpeedRight < 254)
{
SpeedRight++;
}
}
else
{
BackLED(OFF,OFF);
StatusLED(YELLOW);
SpeedLeft= 120;
SpeedRight= 130;
}
MotorSpeed(SpeedLeft,SpeedRight);
}
}
return 0;
}
void wait(float seconds)
{
int j;
int max= 1000 * seconds;
for(j=0;j<max;j++)
{
Sleep(72);
}
}
LG. Yoyo
Ich soll für meine Seminararbeit ein Programm für meinen Asuro schreiben, bei dem er einer schwarzen Linie folgen soll an deren Ende ein Kasten steht, wenn der Asuro da dagegen stoßt soll er sofort stehen bleiben und die Status-LED grün aufleuchten.
Nun habe ich mithilfe des AsuroWiki es bereits geschafft ein funktionsfähiges Linienverfolgungsprogramm sowie ein Tastenkollisionsprogramm zu erstellen, aber ich schaffe es nicht beide zu kombinieren.
Wenn ich Asuro starte, fährt er gar nicht los sondern es leuchtet sofort die Status-LED grün. Das soll eigentlich nur passieren, wenn ein Taster betätigt wurde.
Wenn ich nun in der Unendlichschleife eine Sleep() Funktion einbaue klappt zwar das mit den Tastern, aber die Linienverfolgung nicht mehr, da der Asuro dann zu langsam reagiert.
Hier mein Programmcode, hoffe ihr könnt mir helfen.
#include "asuro.h"
#include <stdbool.h>
void wait(float seconds);
int main(void)
{
Init();
StatusLED(RED);
wait(1);
StatusLED(OFF);
unsigned int fototransdata[2];
unsigned int SpeedLeft= 120;
unsigned int SpeedRight= 130;
unsigned char j;
int Offset;
unsigned char T1,T2;
bool Stop= false; // Sobald ein Taster aktiviert wurde soll ASURO nichts mehr machen
FrontLED(ON);
for(j = 0; j < 0xFF; j++)
{
LineData(fototransdata);
}
Offset = fototransdata[0] - fototransdata[1];
MotorDir(FWD,FWD);
MotorSpeed(SpeedLeft,SpeedRight);
while (1)
{
T1= PollSwitch();
T2= PollSwitch();
if( (T1 > 0 && T2 > 0 && T1 == T2) || Stop == true)
{
MotorDir(BREAK,BREAK);
BackLED(OFF,OFF);
FrontLED(OFF);
StatusLED(GREEN);
Stop= true;
}
else
{
LineData(fototransdata);
int dif = (fototransdata[0] - fototransdata[1]);
if((dif - Offset) > 4)
{
StatusLED(OFF);
BackLED(ON,OFF);
if(SpeedLeft > 0 && SpeedLeft < 254)
{
SpeedLeft++;
}
}
else if((dif - Offset) < -4 )
{
StatusLED(OFF);
BackLED(OFF,ON);
if(SpeedRight > 0 && SpeedRight < 254)
{
SpeedRight++;
}
}
else
{
BackLED(OFF,OFF);
StatusLED(YELLOW);
SpeedLeft= 120;
SpeedRight= 130;
}
MotorSpeed(SpeedLeft,SpeedRight);
}
}
return 0;
}
void wait(float seconds)
{
int j;
int max= 1000 * seconds;
for(j=0;j<max;j++)
{
Sleep(72);
}
}
LG. Yoyo