Tausendacht
16.08.2011, 16:49
Hallo
ich habe einen, für mich sehr mysteriösen, Fehler bei meinem Asuro. Damit ihr mir helfen könnt, muss ich aber wahrscheinlich ersteinmal mein kleines Programm erklären.
Main-Datei:
startet den Motor und soll anschließend nur noch auf Kollisionen reagieren.
int main(void)
{
Init();
MotorDir(FWD,FWD);
MotorSpeed(180,180);
while(1)
{
Kollisionskontrolle ();
Msleep(10);
}
}
Kollisionskontrolle:
überprüft zuerst ob eine Kollision vorliegt (5mal in for-Schleife, da sonst Fehler auftraten ( einzelne falsche Werte) )
anschließend wird je nachdem, welcher Schalter gedrückt ist eine andere Drehung durchgeführt
void Kollisionskontrolle (void)
{
char Zaehler = 0; // Zaehler für die Kontrolle der Taster
int i;
// Teste auf Kollision
for (i=0; i<5; i++)
{
if (PollSwitch() != 0) Zaehler++;
Msleep(1);
}
// Ist der Zahler größer als 1, so leigt eine Kollision vor
// In diesem Fall muss anhand des Pollswitch-Wertes, der auf Zaehler übergeben wird
// unterschieden werden wie zu reagieren ist.
if (Zaehler > 1)
{
Zaehler = PollSwitch();
// Stößt ganz links an - Asuro dreht 45° rechts
if (Zaehler == 32)
{
// K1 gedrückt - 45° nach rechts drehen
Drehung(45, 150);
}
// Stößt ganz rechts an - Asuro dreht 45° nach links
else if (Zaehler == 1)
{
// K6 gedrückt - 45° nach links drehen
Drehung(-45, 150);
}
// Stößt anders an - Asuro dreht 180°
else
{
// 90° Drehung
Drehung(180, 150);
}
}
}
Drehung:
Hier wird zuerst die aktuelle Geschwindkeit gespeichert. Anschließend der roboter ein Stück zurückgefahren und anschließend die Drehung durchgeführt. Zum Schluss fährt der Asuro mit der ursprünglichen Geschwindigkeit weiter.
void Drehung (int Grad,unsigned char Geschwindigkeit)
{
int Faktor = 4; // spezifischer Faktor - Je nach Reibung einzustellen damit Drehung etwa stimmt
unsigned char Left_Speed;
unsigned char Right_Speed;
// Ursprüngliche Geschwindigkeit übernehmen
Left_Speed = OCR1A;
Right_Speed = OCR1B;
// Kurz zurücksetzen
MotorDir(RWD,RWD);
MotorSpeed(120,120);
Msleep(200);
MotorSpeed(0,0);
// Unterscheide Links und Rechtsdrehung
if(Grad >0) // Rechtsdrehung
{
MotorDir(FWD,RWD);
MotorSpeed(Geschwindigkeit,-Geschwindigkeit);
Msleep(Grad * Faktor);
}
else
{
MotorDir(RWD,FWD);
MotorSpeed(-Geschwindigkeit,Geschwindigkeit);
Msleep(-Grad * Faktor);
}
MotorDir(FWD,FWD);
MotorSpeed(Left_Speed,Right_Speed);
Hat soweit bei meinen ersten Versuchen auch wunderbar funktioniert. Stell ich die Geschwindigkeit aber höher als ca. 150 macht der Asuro was er möchte. Teilweiße dreht er sich mehrfach, bzw die ganze Zeit. Eigentlich immer beginnt er sogar nicht mit vorwärtsfahren, bis ein Hindernis kommt, sondern beginnt direkt mit einer 180° Drehung.
Ich habe mit einem kleinen Programm die Funktion der Taster getestet (auch bei laufendem Motor in verschiedenen Geschwindigkeiten). Dabei habe ich bis auf ganz wenige einzelne Fehler fast nur richtige Werte bekommen.
Das Programm sah in etwa so aus:
if (PollSwitch() != 0) UartPutc ('1');
else UartPutc('0');
Msleep(1);
Ich habe mittlerweile alles mögliche ausprobiert und konnte auch im Quelltext keinen Fehler entdecken. Ich stehe etwas ratlos vor dem Problem. Deshalb hoffe ich, dass sich hier jemand die Mühe macht sich das mal genauer anzusehen.
Vielen Dank
Tausendacht
ich habe einen, für mich sehr mysteriösen, Fehler bei meinem Asuro. Damit ihr mir helfen könnt, muss ich aber wahrscheinlich ersteinmal mein kleines Programm erklären.
Main-Datei:
startet den Motor und soll anschließend nur noch auf Kollisionen reagieren.
int main(void)
{
Init();
MotorDir(FWD,FWD);
MotorSpeed(180,180);
while(1)
{
Kollisionskontrolle ();
Msleep(10);
}
}
Kollisionskontrolle:
überprüft zuerst ob eine Kollision vorliegt (5mal in for-Schleife, da sonst Fehler auftraten ( einzelne falsche Werte) )
anschließend wird je nachdem, welcher Schalter gedrückt ist eine andere Drehung durchgeführt
void Kollisionskontrolle (void)
{
char Zaehler = 0; // Zaehler für die Kontrolle der Taster
int i;
// Teste auf Kollision
for (i=0; i<5; i++)
{
if (PollSwitch() != 0) Zaehler++;
Msleep(1);
}
// Ist der Zahler größer als 1, so leigt eine Kollision vor
// In diesem Fall muss anhand des Pollswitch-Wertes, der auf Zaehler übergeben wird
// unterschieden werden wie zu reagieren ist.
if (Zaehler > 1)
{
Zaehler = PollSwitch();
// Stößt ganz links an - Asuro dreht 45° rechts
if (Zaehler == 32)
{
// K1 gedrückt - 45° nach rechts drehen
Drehung(45, 150);
}
// Stößt ganz rechts an - Asuro dreht 45° nach links
else if (Zaehler == 1)
{
// K6 gedrückt - 45° nach links drehen
Drehung(-45, 150);
}
// Stößt anders an - Asuro dreht 180°
else
{
// 90° Drehung
Drehung(180, 150);
}
}
}
Drehung:
Hier wird zuerst die aktuelle Geschwindkeit gespeichert. Anschließend der roboter ein Stück zurückgefahren und anschließend die Drehung durchgeführt. Zum Schluss fährt der Asuro mit der ursprünglichen Geschwindigkeit weiter.
void Drehung (int Grad,unsigned char Geschwindigkeit)
{
int Faktor = 4; // spezifischer Faktor - Je nach Reibung einzustellen damit Drehung etwa stimmt
unsigned char Left_Speed;
unsigned char Right_Speed;
// Ursprüngliche Geschwindigkeit übernehmen
Left_Speed = OCR1A;
Right_Speed = OCR1B;
// Kurz zurücksetzen
MotorDir(RWD,RWD);
MotorSpeed(120,120);
Msleep(200);
MotorSpeed(0,0);
// Unterscheide Links und Rechtsdrehung
if(Grad >0) // Rechtsdrehung
{
MotorDir(FWD,RWD);
MotorSpeed(Geschwindigkeit,-Geschwindigkeit);
Msleep(Grad * Faktor);
}
else
{
MotorDir(RWD,FWD);
MotorSpeed(-Geschwindigkeit,Geschwindigkeit);
Msleep(-Grad * Faktor);
}
MotorDir(FWD,FWD);
MotorSpeed(Left_Speed,Right_Speed);
Hat soweit bei meinen ersten Versuchen auch wunderbar funktioniert. Stell ich die Geschwindigkeit aber höher als ca. 150 macht der Asuro was er möchte. Teilweiße dreht er sich mehrfach, bzw die ganze Zeit. Eigentlich immer beginnt er sogar nicht mit vorwärtsfahren, bis ein Hindernis kommt, sondern beginnt direkt mit einer 180° Drehung.
Ich habe mit einem kleinen Programm die Funktion der Taster getestet (auch bei laufendem Motor in verschiedenen Geschwindigkeiten). Dabei habe ich bis auf ganz wenige einzelne Fehler fast nur richtige Werte bekommen.
Das Programm sah in etwa so aus:
if (PollSwitch() != 0) UartPutc ('1');
else UartPutc('0');
Msleep(1);
Ich habe mittlerweile alles mögliche ausprobiert und konnte auch im Quelltext keinen Fehler entdecken. Ich stehe etwas ratlos vor dem Problem. Deshalb hoffe ich, dass sich hier jemand die Mühe macht sich das mal genauer anzusehen.
Vielen Dank
Tausendacht