Hallo, ich habe bei diesem Programm ein Problem mit der while-Schleife. Das Programm soll so funktionieren: solange kein Objekt links oder rechts ist, soll er mit Speed(200,200) fahren. Ist links oder rechts ein Objekt, soll er in die entsprechend andere Richtung drehen. Leider fährt er ohne Reaktionen mit Speed(200,200) immer weiter. Vielen Dank schon mal im Voraus.
Hallo, Du solltest Dir das "Task" System des RP6 nochmal anhand der Beispielprogramme. genauer anschauen. Füge auch Ausgaben über die serielle Schnittstelle ins Programm ein oder lass zumindest die LEDs passend zum Programmzustand aufleuchten damit Du siehst was intern vor sich geht. Das task System ist ja dazu da, dass man mehrere Dinge nebenläufig erledigen kann (Motoren regeln, IR Sensoren abfragen, allgemeine Programmlogik ausführen) - Du mischst es aber mit blockierenden Funktionen (rotate/move(...,BLOCKING)). Das geht zwar, aber man muss das task System schon verstanden haben um das richtig anwenden zu können. task_RP6System sollte eigentlich nur an einer Stelle in jeder(!) Endlosschleife aufgerufen werden. Die anderen Funktionen zum Steuern des Roboters wie moveAtSpeed usw. werden nur dann aufgerufen wenn sich irgendwas ändert (Sensorwert, Timerwert,...). Sollte man nicht dauernd aufrufen. Kann man zwar machen, aber es ist unnötig und funktioniert so evtl. nicht wie gewünscht. Das hier: while(!obstacle_left || !obstacle_right) {moveAtSpeed(100,100);} wird schon das "Ende" des Programms sein sobald einmal ein Hindernis erkannt wird. Denn das ACS wird hier nie wieder aktualisiert und der moveAtSpeed Befehl hat ebenfalls keine Auswirkung (weil task_RP6System nicht aufgerufen wird) und es bleibt dann einfach in der Schleife hängen. Eine andere Sache ist das Umschalten von setACSPwrMed(); auf setACSPwrLow(); in dem Programm. Lass das lieber erstmal weg und bekomm es ohne ans laufen (wenn alles andere mal tut, dann kannst Du das wieder probieren). Das wird so nämlich nicht das bewirken was Du Dir gedacht hast. task_RP6System direkt nach dem Umschalten der Reichweite EINMAL aufrufen und dann sofort abfragen ob sich was geändert hat funktioniert nicht, das ACS braucht mehrere 10 Millisekunden bis sich der Zustand aktualisiert, da kannst Du die Funktion tausende male aufrufen ohne das sich was ändert. Die CPU arbeitet sehr schnell, die Sensoren sind im Vergleich dazu sehr langsam... Hoffe das hilft Dir weiter. MfG, SlyD
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.