Archiv verlassen und diese Seite im Standarddesign anzeigen : [gelöst] schwarze linie - rückwärts - 90 grad drehung
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
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
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.