PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [gelöst] schwarze linie - rückwärts - 90 grad drehung



Sigi123
04.11.2010, 18:34
hallo
ich versuche nun seit 2 tagen ein Asuro programm zu entwerfen er soll folgendes tun:

-vorwärts
- wenn er eine Linie sieht anhalten
- kurz rückwärts fahren
- 90 wende nach links
- wieder von vorne

Nur die ersten 2 punkte sind das problem ..
vielleicht kann mir irgendjemand ja helfen

P.S. Der untergrund ist weiß

mfG Sigi

radbruch
04.11.2010, 19:24
Hallo

"vorwärts" dürfte ja eigentlich kein Problem sein

"wenn er eine Linie sieht anhalten" ist schon schwieriger. Woran erkennt der asuro die Linie?

"kurz rückwärts fahren" auch einfach...

"90 wende nach links" Schon schwieriger. Mit Odometrie sehr kompliziert, zeitgesteuert sehr einfach.

Das wären mal grob die Teilaufgaben. Vermutlich "klemmt" es bei der Erkennung der Linie. Wenn man sicher ist, dass der asuro beim Programmstart nicht auf der Linie sondern auf dem (weisen) Untergrund steht, kann man zuerst die aktuelle Helligkeit des Untergrunds ermitteln und als Vergleichswert speichern. Aus dem Ärmel geschüttelt und ungetestet könnte das Programm dazu etwa so aussehen:

#include "asuro.h"

unsigned int data[2], startwerte[2];

int main(void)
{
Init();
FrontLED(ON); // LED einschalten
Sleep(100); // Warten bis LED sicher volle Helligkeit erreicht hat
LineData(startwerte); // ADC warmlaufen lassen
LineData(startwerte); // Startwerte einlesen

MotorSpeed(150, 150); // Antriebe starten
while(1)
{
StatusLED(RED);
LineData(data); // aktuelle Helligkeitswerte einlesen

if(data[0] < (startwerte[0]-startwerte[0]/10)) StatusLED(YELLOW); // 10%
if(data[1] < (startwerte[1]-startwerte[1]/10)) StatusLED(YELLOW);
if((data[0]+data[1]) < ((startwerte[0]+startwerte[1])-((startwerte[0]+startwerte[1])/10))) StatusLED(YELLOW);

if(data[0] < (startwerte[0]/2)) break; // 50%
if(data[1] < (startwerte[1]/2)) break;;
if(((data[0]+data[1])/2) < ((startwerte[0]+startwerte[1])/2)) break;
}
MotorSpeed(0,0);
StatusLED(GREEN);
while(1);
return 0;
}


Gruß

mic

Sigi123
04.11.2010, 19:42
hallo
hatte grade einen Gedanken Blitz ^^



#include "asuro.h"
int main (void)
{
Init();
int ldata[2];
int v;
v=250 ; // muss an jeden roboter angepasst werden
while(1)
{
LineData(ldata);
if(ldata[0]<v){StatusLED(RED);}
else {StatusLED(GREEN);}
}

}


die rote status LEd leuchtet wenn fototransitor T9 die schwarze linie sieht
wenn der fototransistor den boden sieht leuchtet sie grün

der wert v muss immer abgestimmt werden da alle fototransistoren unterschiedlich sind

dann noch in ein programm wo der asuro dann noch fährt



#include "asuro.h"
int main (void)
{
Init();
FrontLED(ON);
MotorSpeed(150,160);
int ldata[2];
int z;
while(1)
{
LineData(ldata);
if(ldata[0]<250){MotorDir(BREAK,BREAK);
MotorDir(RWD,RWD);
for(z=0 ; z < 100 ; z++){Sleep(216);}
MotorDir(RWD,FWD);
for(z=0 ; z < 120 ; z++){Sleep(216);}
}
else { MotorDir(FWD,FWD);}
}
}


wo kann ich das thema als gelöst einstellen ?

danke trotzdem

mfG Sigi

edit:
das mit dem vergleichswert hat nicht immer funktioniert..

radbruch
04.11.2010, 19:51
Hallo

Glückwunsch zum Gedankenblitz :)

Wenn ein Problem gelöst wurde, kann man seinen eigenen ersten Beitrag im Thread editieren und im Titel ein "[gelöst]" ergänzen. Ich war mal so frei und habe das für dich erledigt. Weiterhin viel Spass mit deinem asuro wünscht

mic

Sigi123
04.11.2010, 19:53
habe nun ein anderes problem wenn ich ihn nun so durch ein labyrinth mit schwarzen linien als begrenzung fahren lasse ...blinkt nach einiger zeit die statusled grün und rot abwechselnd

mfg Sigi

radbruch
04.11.2010, 20:07
...blinkt nach einiger zeit die statusled grün und rot abwechselndPrüfe mal mit dem Terminal ob der asuro "VLVLVLVLVL..." sendet. Das würde "Voltage low" bedeuten, die Akkus sind leer.

Gruß

mic