Dein Fehler ist MotorSpeed(c, d); muss in die while-Schleife, da diese nich verlassen wird. Sonst fallen mir keine Fehler auf.
mfg liggi
Hallo!!
Endlich hab ich mal wieder Zeit gefunden um mich mit dem asuro zu beschäftigen.
Ich hab mich mal an die Odometrie gewagt und eigentlich meiner Meinung nach ein nicht so schlechtes Programm geschriebenm welches nur leider nicht funktioniert.
könnt ihr da vielleicht wo nen Fehler entdecken, oder ist das ganze generell falsch was ich da mache? Bitte nicht wunder das ich im unteren Teil für die Berechnung der Differenz zwei verschieden Methoden angewandt habe, will damit nur zeige das es mit keiner der zwei funktioniert.Code:#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 float n_l; float n_r; int a; //Hilfsvariable int b; //Hilfsvariable 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) { a++; n_l=a/8; //Umdrehungen in der Zeit t } if( data[1] - L_alt_r[0] > 200 || data[1] - L_alt_r[0] < -200) { b++; n_r=b/8; //Umdrehungen in der Zeit t } if( n_l < n_r) { d--; //Geschwindigkeit des rechten Motors verkleinern } if( n_l > n_r) { c--; //Geschwindigkeit des rechten Motors verkleinern } } }
mfg Chrise
Dein Fehler ist MotorSpeed(c, d); muss in die while-Schleife, da diese nich verlassen wird. Sonst fallen mir keine Fehler auf.
mfg liggi
Lieber am Asuro rumschrauben als alles andere.
Meine Homepage
Ohhh..... stimmt. Das hab ich ja völlig übersehn.
Allerdings funktioniert es noch immer nicht!?!?!?!
Ich habe oben den Programmcode so verändert wie das Programm jetzt aussieht.
was macht der Asuro überhaupt??? fährter einfach nur rum oder macht er gar nichts.
mfg liggi
hi
dein fehler dürfte sein,dass du links(data[0]) nur abfragst, ob das vorher kleiner war. also werden nur die übergänge von s-->w gezählt und nicht andersherum.
außerdem hättest du bei L_alt_l/r(was für umständliche namen xD) nicht [1] hinterschreiben müssen und ich nehme mal an, du möchtest mit der zeile
n_l = a/8
feststellen, wie oft sich das rad gedreht hat, so zählst du aber, wie oft sich das zahnrad davor gedreht hat.
also müsstest du
n_l = a/40
schreibensollte dein programm aber td nicht daran hindern, sich richtig audszuführen, auch wenn du statt n_l und n_r zu vergleichen doch auch einfach a und b vertgleichen könntest.
ich würde dir ausserdem empfehlen, die geschwindigkeit wieder auf 140 zu setzen, wenn links und rechts gleich sind.
MfG
Jan
hm.... aber daran kann es doch nicht liegen, dass das programm nicht funktioniert.
Also mein asuro macht neigentlich net viel. Die Räder drehen sich ganz normal und wenn man mit einem finger ein Rad abbremst, dreht sich das andere mit konstanter drehzahl weiter.
achja.... um den Fehler beim linken Übergangszähler wegzubekommen, baruch ja einfach nur
if( dh_l > 200 || dh_l < -200)
schreiben?!?!
mfg
Chrise
hi
also ich würde dir mal empfehlen, dieses programm auszuprobieren:
damit sendet der asuro die max und min odo-werte an den pc, denn es könnte sein, dass der s/w unterschied weniger als 200 ist.Code:#include "stdlib.h" #include "asuro.h" void SerWert(unsigned int iWert) { unsigned char cWert[6] = " "; itoa(iWert, cWert, 10); SerWrite(cWert, 5); SerWrite(", ", 2); } /** Hauptprogramm */ int main(void) { unsigned int Rmin = 1024; unsigned int Rmax = 0; unsigned int Lmin = 1024; unsigned int Lmax = 0; /** Geschwindigkeit */ int speed = 90; /** Odometrie links/rechts */ unsigned int data[2]; Init(); GREEN_LED_ON; MotorDir(FWD,FWD); MotorSpeed(speed, speed); while(1) { OdometrieData(data); // 0. links, 1. rechts // max links if (data[0] > Lmax) Lmax += (data[0] - Lmax) / 2; // min links if (data[0] < Lmin) Lmin -= (Lmin - data[0]) / 2; // max rechts if (data[1] > Rmax) Rmax += (data[1] - Rmax) / 2; // min rechts if (data[1] < Rmin) Rmin -= (Rmin - data[1]) / 2; SerWert(Lmax); SerWert(Lmin); SerWert(Rmax); SerWert(Rmin); SerWrite("\n\r", 2); } return 0; }
also ich bekomm, wenn ich mir die Werte zum Computer schicken lasse, immer nur die gleichen:
17, 5, 845, 461
mfg
hi
also wenn ich mich recht erinnere sind die ersten beiden werte für inks und die 2. beiden für rechts
d.h., dass dein programm nur rechts funktionieren sollte. links scheint die IR-Led kaputt zu sein.
MfG
Jan
bist du sicher dass du darauf geachtet hast dass die beiden teile je nach seite verauscht wurden? auf einer seite ist rosa vorn, auf der anderen seite weiss.
Lesezeichen