PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro-Schwarmverhalten



Romili
20.03.2008, 10:17
Hallo,

wir haben in den letzten Wochen versucht fünf Asuros ein Schwarmverhalten beizubringen.
Nachdem sie ewig nicht geradeausfahren wollten, haben wir das jetzt relativ im Griff (noch net 100%, aber so 85% ;) ) und haben danach eine Art Sendemast gebaut (siehe Bild). Nach anfänglichen Problemen mit falschen Widerständen (damit die Sende-LEDs optimal senden, reichen 47Ohm. Ein 220Ohm Widerstand, wie er standardmäßig eingebaut wird, ist zuviel) und Interferenzen mit den Leuchtstoffröhren sendet unser "Master-Asuro" nun ganz brav und die "Asuro-Slaves" empfangen und reagieren darauf.

Unser (ganz einfaches) Schwarmverhalten soll nun folgendes tun: Der Master bekommt von uns (Hyperterminal, etc.) ein Signal (bspw. den Buchstaben W) und soll dann zum einen selber fahren und zum andern den Slaves die Richtung weitergeben, in die gefahren wird. Und dann sollen alle noch auf Hindernisse reagieren können, sprich wenn irgendwo dagegengefahren wird erstmal anhalten. In späteren Versionen gerne auch dem Hindernis ausweichen.

Nun hat sich folgendes Problem ergeben:
Unser Code sieht im Prinzip so aus:


main()
while(1)
SerRead(&senden,1,0);
taste = PollSwitch();
taste2 = PollSwitch();

// Die folgende if-Abfrage ist dazu da, die Zeichen, die gesendet werden von denen, die empfangen werden sollen, zu unterscheiden
if(senden == 'W' || senden == 'A' || senden == 'D' || senden == 'S')
abfang = senden

switch(abfang)
case 'W':
MotorDir(FWD,FWD);
if(taste == taste2 && taste > 1)
MotorDir(BREAK,BREAK);
SerPrint("C"); // an dieser Stelle soll der Master den Befehl zum vorwärtsfahren an die Slaves weitergeben
break;
case 'S':
MotorDir(RWD,RWD);
SerPrint("V");
break;
...(die weiteren Buchstaben)
default: break;

Das Problem ist die SerRead Funktion: Wenn wir sie im Nonblocking-Mode (letztes Argument >0) verwenden, können wir die weiteren Befehle nicht abfangen. D.h. der Master bekommt einen Buchstaben, fährt in die entsprechende Richtung und bekommt aber alle nachfolgenden Zeichen nicht. D.h. er fährt für immer nur in eine Richtung.
Benutzen wir die SerRead Funktion im Blocking-Mode (letztes Argument =0), dann reagiert der Asuro zwar wunderschön auf alle Zeichen, die er gesendet bekommt und arbeit diese auch richtig ab, jedoch bleibt das Programm immer an der Stelle der SerRead Funktion stehen. Das bedeutet, das alle anderen Programmteile nicht ausgeführt werden. Wenn der Asuro also in dem Moment gegen ein Hindernis fährt, merkt er dies nicht, weil die Taster grade nicht ausgewertet werden.

Beim Stöbern hier im Forum sind über das Thema Interrupts gestolpert. Könnte man damit unser Problem beheben? Ist es leicht Interrupts zu programmieren? Denn wir haben das beide noch nicht gemacht.

Anbei noch ein Foto von unserem "Master-Asuro" (ist allerdings eine Version des Sendemasten, die noch nicht funktioniert hat ;) )

Vielen Dank schonmal für eure Hilfe.
Romili

Andun
20.03.2008, 13:51
Hi

Also generell: Finde die Idee sehr interessant und würde mal euren Masterasuro besser fotografiert sehen. (Größer, heller und andere Perspektiven)

Generell ist die Idee im Non-blocking Mode schon richtig. Ihr müsst die Hauptschleife immer wieder laufen lassen und jedesmal alle möglichen Zustände durchprobieren und dementsprechend handeln:
Also eben testen ob ein neuer Befehl anliegt,
oder Testen ob eine Taste gedrückt wurde,
oder auf Radencoder achten,
oder was auch immer ...

Jede einzelne von diesen Aktionen muss möglichst kurz geschehen und darf die anderen nicht ungewollt blockieren.

Ich hab die SerRead Funktion nicht zur Hand und auch nicht genau im Kopf, aber meiner Meinung nach, kann man den schon so laufen lassen, dass er ständig einen Puffer beschreibt, welchen er ausliest, wenn man wieder in der Schleife ist. Das ganze würde über ein Interupt geschehen, aber das ist meiner Meinung nach schon programmiert und man muss es nur anwenden.
(Wie gesagt, hab es nicht zur Hand, aber ich mein, dass das so geht)

mfg
Andun

m.a.r.v.i.n
20.03.2008, 15:31
Hallo,

Nein, die SerRead Funktion arbeitet ohne Buffer und Interrupt. Beim Arbeiten mit Timeout wird 'T' nach Ablauf des Timeouts zurückgeliefert.
Solange man also 'T' nicht als Kommando verwendet, und zur Steuerung des Master Asuros andere Befehle verwendet, als die, die der Master zum steuern der Slaves verwendet, sollte es mit SerRead und Timeout funktionieren. Abfragen wegen Kollisionen müssen natürlich immer direkt in der Hauptschleife verarbeitet werden, nicht in if oder switch/case Zweigen.

In den Quellen zum Asuro Buch 2 gibt es ein Beispiel für Interrupt Empfang mit Buffer. Das Beispiel IRComm.
http://www.arexx.com/downloads/asuro/ASURO_Programme_Band1_2.zip

Etwas offtopic. Ich finde euer Projekt auch sehr interessant. Da ich selber gerade an einem IR Booster für den Asuro bastle:

Welche Reichweite erzielt ihr mit dem Turm?
Habt ihr den PC IR Transceiver auch modifiziert?

damaltor
20.03.2008, 17:15
lasst die SerRead Funktion in jedem durchlauf der hauptprogrammschleife abfragen. wird ein zeichen gesendet, dann könnt ihr es auswerten, wird ein T empfangen, kann dieses als timeout gewertet werden.

habe deinen post mal angepasst, bitte den code button nutzen!

robo.fr
20.03.2008, 17:51
Hallo Romili,

ein sehr interessanter Aufbau! Ihr müsst auf jeden Fall mal ein Film ins Internet stellen, damit man sehen kann, wie sich die ASUROs verhalten.

Gruß,
robo