Danke an alle die geantwortet haben, ich werde mir die verschieden Tipps mal zu Gemüte führen.
Danke
Danke an alle die geantwortet haben, ich werde mir die verschieden Tipps mal zu Gemüte führen.
Danke
Du kannst einen rekursiven Labyrinthalgorithmus verwenden, der ist relativ leicht zu implementieren, sofern du weisst wie Rekursion funktioniert. Da du sagst dass du dich in C wenig auskennst, nehme ich an dass du auch nicht weisst wie man Rekursionen verwenden kann. Also informiere dich vielleicht erstmal was Rekursion bedeutet und wo/wie man es einsetzt.
Kurz zur Erklärung: Die Idee ist es das Labyrinth als Spielfeld(2D-Array) anzulegen und alle möglichen Wege(Nord/Süd/Ost/West) durchzulaufen und auf jedem Feld eine Markierung(im 2D-Array) zu hinterlassen, das solange bis du dein gewünschtes Ziel erreicht hast.
Allerdings weiss ich nicht ob Rekursionen auf deinem µC erlaubt/möglich sind und ob der Speicherplatz dafür reicht. Sollte das nicht der Fall sein könntest du z.B.: alle Berechnungen auf einem PC durchführen lassen und beide über eine Schnittstelle(WLAN, etc.) kommunizieren lassen.
Hier noch ein Link der dir vielleicht hilft: http://www.cs.bu.edu/teaching/alg/maze/
Hi,
Ich will den ASURO mithilfe der Taster durch ein einfaches Labyrinth führen. Dazu will ich ihn so programmieren, dass er zunächst immer gerade aus fährt bis er gegen eine Wand fährt und die Taster gedrückt werden. Anschließend soll er dann ein kleines Stück rückwärts fahren und sich um 90 grad in die eine Richtung drehen. Stößt er dann nicht erneut gegen eine Wand soll er gerade aus weiterfahren; andernfalls soll er sich wieder um 180 grad zurück drehen und seine fahrt fortsetzen. Da ich aber im Programmieren ein Anfänger bin, fällt mir das sehr schwer. Kann mir jemand von euch vielleicht einen grundsätzlichen Ansatz für diese Problematik nennen. Mir geht es dabei weniger um die exakte Drehung um 90 grad, sondern vielmehr um die Umsetzung dieses Algorithmus programmtechnisch
Liebe Grüße Philipp
Hallo,
kenne mich leider nicht mit dem ASURO aus aber ein einfacher algorithmischer Ansatz in Pseudocode könnte etwa so aussehen:
Was für einen Sensor zum entdecken der Wand benutzt du genau, ich nehme an sowas in der Art ?Code:Fahren(vorwärts, 999); //fahre vorwärts für 999 sekunden while(1){ //tue das unendlich (bzw hier könnte die Bedingung reinkommen wann er das Zeil erreicht hat) if(Taster == 1){ //Wand entdeckt! Fahren(rückwärts,1); //fahre rückwärts für 1 sekunde Drehen(90); //90° drehung Fahren(vorwärts, 1); //fahre vorwärts für 1 sekunde (um zu prüfen ob noch eine wand da ist) if(Taster == 1){ //2. wand entdeckt! -> umdrehen Fahren(rückwärts,1); Drehen(180); Fahren(vorwärts, 999); } } }
Hallo
Das return() befindet sich innerhalb der deshalb nicht mehr endlosen while-Schleife:
Ich würde es vielleicht so formulieren:Code:#include "asuro.h" int grad=0; int main(void) { Init(); while(1) { if(PollSwitch()==0) { MotorDir(FWD,FWD); MotorSpeed(100,100); } else if(PollSwitch()!=0) { if(grad==0) { MotorDir(FWD,FWD); MotorSpeed(100,0); Msleep(200); grad = 1 ; } } else if(PollSwitch()!=0 && grad==1) { if(grad==1) { MotorDir(FWD,FWD); MotorSpeed(0,100); Msleep(400); grad = 0 ; } } return 0; } }
(ungetestet)Code:#include "asuro.h" int grad=0; int main(void) { Init(); while(1) { if(PollSwitch()==0) { StatusLED(GREEN); MotorSpeed(100,100); } else { if(grad==0) { StatusLED(RED); MotorSpeed(100,0); Msleep(200); grad = 1; } else { StatusLED(YELLOW); MotorSpeed(0,100); Msleep(400); grad = 0; } } } return 0; }
Der Ansatz erscheint mir etwas zu einfach.
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Hallo danke für eure Antworten!
Ich habe mittlerweile ein eigenes Programm geschrieben, dass prinzipiell funktioniert.
Mein Programm sieht folgendermaßen aus:
#include "asuro.h"
int main(void) {
Init();
int i;
int grad=0;
while(1) {
if(PollSwitch()==0) {
MotorDir(FWD,FWD);
MotorSpeed(130,117);
}
else if(PollSwitch()!=0) {
if (grad==0){
MotorDir(BREAK,BREAK);
MotorDir(RWD,RWD);
MotorSpeed(100,100);
for ( i=0 ; i<=220 ; i++)
{ Sleep (5000); }
MotorDir(RWD,FWD);
MotorSpeed(110,110);
for ( i=0 ; i<=150 ; i++ )
{ Sleep ( 5000 ); }
grad = 1;
}
else if (grad==1) {
MotorDir(BREAK,BREAK);
MotorDir(RWD,RWD);
MotorSpeed(100,100);
for ( i=0 ; i<=220 ; i++)
{ Sleep (5000); }
MotorDir(FWD,RWD);
MotorSpeed(110,110);
for ( i=0 ; i<=340 ; i++ )
{ Sleep ( 5000 ); }
grad = 0;
}
}
}
return 0;
}
Ich bin aber noch nicht ganz zufrieden mit dem Programm. Mir wäre es am liebsten, dass sich ASURO sozusagen nicht abwechselnd(wie bei diesem Programm) dreht, sondern dass er an Jeder ecke wieder mit dem linksdrehen anfängt. denn bei dem jetztigem programm kommt es öfters vor, dass der ASURO wieder durch den Beginn des Labyrinths herausfährt. Ist mein Anliegen einigermaßen verständlich?
Kann mir von euch jemand weiter helfen. hab schon einiges probiert aber bin auf kein ergebnis gekommen.
Gruß Philipp
P.S im anhang befindet sich das programm in besserer Form
ASURO soll also geradeausfahren solange er gegen keine wand fährt. ist dies dann doch der fall, soll er zunächst 90 ° links drehen und schauen ob dort auch eine wand ist. ist dort keine wand soll er seine fahrt fortsetzten und bei der nächsten wand das selbe tun. ist dort aber eine wand soll er sich um 180 ° in die andere Richtung drehen, seine Fahrt fortsetzten und bei der nächsten wand aber wieder mit dem linksdrehen beginnen.
Lesezeichen