PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ACS mit Lichtsensoren



RobotMichi
19.07.2009, 09:30
Hallo Leute,

ich hab ein Programm für den RP6 geschrieben, so ähnlich wie das Beispielprogramm Example_05_Move_05, nur weniger kompliziert:





#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;
}

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.

wenn ich den aufruf für die Funktion "Lichtsensoren" auskommentiere, funktioniert das ACS. Weiß jemand, woran das liegt?

MfG
Michi

proevofreak
19.07.2009, 09:53
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ß

RobotMichi
19.07.2009, 10:23
hallo,

es passiert immer noch das gleiche: die Lichtsensoren funktioneren, das ACS nicht.

lg
Michi

Dirk
19.07.2009, 16:10
die Lichtsensoren funktioneren, das ACS nicht.
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.
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

RobotMichi
19.07.2009, 17:15
Hi,

das ist eine einleuchtende Erklärung. Allerdings wenn ich es so mache



if(!obstacle_right && !obstacle_right)
{
setLEDs(0b001001);
changeDirection(FWD);
moveAtSpeed(120,120);

Lichtsensoren();
}

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.