PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Liniefolgen asuro hängt in if



xSimonx
12.09.2010, 15:40
Hi,

ich hab ein Problem.

Wollte das mein Asuro auf einer Linie fährt und bei leichtem verlassen da gegensteuert.

linedata ist ungefähr 200 bei weiß.


#include "asuro.h"

int main(void)
{unsigned int linedata[2];



Init();
while(1)
{
FrontLED(ON);


MotorDir(FWD,FWD);
MotorSpeed(80,80);


if(linedata[0]<180)
{
MotorDir(FWD,FWD);
MotorSpeed(0,190);
}
else if (linedata[1]<180)
{
MotorDir(FWD,FWD);
MotorSpeed(190,0);
}


}
return (0);
}



jetzt dreht er sich einfach im Kreis (ich weis die werte sind sehr hoch aber des war nur damit ich auch eine Änderung sieh)

gruß simon

markusj
12.09.2010, 17:27
Hallo Simon, schau dir deinen Code Mal ganz genau an - Wo erfasst du die Messdaten?

Außerdem machst du in deiner Schleife eine Reihe sinnloser Dinge - Du setzt die Geschwindigkeit und Richtung einmal pauschal am Anfang und überschreibst sie direkt danach wieder.
Außerdem würde ich am ehesten die beiden Werte miteinander vergleichen und nicht mit einer Konstanten ...

mfG
Markus

xSimonx
12.09.2010, 20:55
hi

danke für die schnelle Antwort.

die Messdaten hab ich wohl im laufe des Tages raus gelöscht ^^
im Kreis ist er wohl immer gefahren weil die werte einfach doch nicht gepasst haben hab sie jetzt nochmal angepasst und ihn langsam fahren lassen jetzt Schaft er schon mal ein paar kurven.

Sinnlosen Sachen sind jetzt denk auch soweit draußen.

und des mit beiden werten vergleiche und abziehen hab ich noch net so ganz gerafft aber denk da wert ich morgen mal schauen ob ich dahinter komm^^

Gruß simon

xSimonx
16.09.2010, 20:32
So ich bins nochmal

hab des mir dem Helligkeitsvergleich jetzt glaub hin bekommen

jetzt hab ich nur eine frage was ist wenn ich bei den Motoren statt 255 z.b. 5000 eingebe oder ein - davor setze

eigentlich dürfte es ja nix machen wollt mich nur mal absichern bevor er kaputt geht^^

gruß

radbruch
16.09.2010, 21:58
Hallo

Kaputt gehen wird nichts. Passieren kann alles mögliche, weil der Parameter für MotorSpeed() nur 8 Bit groß sein darf.

Gruß

mic

xSimonx
19.09.2010, 11:56
Danke für die schnelle Antwort

habs mal versucht aber der asuro ist nur komisch rumgefahren, denk aber das liegt eher an den licht werten.

ich hab jetzt den Code drauf um die licht werte zu vergleichen

#include "asuro.h"

int main(void)
{unsigned int linedata[2];
int Sum;
int Diff;


Init();


LineData(linedata);
FrontLED(ON);
Msleep(100);
Sum=linedata[0]-linedata[1];
Sum=linedata[0]-linedata[1];
while(1)
{LineData(linedata);

Diff=(linedata[0]-linedata[1])-Sum;
PrintInt(Diff);

Msleep(1000);



}
return (0);
}


jetzt müsste er doch wenn er auf einem weißen blatt steht und nicht bewegt wird oder das licht verändert 0 anzeigen oder?
Weil meiner zeigt jetzt -40 an.

Gruß Simon

Ceos
03.10.2010, 11:17
auhc wenns von der rechenzeit bissl böse ist, große erfolge hab ich mit differentieller messung erhalten

cih messe einmal die sensoren MIT eingeschalteter diode und gleich danach mit abgeschalteteer diode und berechne mir dann die idfferenz

(ACHTUNG: die differenz kann negativ sein, also unglaublich hoch werden wenn man mit unsigned char arbeitet, lieber aus den beiden unsgned char einen signed int machen)

signed int diff = (signed int) wert_mit_diode - (signed int) wert_ohne_diode;
diff = (diff < 0)?0:diff;

das raubt zwar rechenzeit, aber die werte sind extrem genau, wenn man nicht gerade direkte lichteinstrahlung hat und die dioden übersteuert

MfG Frank

markusj
03.10.2010, 11:31
Hallo Frank,

du kriegst nen Trostpreis wenn du eine halbwegs logische Erklärung dafür aufbieten kannst, warum eine einfache Differenz "teuer" ist.
(Kleine Tipp: Ein AVR kann in einem Takt eine 8-Bit-Addition/Subtraktion durchführen, der Aufwand steigt linear mit der Anzahl der Bytes)

Teuer sind lediglich Multiplikationen (durch den eingebauten Hardware-Multiplizierer auch noch relativ moderat) und Divisionen (relativ teuer).
Getoppt wird aber alles durch Fließkommaberechnungen ...

mfG
Markus

Ceos
03.10.2010, 11:48
teuer ist das ein und ausschalten den diode über die asuro lib, meiner erfahrung nach passieren zwischen 2 messungen inklusive an und abschalten der diode dabei sooo viele rechenschritte (irgendwann mal hab ich mir das angesehen aber die genaue anzahl vergessen) dass man das flackern der diode mit bloßem auge erkennt und das sollte meiner meinung nach bei nem 8MHz prozessor nicht zwingend möglich sein ... daher "teuer"

die "einfache betrachtung" ist hier leider unnütz, da muss man auch erfahrung und umgebungsbedinungen beachten

wenn man weis WIE kann man die messung aber mit sicherheit optimieren ... z.B. die 4 aufrufe in einer methode zusammenfassen und so 3 mal "overhead" sparen

markusj
03.10.2010, 12:59
Hallo Frank,

ich würde Mal spontan vermuten dass das eher am restlichen Programm liegt, die Ansteuerung der Diode benötigt nur wenige Takte.
Am längsten dauert die blockierende Auswertung der beiden Liniensensoren, wobei man das ja auch über einen Interrupt entkoppeln kann. Die wahrgenommenen Aussetzer der LED sind wohl darauf zurückzuführen.

Im Übrigen möchte ich mich dafür entschuldigen dass ich meinen obigen Beitrag unnötig aggressiv formuliert habe ...

mfG
Markus

PS: Es dürfte vermutlich reichen, den Dunkelwert mit deutlich niedrigerer Frequenz zu aktualisieren als den Wert mit eingeschalteter LED ...
PPS: Bei einigen Versuchen hat es sich gezeigt dass bei einem normal beleuchteten Raum die Helligkeit auch ohne Front-LED zum Linienfolgen ausreicht - Du subtrahierst dir also auch ein Stück Nutzssignal weg ...