hallo, meine vermutung ist, dass du die antikollission auch in der while schleife aufrufen musst. ich würde das ACS_setStateChangedHandler(Antikollision); auch in die while schleife verschieben.
gruß
Hallo Leute,
ich hab ein Programm für den RP6 geschrieben, so ähnlich wie das Beispielprogramm Example_05_Move_05, nur weniger kompliziert:
doch der RP6 nimmt keinerlei Rücksicht auf Hindernisse, das mit dem Licht funktioniert super. das mit dem kleiner und größer 100 hab ich gemacht, damit der Roboter nicht wegen jedem kleinen Unterschied hin und her fährt.Code:#include "RP6RobotBaseLib.h" void Lichtsensoren(void) { int x,y; x=adcLSL; y=adcLSR; if(x+100 > y && x-100 < y) { setLEDs(0b100100); changeDirection(FWD); moveAtSpeed(120,120); } else { if(x > y) { setLEDs(0b100000); changeDirection(LEFT); moveAtSpeed(100,100); } if(y > x) { setLEDs(0b000100); changeDirection(RIGHT); moveAtSpeed(120,120); } } } // -------------- Antikollision -------------------- void Antikollision(void) { if(obstacle_right && obstacle_left) { setLEDs(0b110110); changeDirection(RIGHT); moveAtSpeed(120,120); } if(obstacle_right) { setLEDs(0b000110); changeDirection(LEFT); moveAtSpeed(120,120); } if(obstacle_left) { setLEDs(0b110000); changeDirection(RIGHT); moveAtSpeed(120,120); } if(!obstacle_right && !obstacle_right) { setLEDs(0b001001); changeDirection(FWD); moveAtSpeed(120,120); } } // -------------- Main --------------- int main(void) { initRobotBase(); powerON(); setACSPwrMed(); ACS_setStateChangedHandler(Antikollision); changeDirection(FWD); moveAtSpeed(120,120); while(1) { task_RP6System(); Lichtsensoren(); } return 0; }
wenn ich den aufruf für die Funktion "Lichtsensoren" auskommentiere, funktioniert das ACS. Weiß jemand, woran das liegt?
MfG
Michi
hallo, meine vermutung ist, dass du die antikollission auch in der while schleife aufrufen musst. ich würde das ACS_setStateChangedHandler(Antikollision); auch in die while schleife verschieben.
gruß
hallo,
es passiert immer noch das gleiche: die Lichtsensoren funktioneren, das ACS nicht.
lg
Michi
Die Abfrage des ACS und der Lichtsensoren erfolgt ja immer direkt nacheinander. Auch die Fahrbefehle erfolgen in rascher Folge durch die ACS- und die Lichtsensortests und löschen sich gegenseitig aus.die Lichtsensoren funktioneren, das ACS nicht.
Im Grunde brauchst du eine Priorität, d.h. einen Vorrang des einen gegenüber dem anderen Sensor.
Da wäre es ja so, dass das ACS Vorrang vor der Lichtsuche haben müßte.
Also: Wenn kein Hindernis (rechts UND links), dann Suche Licht.
Du könntest z.B. die Helligkeitsabfragen in diesem Teil ...
if(!obstacle_right && !obstacle_right)
{
...
}
... der ACS-Tests unterbringen.
Damit würde nur dann nach Licht gesucht, wenn überhaupt kein Hindernis in Sicht ist.
Gruß Dirk
Hi,
das ist eine einleuchtende Erklärung. Allerdings wenn ich es so mache
erkennt er immer noch kein Licht, auch wenn kein Hindernis da ist. Ich glaube aber, dass er die Lichtsensorenwerte nur 1 mal kontrolliert, und es dann dabei belässt, die Bewegungen deuten darauf hin. wenn ich es aber in einer while-schleife aufrufe, passiert genau das gleiche.Code:if(!obstacle_right && !obstacle_right) { setLEDs(0b001001); changeDirection(FWD); moveAtSpeed(120,120); Lichtsensoren(); }
Lesezeichen