PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ein ganz simples Kollisionsprogramm



James C.
21.02.2009, 11:04
Hallo erstmal.

Ich weiß, dass dieses Thema hier schon des öfteren angesprochen wurde, aber die Suchfunktion hat leider keine Threads gefunden, die mir weiterhelfen.
Und zwar gehts um folgendes:

Ich möchte ein ganz einfaches Programm schreiben, mit dem der Asuro solange geradeaus fährt (Natürlich ohne Hilfe der Lichtschranken, es soll ja ein simples Programm sein.), bis er mit den Kollisionstastern irgendwo anstösst. Wenn das passiert, soll er kurz rückwärts fahren, eine 90°-Drehung machen, und dann wieder weiter geradeaus fahren, bis er wieder irgendwo gegenfährt. Ihr müsst wissen, dass ich noch ein totaler Anfänger im programmieren bin! Ich kam in letzter Zeit nicht oft dazu, mich um meinen Asuro zu kümmern. :(

Meine Frage: Wie muss dieses Programm ungefähr aussehen?

IC
21.02.2009, 11:34
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=31614&postdays=0&postorder=asc&start=0

vielleicht hilft dir das weiter..

hai1991
21.02.2009, 12:11
hallo James C.

hier einmal nur wie es vom aufbau her aussehen könnte


int main()
{
while(1) //endlosschleife
{
if(keinen taster gedrückt)
{
//gerade aus fahren (zb. MotorDir(FWD,FWD); MotorSpeed(200,200);)
}
else
{
//drehung (zb. MotorDir(RWD,RWD); MotorSpeed(0,150);)
//best. zeit warten, richtet sich nach der geschwindigkeit, um 90° zu drehen

}
}
}

den code dazu musst du nun selber schreiben, wenn du hilfe braucht melde dich einfach

ich hoffe, das hat dir weitergeholfen

James C.
21.02.2009, 18:08
Danke für eure Antworten!

Also ich habe jetzt mal dieses Programm Angefangen:



#include "asuro.h"


int main(void)
{
Init();
while(1)
{
if(keinen taster gedrückt)
{
MotorDir(FWD,FWD);
MotorSpeed(150,170);
StatusLED(GREEN);
BackLED(ON,ON);
FrontLED(ON);
}
else
{
MotorDir(RWD,RWD)
MotorSpeed(150,170)

}
}
}



Ich glaube der Aufbau ist völlig falsch, aber ich kann das noch nicht so beurteilen, ich bin wie gesagt ein totaler Anfänger. :Ostern

Also ich weiß noch nicht, welchen Befehl ich brauche für "keinen Taster gedrückt", deshalb steht da noch nichts in der "if-klammer". Das mit den Pausen weiß ich auch gerade nicht, deshalb stehen nach "else" nur die beiden Befehle fürs Rückwärtsfahren.

Habe ich bereits Fehler in dem Code? Und was muss ich für "keinen Taster gedrückt" einsetzen, und wie lautet der Befehl für eine Pause?

liggi
21.02.2009, 20:27
wenn du die Pause nicht rein machst, fährt der Asuro so lange rückwärts bis die Taster nicht mehr gedrückt sind und fährt dann sofort wieder vorwärts.

mfg liggi

orusa
22.02.2009, 06:28
Zur Abfrage der Taster gibt es die Funktion PollSwitch().
Diese liefert aber leider nicht immer zuverlässige Werte und sollte daher zur Sicherheit mehrfach hintereinander aufgerufen werden.
Such hier einfach mal nach "PollSwitch", dann findest du genügend Beispiele für die richtige Verwendung dieser Funktion.

James C.
22.02.2009, 12:06
Hallo!

Also ich habe jetzt mithilfe von älteren Beiträgen hier und der Anleitung folgendes Programm geschrieben:



#include "asuro.h"

int main(void)
{
Init();
if (PollSwitch()==0)
{
MotorDir(FWD,FWD);
MotorSpeed(150,170);
BackLED(ON,ON);
FrontLED(ON);
StatusLED(GREEN);
}
else
{
MotorDir(FWD,FWD);
MotorSpeed(0,0);
StatusLED(RED);
}

while(1);
return 0;
}


Jedoch macht mein Asuro nicht das was er tun soll :D
Also er soll ja solange geradeaus fahren, bis ein Taster akitviert wird. Dann soll er stehen bleiben. Das mit dem Rückwärtsfahren und der 90° Drehung habe ich jetzt noch nicht eingebaut, das kommt dann, wenn dieses Programm funktioniert.

Also Schreibfehler und sowas sind nicht drin, das Promgramm lies sich ohne irgendwelche Errors konvertieren.

Was ist an dem Programm falsch?

hai1991
22.02.2009, 12:13
hallo
du must das ganze if- else in eine while(1)-endlosschleife setzen.
ansonsten wird die abfrage nur einmal durchgeführt und im while(1); das danach folgt bleibt der prozessor "stecken" (dies ist aber so gewollt)

schau einfach einmal meinen aufbau im früheren post an, dann müsste dir klar sein, was ich meine

orusa
22.02.2009, 12:22
Dein Programm ist schon mal gar nicht übel! Das einzige Problem dabei: die Taster werden nur ein einziges mal abgefragt. Wenn dabei keiner gedrückt ist, fährt der Asuro einfach immer weiter.

Pack das Ganze in eine Endlosschleife und schon passt es:


#include "asuro.h"

int main(void)
{
Init();
while(1)
{
if (PollSwitch()==0)
{
MotorDir(FWD,FWD);
MotorSpeed(150,170);
BackLED(ON,ON);
FrontLED(ON);
StatusLED(GREEN);
}
else
{
MotorDir(FWD,FWD);
MotorSpeed(0,0);
StatusLED(RED);
}
}
return 0;
}

James C.
22.02.2009, 12:38
Danke für deine Antwort hai,

ich habe jetzt dieses Programm geschrieben:



#include "asuro.h"

int main(void)
{
Init();
while(1)
{
if (PollSwitch()==0)
{
MotorDir(FWD,FWD);
MotorSpeed(150,170);
BackLED(ON,ON);
FrontLED(ON);
StatusLED(GREEN);
}
else
{
MotorDir(FWD,FWD);
MotorSpeed(0,0);
StatusLED(RED);
}

return 0;

}
}


while(1) ist nun am Anfang und umschließt if und else.
Es funktioniert schon etwas besser als das vorherige Programm, allerdings Reagiert der Asuro nun bei einem Gedrückten Kollisionstaster überhaupt nicht, und fährt einfach weiter.

Wo liegt nun das Problem?

James C.
22.02.2009, 12:43
Vielen Dank orusa!

Ich habs asuprobiert, allerdings zeigt auch jetzt der Asuro keine Reaktion, wenn die Taster gedrückt werden... woran könnte das nur liegen?

James C.
22.02.2009, 12:48
Ich habs nun hingekriegt! Ich hab einfach nur vergessen vorm konvertieren zu speichern! (ich dulli :D) Das Programm kalppt nun ausgezeichnet! Vielen Dank!

Nun muss ich nur noch diese Sache mit der 90° Drehung einbauen, aber das krieg ich schon alleine hin. (hoffe ich jedenfalls).

PS: Sry wegen Triple Post aber das musste sein :D

liggi
23.02.2009, 19:59
das return müsste hinter die while(1)-Schleife. Das Programm wird durch das return 0; beendet. Also so:


#include "asuro.h"

int main(void)
{
Init();
while(1)
{
if (PollSwitch()==0)
{
MotorDir(FWD,FWD);
MotorSpeed(150,170);
BackLED(ON,ON);
FrontLED(ON);
StatusLED(GREEN);
}
else
{
MotorDir(FWD,FWD);
MotorSpeed(0,0);
StatusLED(RED);
}
}
return 0;
}




mfg liggi

Chrissi_P
24.02.2009, 08:46
Hallo liggi,
das Programm wird nicht durch das return 0 beendet, es wird in der while-schleife 'gefangen'!.
return 0 ist im Programm drinn, weil main int ist.
ich glaube es ist egal, wie oft es aufgerufen wird.
Chrissi

liggi
24.02.2009, 08:56
in den Beispielprogramme in der AsuroManual.pdf steht das return 0; immer hinter der while(1)-Schleife.
Lass mal das Programm auf einen PC laufen:


#include <stdio.h>
#include <stdlib.h>

int main()
{
while(1)
{
printf("Hello world!\n");
return 0;
}
}


mfg liggi

Chrissi_P
24.02.2009, 09:05
Hallo liggi,
Es war nur eine vermutung, ich kenne mich da nicht so gut aus!
mfg Chrissi

hai1991
24.02.2009, 13:50
hallo zusammen


das return 0; muss unbedingt hinter die while-schleife

mit dem befehl return wird die aktuelle funktion (hier main) beendet und es wird ein wert zurück gegeben. in diesem falle wird nur die main beendet, aber dann ist nicht sicher zu sagen was der prozessor weiter macht, da er keine anweisungen mehr hat

wenn man wie in diesem fall int main() schreibt, muss man auch ein return hinen schreiben! aber eben erst am schluss!