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
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