Guten Abend,
kann mir jemand sagen, was dieser Befehl in Storchi Source macht?
z.B.
#define links45 { turn(180); Msleep(500);turn(135);Msleep(500);}
Vielen Dank schonmal..
Guten Abend,
kann mir jemand sagen, was dieser Befehl in Storchi Source macht?
z.B.
#define links45 { turn(180); Msleep(500);turn(135);Msleep(500);}
Vielen Dank schonmal..
das bedeutet, dass überall im quelltext wo "links45" steht,
turn(180); Msleep(500);turn(135);Msleep(500);
ausgeführt wird.
der befehl define sagt aus das das erste wort nach define (turn45) vor dem kompilieren dur das ersetzt wird, as dahinter steht (alles zwischen den {}).
das ist gut, wenn man nur ein paar befehle hat, für die es sich nicht lohnt, eine ganze funktion zu schreiben.
wird diese befehlsfolge allerdings öfter benutzt, sollte man eine funktion schreiben, um speicher zu sparen.
Hätte ich nicht besser erklären können.
Kleine Fehlerteufel-Anmerkung noch zu den { } Klammern. Auch die werden zum Glück beim kompilieren mitgenommen und übersetzt.
Warum zum Glück?
Tipp: #define Name { IMMER mit Klammern schreiben. }Code:if (x == y) links45; else was_anderes; würde sonst folgenden Code ergeben: if (x == y) turn(180); Msleep(500); turn(135); msleep(500); else was_anderes; Jetzt wäre nur noch das 'turn(180)' hinter dem if x==y gültig und wir würden wegen des noch folgenden 'else' einen Compiler-FEHLER bekommen. Im schlimmsten Fall würde der logische Ablauf in unserem Programm falsch sein wenn wir z.B. nur folgendes programmieren: if (x == y) links45; mache_hier_weiter; Jetzt bekommen wir KEINEN Fehler, aber hinter dem if ist wiederum nur das turn(180) und der Rest vom define (Msleep(500); turn(135); Msleep(500);) wird IMMER ausgeführt.
Edit: 18.12.2006 Sternthaler. Wenn ich schon pingelich bin, dann gehören natürlich auch Klammern zum if.
Lieber Asuro programieren als arbeiten gehen.
Hallo,
brauch nochmal Hilfe.
Also das sind 2 Schleifen, soweit ist mir klar, aber was macht sie ganz genau in Storchi programm?
Verzögerung in zehntel sekunden ausrechnen?
Code://delay in 1/10 sec void wait(int zehntel) { int i,temp2; for(i=0;i<zehntel;i++) for(temp2=0;temp2<100;temp2++) Sleep(72); }
Nein, du gibts einfach die Zeit die du warten möchtest in Zehntel Sekunden ein und dann macht der Asuro so lange gar ncihts.
Andun
www.subms.de
Aktuell: Flaschcraft Funkboard - Informationssammlung
Nachdem ich das jetzt schon eine Weile beobachte, muss ich jetzt doch mal antworten:
#define links45 { turn(180); Msleep(500);turn(135);Msleep(500);}
Eine Rechtsdrehung um 180°+135° = 315° ist wie eine Linksdrehung um 45° ( 360°-45° = 315° ).
Mein ASURO hat die Eigenschaft, dass er je nach Richtung unterschiedlich weit dreht. Die Kallibrierroutine ist aber nur für die Rechtsdrehung ( glaub ich mich zu erinnern ). Deshalb habe ich die Linksdrehung über eine Rechtsdrehung realisiert.
Ein weiteres Problem der Turn ( und Go ) Routine ist, dass man die Bewegungen eigentlich mit einer programmgesteuerten Bremsphase versehen müsste. Schaltet man die Motoren schnell ab, bewegt sich der Roboter noch ein Stückchen weiter, was zu einem Fehler in der Sollposition führt.
Das ist eine Unsauberkeit der Routinen, die man irgendwan mal beheben könnte. Damals im Wettberwerb ging es aber darum, möglichst schnell das Ziel zu erreichen, deshalb sind solche Feinheiten unter den Tisch gefallen.
Gruss,
sto - chri
Hier mal ein kleines Video meines Asuros: http://www.zippyvideos.com/5870203996486466/video3/
Die main-Funktion ist nicht besonders interessant, da nur eine Aneinanderreihung von Go und Turn...
Und hier poste ich mal die modifizierten Go und Turn Funktionen der asuro.c. Im Großen und Ganzen entsprechen diese den originalen aus der erweiterten Asuro-Lib auf Sourceforge. Aber vor allem bei der Turn habe ich einiges an den Parametern geändert (mit Abbremsfunktion). Ansonsten habe ich meist noch die Variablentypen und die Reihenfolge angepasst.
Ist zwar noch immer nicht ganz 100%, aber das liegt wohl an der Ungenauigkeit der Odometrie. Ich werde versuchen es noch etwas zu verbessern; mal schauen, was ich noch erreichen kann.Code:void Go(int distance, unsigned char speed) { unsigned int enc_count = abs(distance); unsigned int tot_count = 0; signed char diff = 0; unsigned char l_speed = speed, r_speed = speed; // mm -> ticks enc_count /= 2; // only for 12 fields gearwheel // set direction if(distance < 0) MotorDir(RWD,RWD); else MotorDir(FWD,FWD); // reset encoder Encoder_Set(0,0); // set speed MotorSpeed(l_speed,r_speed); // do until destination reached while(tot_count < enc_count) { tot_count += encoder[LEFT]; // calculate speed difference diff = encoder[LEFT] - encoder[RIGHT]; // reset encoder Encoder_Set(0,0); if (diff > 0) //Left faster than right { if ((l_speed > speed) || (r_speed > 244)) l_speed -= 10; else r_speed += 10; } if (diff < 0) //Right faster than left { if ((r_speed > speed) || (l_speed > 244)) r_speed -= 10; else l_speed += 10; } // set new speeds MotorSpeed(l_speed,r_speed); Sleep(36); } // Stop MotorSpeed(0,0); MotorDir(BREAK,BREAK); Msleep(200); } void Turn(int degree, unsigned char speed) { unsigned int enc_count; unsigned int tot_count = 0; int diff = 0; unsigned char l_speed = speed, r_speed = speed; // degree -> tick enc_count = (unsigned int) (((long)abs(degree) * (long)4080) / (long)10000); // set direction if(degree < 0) MotorDir(RWD,FWD); else MotorDir(FWD,RWD); // reset encoder Encoder_Set(0,0); // set speed MotorSpeed(l_speed,r_speed); // do until angel reached while(tot_count < enc_count) { tot_count += encoder[LEFT]; // calculate speed difference diff = encoder[LEFT] - encoder[RIGHT]; // reset encoder Encoder_Set(0,0); // calculate new speed if (diff > 0) //Left faster than right { if ((l_speed > speed) || (r_speed > 244)) l_speed -= 10; else r_speed += 10; } if (diff < 0) //Right faster than left { if ((r_speed > speed) || (l_speed > 244)) r_speed -= 10; else l_speed += 10; } // set new speed, with slow down MotorSpeed(l_speed - (unsigned char) ((unsigned int)(l_speed) / enc_count),r_speed - (unsigned char) ((unsigned int)(r_speed) / enc_count)); Sleep(36); } // stop MotorSpeed(0,0); MotorDir(BREAK,BREAK); Msleep(200); }
Klasse. Ich hoffe, mein 1. Versuch wird auch bald hier zu sehen sein.
Hallo Stallion,
Glückwunsch zum Nikolaushaus.![]()
Der ASURO fährt ganz gut in dem Video. Interresanterweise fährt er rückwärts.
Im Video kann man die Striche nicht so gut erkennen, vielleicht kannst Du so ein Bild mit mehreren hintereinandergezeichneten ASUROs wie Sternthaler posten, dann kann man erkennen, wie gut der ASURO seine Position hält.
Wenn's gut funktioniert, wären ja vielleicht sogar kompliziertere Gemälde denkbar.![]()
Gruss,
stochri
Ja, ist dieser Bug, den alle neueren Asuros haben. Und ich war bisher zu faul die Kabel der Motoren umzulöten, damit er in die richtige Richtung fährt. Sollte aber eigentlich keinen großen Unterschied machen.Zitat von stochri
Lesezeichen