Hast du das TRIGGERLEVEL schon angepasst?? Es dauert auch ein bisschen bis es sich einpendelt.
mfg liggi
So ich bin´s mal wieder...
Hab mich nun an die Odometrie gewagt und leider (wie soll es auch anderst sein) funktioniert sie nicht.
Im ASURO Band 2, soll man sich langsam an die Odometrie gewöhnen und fängt daher erstmal damit an, den ASURO geradeaus fahren zu lassen.
Leider fährt mein ASURO eine leichte Rechtskurve!
Was ist an meinem Programm falsch???
Code:/*Geradeausfahren*/ #include "asuro.h" //Schwellwert für die Hell/Dunkel-Unterscheidung //Eventuell muss damit etwas variiert werden #define TRIGGERLEVEL 600 #define HYSTERESIS 10 #define LOW 0 #define HIGH 1 int main(void) { unsigned int data [2]; signed int status [2]={0,0}; signed int difference=0; Init(); MotorDir(FWD,FWD); while(1) { //Helligkeitswerte der Lichtschranken auslesen OdometrieData(data); //Wechsel linker Sensor von niedrig auf hoch? if((status[0]==LOW)&&(data[0]>TRIGGERLEVEL+HYSTERESIS)) { status[0]=HIGH; difference++; } //Wechsel linker Sensor von hoch auf niedrig? if((status[0]==HIGH)&&(data[0]<TRIGGERLEVEL-HYSTERESIS)) { status[0]=LOW; difference++; } //Wechsel rechter Sensor von niedrig auf hoch? if((status[1]==LOW)&&(data[1]>TRIGGERLEVEL+HYSTERESIS)) { status[1]=HIGH; difference--; } //Wechsel rechter Sensor von hoch auf niedrig? if((status[1]==HIGH)&&(data[1]<TRIGGERLEVEL-HYSTERESIS)) { status[1]==LOW; difference--; } //zur Sicherheit: verhindern, dass der Differenzzähler den erlaubten Wertebereich verlässt if(difference<-255) difference=-255; if(difference>255) difference=255; //StatusLED noch entsprechend der erkannten Segmente aufleuchten lassen, grün für links, rot für rechts StatusLED(status[0]+status[1]*2); //Zähldifferenz passemd auf die Motoren verteilen if(difference>0) MotorSpeed(255-difference,255); else MotorSpeed(255,255+difference); } return 0; }
Hast du das TRIGGERLEVEL schon angepasst?? Es dauert auch ein bisschen bis es sich einpendelt.
mfg liggi
Lieber am Asuro rumschrauben als alles andere.
Meine Homepage
ich hab das selbe Problem wie NOMIS(Probleme mit Odometrie), ich erhalt nicht wirklich ein TRIGGERLEVEL, also kann ich sie auch nicht anpassen oder?
und wenn ich doch ein Signal bekomm, wie pass ich das dann an?
vielleich kann man es mal mit zwei probieren?
mfg liggi
Lieber am Asuro rumschrauben als alles andere.
Meine Homepage
Hallo
Lass dir doch die Werte mal am Terminal anzeigen:
Ohne Ansteuerung der Motoren, dann kannst du die Räder mit der Hand drehen und die Werte austesten. So kannst du auch den Einfluß von Fremdlicht und die Wirkung von axial verschiebbaren Codescheiben auf die Werte sehen.Code:while(1) { OdometrieData(data); SerWrite("\n\r",2); PrintInt(data[0]); SerWrite(" ",2); PrintInt(data[1]); Msleep(500); }
Wenn du eine ältere Library (asuro.c) ohne PrintInt() und Msleep()verwendest:
Triggerlevel sollte nun mindestens um Hysteresse kleiner als der max-Wert und mindestens um Hysteresse größer min-Wert sein. Bei z.B. min=150 zu max=600 wäre 400 ein möglicher Triggerlevel. Eine etwas größere Hysteresse (vielleicht 50-100) verringert Fehlzählungen.Code:void PrintInt(int wert) { char text[16]=" "; itoa(wert,text,10); SerWrite(text,strlen(text)); } void Msleep(int dauer) { int z; for(z=0;z<dauer;z++) Sleep(36); }
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Es geht immer noch nicht
ich bekomm im Terminal immer nur
und weiß nicht warum?Code:LoggingOdometers V1.0 (2006-05-21, Arexx-Henk)
Kann es sein, dass an meim ASURO was kaputt ist?
Hallo
Ich geh mal davon aus, dass dein asuro funktioniert. Fragen zum Odo-Logger kannst du auch direkt im arexx-Forum stellen, dort antwortet dir vermutlich Arexx-Henk selbst.
Alternativ kannst du auch deinen eigenen "Datenlogger" schreiben, die wesenlichsten Teile dafür habe ich oben schon gepostet. Dann siehst du auch, wie das funktioniert, bei henks Programmen hast du vermutlich nur das Hex-File.
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
versuche einfach mal, ohne die motoren einzuschalten, den aktuellen wert der Sensoren immer wieder in hyperterminal zu senden, so wie es radbruch oben schon gesagt hat. wenn du dann die räder langsam (von hand) drehst, sollten sich die werte verändern, je nachdem ob ein schwarzes oder ein weisses feld vor dem sensor ist. nicht verzweifeln, wir sind ja da
hallo radbruch, mit deinem quelltext gibt es ein problem:
weißt du auf anhieb warum er data nicht kennt? steht das nicht in asuro.h?Code:test.c: In function `main': test.c:20: error: `data' undeclared (first use in this function) test.c:20: error: (Each undeclared identifier is reported only once test.c:20: error: for each function it appears in.) make: *** [test.o] Error 1 > Process Exit Code: 2
Das ist kein "Quellcode", es sind nur Codeschnippsel die du in ein Programm einsetzen kannst. Die while-Schleife kommt in main(), PrintInt und Msleep in den Vorkopf. Variablen must du selbst anlegen.
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Lesezeichen