PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Asuro mit Lichtsenoren anhalten !



J_uli
15.10.2012, 17:31
Hallo liebe Community,

ich steh noch ziemlich am Anfang der C Programmierung...
Hab mich seit einiger Zeit schon mit dem Asuro beschäftigt und stehe nun vor einem kleinen Problem:
Der Asuro soll gerade ausfahren und sobald ich eine Taschenlampe an die vorderen 2 Lichtsenoren halte ( Line Data... ) stehen bleiben ...
Ich sollte noch erwähnen, dass ich die Lichtsenoren auf die andere seite also oberhalb des Asuros montiert hab damit ich mit der Taschenlampe besser hinkomme....
Die Lichtsensoren funktionieren einbahnfrei! Also ich habe jetzt einen Code geschrieben.... Vielleicht könnt ihr mir helfen da er nicht stehen bleibt sonder lieber immer geradeaus weiterfährt .... naja Vielen Dank im Vorraus:
int main(void)
{
Init();
unsigned int lineData[2], STOP[2]; // Stopwert seitenabhängig verwalten

FrontLED(ON); // Front LED an
Sleep(10); //
LineData(lineData); //
LineData(lineData);

STOP[0] = lineData[0]+60; // STOP wert Berechnen (links)
STOP[1] = lineData[1]+60; // STOP wert Berechnen (rechts)

while(1)
{
MotorDir(FWD,FWD); // vorwärts
MotorSpeed(180,180);
BackLED(ON,ON);
Msleep(5000);
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
do
LineData(lineData);
while ((lineData[0] > STOP[0]) && (lineData[1] > STOP[1])); //solange bis der eingelesene wert heller wird als STOP

Msleep(5000);
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
BackLED(OFF,OFF);



}
return 0;
}

Valen
15.10.2012, 18:37
Deine MSleep Pausen sind ziemlich langweilig (5 Sekunden). Dann wird es schwierig zu bemerken wann genau er die Taschenlampe erkennt hat. Er könnte einfach schneller als dich sein und deine Taschenlampe nicht auf das richtige Moment im Visier haben.

Auserdem wurde ich die BackLEDs als Zustand-ausgaben verwenden. Ein BackLED sollte nur an gehen wann die STOP-kondition an diesen Seite bemerkt ist. Nun geht es am Anfang der Auseren While-schleife bei beiden an. Und gerade am Ende wieder aus. Wo es ziemlich gleichzeitig wieder angeschalted wirt. (MotorDir und MotorSpeed dauern nur ein wenig fur den Asuro Prozessor.)

Ich vermutte es geht schief in den Do-While Schleife. Dort steht:


do
LineData(lineData);
Ich vermute die do-schleife ist mit diesen letzte Punkt-Komma zu ende gekommen. Die While-Zeile danach funktioniert wie ein Endloss-Schleife, aber ohne erneute LineData() Funktion anrufen. Es ist nur im Endloss-lauf wann die STOP werten bei den beiden Sensoren erreicht sind. Muss dass unbedingt in einer UND-vergleichung stehen? Oder wurde ein ODER-vergleichung auch stimmen? Weil das Letzte öfter passieren wird. Setzte die Befehlen zwischen do und While zwischen {} Klammern. Dann ist das Punkt-Komma Problem erledigt.


Zu letzte: Ist diesen STOP-wert erhöhung von 60 auch realistisch? Erkennt Asuro die Taschen Lampe auch wann er kein Motor-Befehlen bekommt? Also nicht fahrt.

Valen
15.10.2012, 18:49
P.S. Stehen bleibt er immer wann er nicht mit seine Rädern auf den Grund steht. Das erleichtert das Testen. Und du wirst nicht so schnell müde von das hinter her laufen. ;)

J_uli
15.10.2012, 20:36
Danke für die schnelle Antwort also ich hab das mal angewendet ... also die Do schleife in Klammern aber irgendwie will er immernoch nicht ... der code schaut jetzt so aus ... ich hab außerdem die MSleep kleiner gemacht und die backlight nur in der while schleife angemacht... Letztendlich fährt er immernoch gerade aus ... Und ich renn schon nicht die ganze Zeit quer durch die Wohnung :p

P.S Die Stoppwerte hab ich nochmal runtergesetzt ....


int main(void)
{
Init();
unsigned int lineData[2], STOP[2]; // Stopwert seitenabhängig verwalten

FrontLED(ON); // Front LED an
Sleep(10); //
LineData(lineData); //
LineData(lineData);

STOP[0] = lineData[0]+10; // STOP wert Berechnen (links)
STOP[1] = lineData[1]+10; // STOP wert Berechnen (rechts)

while(1)
{
MotorDir(FWD,FWD); // vorwärts
MotorSpeed(180,180);
BackLED(OFF,OFF);
Msleep(200);

do{
LineData(lineData);
}
while ((lineData[0] > STOP[0]) && (lineData[1] > STOP[1])); //solange bis der eingelesene wert heller wird als STOP

Msleep(200);
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
BackLED(ON,ON);



}
return 0;
}



