Hallo,
prüfe mal die äußeren Radmuffen, manchmal verhakt der Bot sich da und man muß sie am äußersten Ende der Achse anbringen.
Gruß
Matthias
Werden die odoleds angeschaltet im betrieb? Und hast du den beleuchtungswerten angepast an deiner asuro im odometrie algorithmus?
Postet deine program bitte.
Hallo,
prüfe mal die äußeren Radmuffen, manchmal verhakt der Bot sich da und man muß sie am äußersten Ende der Achse anbringen.
Gruß
Matthias
Also hier mein Programm:
Ist ein wenig durcheinander, aber der gedanke war der
das ich über den Pollswitch in einzelne Modi´s springe (Demomode, und steuern über Seriell) Ist aber noch nicht ganz fertig
Code:#include "asuro.h" #include "myasuro.h" int x=0; //Zählvariablen für diverse Zählschleifen char emfangene_daten[10]; void Goo(int d,int l) //eigene goturn anweisung { //Nur zum Test!!!!!! if (l>0) MotorDir(FWD,FWD); else MotorDir(RWD,RWD); MotorSpeed(d,d+8); //die +8 sind nur zum gradeaus fahren Msleep(5000); MotorSpeed(BREAK,BREAK); } int main(void) { Init(); //Devinierter Zustand vom ATMEL while(1) { while (PollSwitch() == 0) { StatusLED (GREEN); Msleep (500); StatusLED (RED); Msleep (500); } switch (PollSwitch()) //Auswahlmenü gesteuert über Pollswitch { case 1:emfang(); break; case 4: //Kleine Fahranweisung zu Demo zwecken. StatusLED (YELLOW); Msleep (2000); EncoderInit (); for (x=1; x<=4; x++) //Asuro fährt ein quadrat {GoTurn ( 0, 45, 200); //45° hier entspricht 90° drehung im real, da "grobe" encoderscheibe eingebaut GoTurn (150, 0, 200);} Msleep(1000); for (x=1; x<=2; x++) //Asuro fährt einen kreis vorwärts und rückwärts {if (x==1) GoTurn (300, 90, 255); else GoTurn (-300, -90, 255); Msleep(500);} break; default: //Bei falscheingabe blinkt die Status LED 5x Gelb for(x=1; x<=5; x++) {StatusLED(OFF); Msleep(500); StatusLED(YELLOW); Msleep(500);} break; } return 0; } } int emfang(void) //Steuerung über Seriel { EncoderInit (); StatusLED (YELLOW); BackLED (ON, OFF); Msleep (500); BackLED (OFF,ON); Msleep (500); BackLED (OFF,OFF); //AUS damit!!!! SerWrite ("READY", 10); SerRead (emfangene_daten, 1, 0); //Warte auf Daten, ohne timeout!! switch (emfangene_daten[0]) { case'T': //keine Daten erhalten break; case '1': //Wenn daten =1 fahr vor. GoTurn(10, 0, 150); break; case '2': //wenn daten =2 fahr zurück Goo (200, 1); break; default: //sonst sendefehler 5xgelb for(x=1; x<=5; x++) { StatusLED(OFF); Msleep(500); StatusLED(YELLOW); Msleep(500); } break; } return 0; }
@ ExMachina: einen fehler durch die Radmuffe kann ich ausschließen, da es über Motorspeed keine probleme gibt. Nur bei GoTurn.
Aber danke für die Idee.
Ob es deine problehm verursacht weiss ich nicht genau, aber MotorSpeed(x,x) muss 'unsigned int' werten haben. Nicht 'int' werten wie in dein Goo-header.
Aber wesentlicher ist es den EncoderInit (); (in deine Empfang code) gleich hinter den letzten BackLED zu schreiben. Den BackLED function schaltet den odoleds einfach aus, und werden danach nicht wieder eingeschaltet. Und deshalb sind den verschiedene Goturn's und Go's auf dem falschen Weg.
Hallo Valen, Danke für die schnelle Antwort.
Ja hast recht es muss 'unsigned int' sein, hatte ich gar nicht drauf geachtet. Ist aber zum glück nicht aufgefallen, da ich nur mit Positiven Werten im Wertbereich gearbeitet hatte.
Das mit dem EncoderInit() hab ich an einer weiteren Stelle im Programm noch mal eingebaut ohne BackLeds:
Gruß AlexCode:case 4: //Kleine Fahranweisung zu Demo zwecken. StatusLED (YELLOW); Msleep (2000); EncoderInit (); for (x=1; x<=4; x++) //Asuro fährt ein quadrat {GoTurn ( 0, 45, 200); //45° hier entspricht 90° drehung im real, da "grobe" encoderscheibe eingebaut GoTurn (150, 0, 200);} Msleep(1000); for (x=1; x<=2; x++) //Asuro fährt einen kreis vorwärts und rückwärts {if (x==1) GoTurn (300, 90, 255); else GoTurn (-300, -90, 255); Msleep(500);} break;
Das habe ich gesehen, aber das macht nichts wenn du '1' oder '2' gesendet hast. Die Goo und Goturn danach mussen auch den odoleds an haben.
Was du uberhaupt zum Asuro sendet oder dem welchen Taster eindrucken du machst hast du auch noch nicht erzahlt. Sehr wichtig weil wir nicht sehen konnte welchen funktionen Asuro in seinem gehirn auf jeder stelle anruft. Und du kanst das eigentlich aucht nicht. Das geht manch zu schnell. Aber glucklich hast du viel StatusLED funktionen und Msleep's um das zu beurteilen. Das ist aber nicht immer so.
Hmm am besten wir Versteifen uns jetzt nicht nur auf mein anfänger Programm. Habe den Fehler des Schwachen motor´s auch wenn ich andere Programme wie z.b. die Examples aus der 2.71 Lib aufspiele.
Werd auch später mal die 2.80 Lib ausprobieren, vielleicht bringt mir das mehr oder vielleicht ist der Fehler da auch ganz weg.
Hatte bisher bei der neuen Lib probleme mit dem Flashen, wenn ich da änderungen gemacht hab.
Werd euch heut abend mehr dazu erzählen können.
Ok, dan wurde es moglicherweisse etwas anderes sein. Du weisst das die 2.71 und 2.8 lib neu kompiliert sollten werden mit deine odometrie 'dunkelheit'-werten und den 'tick-pro-meter'-faktor im myasuro.h???Hmm am besten wir Versteifen uns jetzt nicht nur auf mein anfänger Programm. Habe den Fehler des Schwachen motor´s auch wenn ich andere Programme wie z.b. die Examples aus der 2.71 Lib aufspiele.
Hallo Valen, hab die Lib jetzt bestimmt 20x Übersetzt immer das gleiche ergebnis.
Hab daher noch mal etwas rumgebasstelt und nun Versteh ich es gar nicht mehr.
Auch bei der 2.80 Lib ist es das gleiche.
Daher hab mal angefangen mein Goo richtig zu machen.
Das komische an der ganzen sache ist hier funktioniert das ganz wunderbar. Asuro fährt grade UND beide Motoren haben die gleiche Power.Code:void Goo(int d,int l) //eigene go anweisung { StatusLED(GREEN); SetMotorPower(d,d+5); //Fahr los mit vorgegebenem Tempo,richtung über +/- Wert l=l*38/10; //l ist die Strecke die zurück gelegt werden soll. 1cm = 3.8 ticks EncoderInit(); for(encoder[1]=0; encoder[1]<=l; x++) { Msleep (10); } MotorSpeed(BREAK,BREAK); }
Wenn du es komplet umgebastelt hat wurde es naturlich besser sein den complet geanderten code zu posten. Damit jeder etwas davon lernen kan. Aber nun alles klapt is es auch ok naturlich. =D> Aber welche modifikation hat das gemacht.
Vernunftige losung, aber die x++ ist optionel in diesen fall. Den for-Schleife endet dan in:Code:for(encoder[1]=0; encoder[1]<=l; x++)
Du machts nicht mit den zahler x weiterhin, oder es hat gar keine relation mit die variabele l. deshalb kan es weg. Und den for-schleife geht doch weiter bis die encoder[1] wert grosser wie l ist. Im princip sind die for-schleife und while-schleife sehr ahnlich. Den for-schleife hat nur ein initialisierung und moglicherweise ein zahler eingebaut. Aber nicht verpflichted.Code:for(encoder[1]=0; encoder[1]<=l; )
Lesezeichen