Zwischenbericht: Überarbeitet, klappt immer noch nicht. : (
Soll ich vielleicht einfach nochmal alles schön ordentlich kurz und präzise hinschreiben und einen neuen Thread eröffnen? Wirkt vielleicht nicht so abschreckend und es würde evtl. mal jemand antworten ; )Code:/* ####################################################### */ /* ############# FUNKTIONEN DEFINIEREN ################### */ /* ####################################################### */ #include "asuro.h" // Konfigurationsdateien laden #define MITTER 155 // ca. die Hälfte der Amplitude #define MITTEL 140 // der Odometriewerte. Benötigt für // Initialisierung /* ####################################################### */ /* ############# FUNKTIONEN DEFINIEREN ################### */ /* ####################################################### */ /* Globale Variablen */ unsigned char i; // Zähler char alr=0; // schon (already) gelaufen? char alr2=0; // schon (already) gelaufen? unsigned int cntsL=0; // Zähler (counts) unsigned int cntsR=0; // Zähler unsigned int cnts=0; // Zähler unsigned int odoData[2]; // Array für Odo Werte unsigned int lrHi[2]={MITTEL, MITTER}; // left right highest unsigned int lrLo[2]={MITTEL, MITTER}; // left right lowest unsigned char spd0=190; // Geschwindigkeit (speed) unsigned char spd1=190; // Geschwindigkeit unsigned int odoMemL[3]={0,0,0};; // Ododaten zwischenspeichern (ododmetrie memory) unsigned int odoMemR[3]={0,0,0};; // Ododaten zwischenspeichern unsigned int testErg[2]={MITTEL, MITTER}; // Ergebnisse des Durchlaufes (Testergebnis) // 0=low, 1=hi /* --- Verbesserte Sleep Funktion --- */ void schlafen(unsigned int wert){ for(i=0; i<=wert; i++) Sleep(72); } /* - Geradeausfahren Initialisieren - */ char InitFwd(void){ schlafen(250); StatusLED(RED); schlafen(250); StatusLED(YELLOW); MotorDir(FWD,FWD); // Zunächst gasgeben damit er fährt und Werte sammelt MotorSpeed(190,190); schlafen(250); // Zeit zum Beschleunigen geben /* Messung beginnen */ while(cnts<500){ // 500 Durchläufe zur Bestimmung der Hälfte // der Amplitude /* Neuer Algorithmus: "Durchlaufende Werte" */ OdometrieData(odoData); odoMemL[0]=odoMemL[1]; odoMemL[1]=odoMemL[2]; odoMemL[2]=odoData[0]; odoMemR[0]=odoMemR[1]; odoMemR[1]=odoMemR[2]; odoMemR[2]=odoData[1]; if(odoData[0]>lrHi[0]){ // die Höchstwerte ermitteln LINKS lrHi[0]=odoData[0];} else if(odoData[0]<lrLo[0]){ // die Tiefstwerte ermitteln lrLo[0]=odoData[0];} if(odoData[1]>lrHi[1]){ // die Höchstwerte ermitteln RECHTS lrHi[1]=odoData[1];} else if(odoData[1]<lrLo[1]){ // die Tiefstwerte ermitteln lrLo[1]=odoData[1];} testErg[0]=(lrHi[0]+lrLo[0])/2; // Test Ergebnisse zuweisen, testErg[1]=(lrHi[1]+lrLo[1])/2; // Mitte der Funktion bei Hälfte der Amplitue /* Hier wird geschaut, ob die Schwelle übertreten wird, falls ja hat Umdrehung stattgefunden */ /* links */ if((odoMemL[0]>odoMemL[1] && odoMemL[1]>odoMemL[2]) && (((odoMemL[1]/MITTEL)<1.05) && ((odoMemL[1]/MITTEL)>0.95))) { cntsL++; } else if(((odoMemL[0]<odoMemL[1]) && odoMemL[1]<odoMemL[2]) && (((odoMemL[1]/MITTEL)<1.05) && ((odoMemL[1]/MITTEL)>0.95))) { cntsL++; } /* rechts */ if((odoMemR[0]>odoMemR[1] && odoMemR[1]>odoMemR[2]) && (((odoMemR[1]/MITTER)<1.05) && ((odoMemR[1]/MITTER)>0.95))) { cntsR++; } else if((odoMemR[0]<odoMemR[1] && odoMemR[1]<odoMemR[2]) && (((odoMemR[1]/MITTER)<1.05) && ((odoMemR[1]/MITTER)>0.95))) { cntsR++; } if(cntsL>420 && cntsR>420){ alr=1; StatusLED(RED); schlafen(250); StatusLED(GREEN);} cnts++; }//while cnts MotorDir(BREAK,BREAK); MotorSpeed(0,0); schlafen(250); StatusLED(GREEN); schlafen(250); StatusLED(YELLOW); schlafen(250); StatusLED(GREEN); schlafen(250); StatusLED(YELLOW); schlafen(250); StatusLED(GREEN); schlafen(250); StatusLED(YELLOW); schlafen(250); StatusLED(GREEN); schlafen(250); return alr; } void Forward(void){ if(!alr2){ // Beschleunigen damit er in Fahrt Werte sammelt MotorDir(FWD,FWD); MotorSpeed(spd0,spd1); schlafen(250); // Zeit zum Beschleunigen alr2 = 1; } if(alr) { // Falls Vorprüfung stattgefunden hat, ausführen /* Dieser Programmteil ist weitestgehend identisch mit InitFwd(); */ /* Neuer Algorithmus: "Durchlaufende Werte" */ OdometrieData(odoData); odoMemL[0]=odoMemL[1]; odoMemL[1]=odoMemL[2]; odoMemL[2]=odoData[0]; odoMemR[0]=odoMemR[1]; odoMemR[1]=odoMemR[2]; odoMemR[2]=odoData[1]; if(odoData[0]>lrHi[0]){ // die Höchstwerte ermitteln LINKS lrHi[0]=odoData[0];} else if(odoData[0]<lrLo[0]){ // die Tiefstwerte ermitteln lrLo[0]=odoData[0];} if(odoData[1]>lrHi[1]){ // die Höchstwerte ermitteln RECHTS lrHi[1]=odoData[1];} else if(odoData[1]<lrLo[1]){ // die Tiefstwerte ermitteln lrLo[1]=odoData[1];} testErg[0]=((lrHi[0]+lrLo[0])/2); // Testergebnisse zuweisen, testErg[1]=((lrHi[1]+lrLo[1])/2); // Mitte der Odometriewertekurve /* Hier wird geschaut, ob die Schwelle übertreten wird, falls ja hat Umdrehung stattgefunden */ /* links */ if((odoMemL[0]>odoMemL[1] && odoMemL[1]>odoMemL[2]) && (((odoMemL[1]/testErg[0])<1.05) && ((odoMemL[1]/testErg[0])>0.95))) { cntsL++; } else if((odoMemL[0]<odoMemL[1] && odoMemL[1]<odoMemL[2]) && (((odoMemL[1]/testErg[0])<1.05) && ((odoMemL[1]/testErg[0])>0.95))) { cntsL++; } /* rechts */ if((odoMemR[0]>odoMemR[1] && odoMemR[1]>odoMemR[2]) && (((odoMemR[1]/testErg[1])<1.05) && ((odoMemR[1]/testErg[1])>0.95))) { cntsR++; } else if((odoMemR[0]<odoMemR[1] && odoMemR[1]<odoMemR[2]) && (((odoMemR[1]/testErg[1])<1.05) && ((odoMemR[1]/testErg[1])>0.95))) { cntsR++; } /* Dies ist ein neuer Programmteil. */ if(spd1==255 || spd0==255) // Falls Maximalspd erreicht Spielraum schaffen { spd1=spd1-10; spd0=spd0-10; } /* Hier wird die Geschwindigkeit angepasst. */ if (cntsL>cntsR) spd1++; else if(cntsL<cntsR) spd0++; /* Variable darf nicht überlaufen */ if((cntsR>5000 || cntsL>5000) && (cntsR>3000 && cntsL>3000)) { cntsL=cntsL-2000; cntsR=cntsR-2000; } /* Und losfahren! */ MotorDir(FWD,FWD); MotorSpeed(spd0,spd1); } } /* ####################################################### */ /* ############ BEGINN DES HAUPTPROGRAMMS ################ */ /* ####################################################### */ int main (void){ Init(); // Prozessor initialisieren InitFwd(); // Odo Initialisieren while(1) { Forward(); } return 0; } /* ####################################################### */ /* ############### ENDE DES PROGRAMMS #################### */ /* ####################################################### */







Zitieren

Lesezeichen