Genau fast hätt ichs vergessen die zweifachen Stop werte sind zur sicherheit da er mal beim vergleichen welche falsch eingelesen hat...

Viele Grüße Juli

radbruch
15.10.2012, 22:00
Hallo

Für einen vernünftigen Stopwert solltest du zumindest das Mittel mehrerer Lesungen verwenden:


FrontLED(ON); // Front LED an
Sleep(10); //
LineData(lineData); // ADC "anwärmen"
LineData(STOP);
LineData(lineData);

STOP[0] = (lineData[0]+STOP[0])/2 +10; // STOP wert Berechnen (links)
STOP[1] = (lineData[1]+STOP[1])/2 +10; // STOP wert Berechnen (rechts)

(Die FrontLED dient ja wohl nur zur Deko...)

Wenn die Schleife bis zum Beleuchten der Photodioden ausgeführt werden soll, muss man prüfen, ob beide Werte jeweils kleiner als STOP sind:

while ((lineData[0] < STOP[0]) && (lineData[1] < STOP[1])); //solange bis der eingelesene Wert heller wird als STOP

Nach


MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
BackLED(ON,ON);
startet er aber sofort wieder durch!

Gruß

mic

Valen
15.10.2012, 22:30
Genau, während er seine Sensoren misst fährt er einfach weiter. Er zittert nur zwischen fahren und anhalten für eine periode von 200 Milisekunden. Und geht deshalb auf halbe fahrt (von halbe fahrt).

Hier ist meine Vorschlag. Achte auf die BackLEDs.


int main(void)
{
Init();

unsigned int lineData[2], STOP[2]; // Stopwert seitenabhängig verwalten

unsigned char Beleuchtet[2]; // Sensor wert über STOP-Wert? (boolean)

LineData(lineData); //
LineData(lineData);

STOP[0] = lineData[0]+10; // STOP wert Berechnen (links)
STOP[1] = lineData[1]+10; // STOP wert Berechnen (rechts)

MotorDir(FWD,FWD); // vorwärts
MotorSpeed(180,180);
BackLED(OFF,OFF);

while(1)
{
LineData(lineData);

if (lineData[0] > STOP[0])
{ Beleuchtet[0]=1; // Ich sehe eine Taschenlampe auf Links
}
else Beleuchtet[0]=0; // Ich sehe keine Taschenlampe auf Links
if (lineData[1] > STOP[1])
{ Beleuchtet[1]=1; // Ich sehe eine Taschenlampe auf Rechts
}
else Beleuchtet[1]=0; // Ich sehe keine Taschenlampe auf Rechts

// BackLEDs anschalten gleich wie Beleuchtung: 'Gultig' = ungleich 0 = ON, 'Nicht Gultig' = gleich 0 = OFF
BackLEDs(Beleuchtet[0],Beleuchtet[1]);

// Sonnst kriegen wir keine Ahnung was passiert.

if (Beleuchtet[0] && Beleuchtet[1])
{
// Licht fällt auf Beide Sensoren
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
}
else
{
// Licht? Macht mich nichts!
MotorDir(FWD,FWD); // Vorwärts wieder!
MotorSpeed(180,180);
}

Msleep(200);
BackLED(OFF,OFF);

}

return 0;
}

J_uli
15.10.2012, 22:49
Also Das funktioniert einbahn frei jetzt danke also ich hab noch eine 2.Sache probiert die auch ganz gut hingehauen hat aber nie so genau wie dein COde ... Hier noch mein Code


#include "asuro.h"

int main(void)
{
Init();
unsigned int lineData[2], STOP[2]; // Stopwert seitenabhängig verwalten


FrontLED(ON); // Front LED an
Sleep(10); //
LineData(lineData); // ADC "anwärmen"
LineData(STOP);
LineData(lineData);

STOP[0] = (lineData[0]+STOP[0])/2 +10; // STOP wert Berechnen (links)
STOP[1] = (lineData[1]+STOP[1])/2 +10; // STOP wert Berechnen (rechts)


while(1)
{


MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
BackLED(ON,ON);

do{
LineData(lineData);
}
while ((lineData[0] > STOP[0]) && (lineData[1] > STOP[1])); //solange bis der eingelesene wert heller wird als STOP


MotorDir(FWD,FWD); // zurücksetzen
MotorSpeed(255,255);
BackLED(OFF,OFF);
Msleep(2000);


/*Msleep(200);
MotorDir(BREAK,BREAK);

*/



}
return 0;
}

Vielen Dank ich mach's als gelöst ;)

Juli

radbruch
15.10.2012, 23:16
Prima. So reicht ein Sensor zum Anhalten:

while ((lineData[0] > STOP[0]) || (lineData[1] > STOP[1])); // solange die Photosensoren beleuchtet werden