hey junges ihr könnt mir doch garantiert helfen, also wie bereits beschrieben versuche ich mich grade an Odometrie.
dazu hab ich mir nenn Quellcode aus dem netzt geholt, der funktioniert auch aber wenn ich denn so veränder das ich den als extra Funktion verwenden kann (func Drehzahl) fährt der asuro nicht mehr grade aus sonder so wie immer im Kreis.
Ich hätte den Quellcode auch eig. lieber ohne globale variablen aber ich weis nicht mehr wie man 2 Werte aus einer Funktion zurück gibt, also wen das schon mal jemand weiß würde ich mich auch schon freuen.
ich hoffe ihr könnt mir weiter helfen.^^
Quellcode aus dem netzt:
mein veränderter Quellcode:Code:#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) { int iSpeed = 120; 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�ler // den erlaubten Wertebereich verl�st if (difference<-iSpeed) difference=-iSpeed; if (difference>iSpeed) difference=iSpeed; // Status-LED noch entsprechend der erkannten Segmente // aufleuchten lassen, grn fr links, rot fr rechts StatusLED(status[0]+status[1]*2); // Z�ldifferenz passend auf die Motoren verteilen if (difference>0) MotorSpeed(iSpeed-difference,iSpeed); else MotorSpeed(iSpeed,iSpeed+difference); } return 0; }
Code:#include "asuro.h" #define TRIGGERLEVEL 600 #define HYSTERESIS 10 #define LOW 0 #define HIGH 1 int iaSpeed[2]={120,120}; int main() { BackLED(OFF,OFF); Init(); while(1) { MotorFWD(); } } void MotorFWD(void) { MotorDir(FWD,FWD); drehzahl(120,120); MotorSpeed(iaSpeed[0],iaSpeed[1]); FrontLED(ON); return 0; } int drehzahl(int iSpeed_left,int iSpeed_right) { unsigned int data[2]; signed int status[2]={0,0}; signed int difference=0; // 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�ler // den erlaubten Wertebereich verl�st if (difference<-255) difference=-255; if (difference>255) difference=255; // Status-LED noch entsprechend der erkannten Segmente // aufleuchten lassen, grn fr links, rot fr rechts //StatusLED(status[0]+status[1]*2); // Z�ldifferenz passend auf die Motoren verteilen if (difference>0) iSpeed_left-difference; else iSpeed_right+difference; iaSpeed[0] = iSpeed_left; iaSpeed[1] = iSpeed_right; return 0; }






Zitieren

Lesezeichen