Archiv verlassen und diese Seite im Standarddesign anzeigen : Labyrinth
hallo möchte meinen asuro im labyrinth fahren lassen.
meine grundidee war:
stößt er gegen eine wand, soll er rückwärtsfahren und sich um 90 grad nach links drehen und weiterfahren. stößt er dann ein 2. mal gegen die wand soll er sich um 180 grad drehen und weiterfahren.
leider dreht sich mein asuro nur um ca. 60 grad und macht auch beim 2. mal anstoßen an die wand nur dies und dreht sich nicht um 180 grad. hier ist mal mein programm:
#include "asuro.h"
#include "myasuro.h"
int main(void)
{
Init();
while(1)
{
MotorDir(FWD,FWD);
MotorSpeed(100,100);
Msleep(200);
if (PollSwitch())
{
MotorDir(RWD,RWD);
MotorSpeed(100,100);
Msleep(300);
MotorDir(RWD,BREAK);
Msleep(300);
MotorDir(FWD,FWD);
MotorSpeed(100,100);
Msleep(200);
}
if (PollSwitch())
{
MotorDir(RWD,RWD);
MotorSpeed(100,100);
Msleep(300);
MotorDir(RWD,BREAK);
Msleep(300);
MotorSpeed(100,100);
Msleep(200);
}
}
}
kann mir jemand meinen fehler zeigen???
es liegt an irgendwelchen zahlenwerten, dir dafür zuständig sind wie lange sich der asuro in einer betimmten bewegung aufhält, aber welche ist das??
oder muss ich vielleicht geschwindigkeiten verändern?
habe mir gedacht zum beispiel beim 1. if für die drehbewegung MOTORSPEED(0,150); dann fährt er nach links
und bei der 2. bewegung (für 180 grad) MOTORSPEED(150,150); MOTORDIE(RWD,FWD) dann müsste er genau doppelt so viel grad überbrücken wie beim ersten mal drehen, und dann müsste ich an sich doch nur mit den 150 varrieren, dass ich wirklich 90 grad bekomme. dann kann ich ja das mit RWD und BREAK weg lassen oder???
also:
#include "asuro.h"
#include "myasuro.h"
int main(void)
{
Init();
while(1)
{
MotorDir(FWD,FWD);
MotorSpeed(100,100);
Msleep(200);
if (PollSwitch())
{
MotorDir(RWD,RWD);
MotorSpeed(100,100);
Msleep(300);
MotorDir(FWD,FWD);
MotorSpeed(0,150);
Msleep(300);
MotorDir(FWD,FWD);
MotorSpeed(100,100);
Msleep(200);
}
if (PollSwitch())
{
MotorDir(RWD,RWD);
MotorSpeed(100,100);
Msleep(300);
MotorDir(RWD,FWD);
MotorSpeed(150,150);
Msleep(300);
MotorSpeed(100,100);
Msleep(200);
}
}
}
könnte das so richtig sein???
Flash2over
17.04.2009, 01:56
Hi Asuro11,
es gibt hier im Forum ein extra Asuro unterforum. Aber ich versuch dir auch hier zu helfen.
Problem ist das Asuro nicht immer gleich lang brauch für Drehungen (unterschiedliche Reibung führt z.B. zu verzögerungen) daher ist eine zeitliche Zuordnung zwischen Winkel und Geschwindigkeit nicht so leicht möglich. Du könntest aber auf deinem Untergrund durch Versuche die Zeiten ändern. Ich markiere dir dazu unten die Stellen im Quelltext.
Für genaue Drehungen gibt es die Odometrie (das Ding mit dem Schwaz-Weiß Aufkleber auf den Rädern). Da ein direkter Einstieg in die Odometrie etwas kompliziert ist solltest du vll einstmal anfangen mit der erweiterten Befehlsbibliothek von m.a.r.v.i.n. Diese gibt es hier im Asuro Unterforum. Mit dieser kannst du direkt über einen C-Befehl Asuro um eine bestimmte Gradzahl drehen lassen.
Außerdem stimmt in deinem Programm etwas nicht: Du hast 2 gleiche if Bedingungen drin. Das ist ein Logikproblem. Du willst so weit ich verstehe beim ersten Anstoßen um 90Grad drehen und beim 2. um 180. Dabei müsste der Code so aussehen:
ACHTUNG! Ich habe nur den Code so verändert das beide Anweisungen wie gewollt ausgeführt werden. Werte sind nicht korrigiert!!
#include "asuro.h"
#include "myasuro.h"
int main(void)
{
int x=1; //X Variable als Zähler einführen und auf 1 setzen
Init();
while(1)
{
MotorDir(FWD,FWD);
MotorSpeed(100,100);
Msleep(200);
if ((PollSwitch()) && (x=1)) //Wenn Tastendruck und x=1
{
MotorDir(RWD,RWD);
MotorSpeed(100,100);
Msleep(300);
MotorDir(FWD,FWD);
MotorSpeed(0,150);
Msleep(300); //80Grad Drehung
MotorDir(FWD,FWD); //Zeile kannste weg lassen
MotorSpeed(100,100); //Zeile kannste weg lassen
Msleep(200); //Zeile kannste weg lassen
x++; //x um 1 erhöhen (x wird 2)
}
if ((PollSwitch()) && (x=2)) //Wenn Tastendruck und x=2 (2. Tastendruck)
{
MotorDir(RWD,RWD);
MotorSpeed(100,100);
Msleep(300);
MotorDir(RWD,FWD);
MotorSpeed(150,150);
Msleep(300); //Drehung 90Grad (Siehe Bemerkung unten)
MotorSpeed(100,100);
Msleep(200); //+Drehung 90Grad(Siehe Bemerkung unten)
x--; //x um 1 verringern (x wird wieder 1)
}
}
}
Den Teil
MotorDir(RWD,FWD);
MotorSpeed(150,150);
Msleep(300); //Drehung 90Grad (Siehe Bemerkung unten)
MotorSpeed(100,100);
Msleep(200); //+Drehung 90Grad(Siehe Bemerkung unten)
Kanste ändern in
MotorDir(FWD,FWD);
MotorSpeed(0,150);
Msleep(300);
Msleep(300);
Im Text oben würde abwechselnd die erste if bedingung und die 2. if Bedinung eintreten also zuerst um 90Grad drehn dann um 180Grad drehn.
außerdem fehlt am ende die return 0; anweißung
Gruß
Thomas
ok danke, ist die x variable sozusagen ein zähler wie oft er jetzt an die wand gestoßen ist. oder?
Flash2over
18.04.2009, 00:55
genau das x++; erweitert die variable um 1 dann wird die 2. Schleife abgespielt. Das x--; in der 2. Schleife vermindert die variable um 1 und die erste Schleife wird wieder abgespielt.
habe jetzt das programm:
#include "asuro.h"
#include "myasuro.h"
int main(void)
{
int x=1; //X Variable als Zähler einführen und auf 1 setzen
Init();
while(1)
{
MotorDir(FWD,FWD);
MotorSpeed(100,100);
Msleep(200);
if ((PollSwitch()) && (x=1)) //Wenn Tastendruck und x=1
{
MotorDir(RWD,RWD);
MotorSpeed(100,100);
Msleep(300);
MotorDir(FWD,FWD);
MotorSpeed(0,195);
Msleep(300); //90Grad Drehung
x++; //x um 1 erhöhen (x wird 2)
}
if ((PollSwitch()) && (x=2)) //Wenn Tastendruck und x=2 (2. Tastendruck)
{
MotorDir(RWD,RWD);
MotorSpeed(100,100);
Msleep(300);
MotorDir(FWD,RWD);
MotorSpeed(195,195);
Msleep(300);
MotorSpeed(195,195);
Msleep(300); //Drehung 90Grad
//+Drehung 90Grad
x--; //x um 1 verringern (x wird wieder 1)
}
}
return 0;
}
aber die 2. klammer will er mmer noch nicht machen???
hat denn keiner meinen fehler entdeckt?
Flash2over
29.04.2009, 23:33
Gibts denn beim Compilen nen Fehler oder nur beim Ausführen?
ne nur beim ausführen...ist irgendein fehler im prorgramm denke ich...
habe mir überlegt anstatt mit x=1 und x=2 (also mit x++ und x--) nur mit x++ zu arbeiten. würde dann eben anstatt x=1 sagen wenn x ungerade ist mach die erste schleife. wenn x gerade dann die 2. gibt es denn einen befehl für gerade und ungerade??
Flash2over
04.05.2009, 23:07
du kannst auch in der ersten schleife anstatt
x++;
x=2; schreiben und in der zweiten anstatt
x--;
x=1;
und pack das
Msleep(200); vor
if ((PollSwitch()) && (x=1)) //Wenn Tastendruck und x=1 raus
und dann müsste es gehen?
werde es mal morgen versuchen (heute ist vielleicht bissle spät ;))
kann es auch sein, dass das x=1 und x=2 daruaf bezogen ist wieviel taster gedrückt sind. nicht dass das dann so ist dass bei 2 gedrückten tastern x=2 ist... aber dürfte eig. nicht sein...
Flash2over
06.05.2009, 00:16
nene dürfte schon stimmen, muss morgen auch mal testen hab den asuro schon weggepackt^^
kann ich denn sozusagen einen timer einbauen? dass die 2 if schleife nur abgespielt werden soll wenn er innerhalb von z.b. 10 sek. zum 2. auf die wand trifft?
weil so passiert es bei 2 linkskurven, dass er links fährt, gerade aus, und anstatt dann einfach links dreht er um 180grad und fährt zurück. daher möchte ich sagen dass nur wenn er innerhalb einer bestimmten zeit das 2. mal dagegen fährt 180grad dreht...
geht das?
mhhhh..... kann keiner helfen?
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.