hi
also ich denke nicht, das die LED und der Empfänger vertauscht wurden, dann würde der mega8 ja gar nichts mehr messen ausserdem müsste doch dann td der eine motor langsamer werden.
MfG
Jan
Druckbare Version
hi
also ich denke nicht, das die LED und der Empfänger vertauscht wurden, dann würde der mega8 ja gar nichts mehr messen ausserdem müsste doch dann td der eine motor langsamer werden.
MfG
Jan
Aber dann müsste im Programm ja trotzdem noch ein Fehler sein, das es ja eigentlich dann bei einem Rad funktionieren müsste. Und wenn ich das alles richtig verstanden habe, dann müsste ein Rad ja eigantlich ganz schnell langsamer werden da bei einem die Hilfsvariable ja nie großer wird, die andere aber schon.
Eigentlich müssten die Werte wenn ich das Rad mit der Hand abbremse ja änder? - Das tun sie aber nicht.
Mfg Chrise
Hallo Chrise,
dein Programm rechnet sich meiner Meinung nach den 'Wolf' für nix und wieder nix.
Du nutzt einmal vor der while-Schleife ein MotorDir(), aber deine Rechenergebnisse (Variablen c und d?) werden nirgendwo benutzt um mit MotorSpeed() irgendwo eine Wirkung zu erzielen.
Habe ich da nun etwas total übersehen, oder ist dein geposteter Programmcode nur ein Ausschnitt?
Gruß Sternthaler
Ok.... das ein paar Sachen umsonst rechnet seh ich sofort ein (im neuen Programcode hab ich das alles mal weggelassen, wo ich der Ansicht war, dass es eigentlich nichts bringt).
c und d werden aber verwendet. Sie stehen für die Geschwindigkeiten eines Motors (c fur den linken Motor und d für den rechten Motor). Am Ende des Programmes werden die beiden Variablen verkleinert, um eben den Asuro auf einer geraden Bahn zu halten. Es ollte eigentlich noch eine Funktion her, dass wenn beide Räder den gleichen weg zurücklegen, dass die Geschwindigkeit wieder erhöht wird, den sonst würde der Roboter bald einmal stehen.
Und nein..... es ist das ganze Programm.
mfg ChriseCode:#include "asuro.h"
int main (void)
{
unsigned int data[2];
unsigned int L_alt_l[1]; //Letzte Wert des linken Fototransistors
unsigned int L_alt_r[1]; //Letzte Wert des rechten Fototransistors
int a; //Anzahl der gezählten Übergenge links von s zu w und w zu s
int b; //Anzahl der gezählten Übergenge rechts von s zu w und w zu s
unsigned char c; //Wert für die Geschwindigkeit des linken Motors
unsigned char d; //Wert für die Geschwindigkeit des rechten Motors
int dh_l;
a = 0;
b = 0;
c = 140; // Wert für linken Motor bestimmen
d = 140; // Wert für rechten Motor bestimmen
Init();
OdometrieData(data);
MotorDir(FWD, FWD);
while(1)
{
MotorSpeed(c, d);
L_alt_l[0] = data[0];
L_alt_r[0] = data[1];
OdometrieData(data);
dh_l = data[0] - L_alt_l[0];
if( dh_l > 200 || dh_l < -200)
{
a++;
}
if( data[1] - L_alt_r[0] > 200 || data[1] - L_alt_r[0] < -200)
{
b++;
}
if( a < b)
{
d--; //Geschwindigkeit des rechten Motors verkleinern
}
if( a > b)
{
c--; //Geschwindigkeit des rechten Motors verkleinern
}
}
}
hi
also ich hab bei meinem asuro rausgefunden, dass in einem programm nur einmal OdometrieData(data) aufgerufen werden kann. alle weiteren ignoriert er einfach. ich weiß nicht, ob das immer so ist, oder ob ich was falsch mache, aber vllt solltest du das mal versuchen und das erste OdpmetrieData(data) weglassen.
MfG
Jan
Ich werds mal probieren, doch ich glaube nicht dass das zweite OdometrieData(data) ignoriert wird, da beim auslesen der Werte, diese sich immer wieder mal ein bisschen geändert haben, aber halt immer nur ca. 10. Das war meiner Ansicht nach nicht erwähnenswert, bereu ich aber eh schon, weil ich euch informationen vorenthalten habe.
Sorry
Mfg
Hallo Chrise,
mein Fehler. Jetzt habe ich das MotorSpeed() auch im ersten Programm gefunden. Ist meinen wild suchenden Augen irgendwie entfleucht.
Dann nun also zum eigendlichen Inhalt.
Hier in dh_l bestimmst du die Differenz zwischen 2 hintereinander gemachten ODO-Messwerten.Code:L_alt_l[0] = data[0];
L_alt_r[0] = data[1];
OdometrieData(data);
dh_l = data[0] - L_alt_l[0];
Mit Folgendem untersuchst du diese Differenz auf einen Sprung um mehr als 200 Messeinheiten um a zu beeinflussen:
Ähnlich machst du das dann auch für die rechte Seite.Code:if( dh_l > 200 || dh_l < -200)
{
a++;
}
Und schon fängt dein Programm wieder von vorne an.
Unterm Strich hast du als größten Zeitfresser nur den Aufruf der Funktion OdometrieData(). Dort werden gerade mal 2 AD-Wandlungen gemacht, die so langsam auch nicht sind.
Nun passiert also folgendes:
- Die Odo-Scheiben drehen sich vor den Sensoren
- Du misst kontinuierlich die Helligkeitsänderungen
- Du untersuchst die Messwerte auf eine Differenz von mehr als 200 Einheiten
- Du berechnest 'Geschwindigkeitsanpassungen' in d und c
Ich glaube, dass dein Asuro startet, und dass sich die Geschwindigkeit überhaupt nicht ändert, so dass er in einem Bogen im Kreis fährt.
Das wird daher kommen, dass die Differenzen zwischen 2 hintereinander gemachten Messungen keinesfalls größer als 200 Einheiten sein werden. (Ausnahmen bestätigen die Regel)
Um dir hier nicht alles direkt zu verraten, nur mal ein Hinweis auf einen Thread zu diesem Thema: farratt weist auf einen
Sinusverlauf der Daten hin.
Und dazu dann auch ein Bildchen. Die oberen 10-Bit-Daten gelten für die Funktion OdometrieData().
Es waren ungefähr 30 Messungen in einem Sinuszyklus!
Gruß Sternthaler
So.... ich hab jetzt mal die linke Seite der durchgecheckt und bin darauf gestoßen, dass der Fototransistor irgendwie kurzgeschlossen war(Ich weiße jede schuld von mir, da ich ihn nicht zusammen gebaut habe).
Meine neuen Werte betragen: 325, 192, 826, 463
Nun werd ich mal ein Programm schreiben, dass mir die Werte in gemessener Reihenfolge ausgibt und dann den wert beim wechsel von schwarz und weiß und weiß auf schwarz änder und schauen obs funzt
mfg
Edit: Also wenn ich die Daten auslese bekomm ich zwaar für die rechte Seite eine Halbwegs anständige Kurve, jedoch mit ein paar ausnahmen. Bei der linken Seite ist allerdings alles anders. Da sieht das ganze fast mehr nach einem Sägezahn aus, als nach einem Sinus^^.
,ach mal ne grafik!
@damaltor
ja, grafik (und natürlich kleinschreibung) ist cool. Vor allem wenn Platz vorhanden ist ;-)
@Chrise
Kannst du mal deine ermittelten Daten posten. Muss keine Grafik sein.
Gruß Sternthaler