- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 20

Thema: Motorgeschwindigkeitssynchronisation für ASURO

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    18.03.2005
    Ort
    Mecklenburg Vorpommern / Hamburg
    Alter
    35
    Beiträge
    80

    Motorgeschwindigkeitssynchronisation für ASURO

    Anzeige

    E-Bike
    Hallo! Ich möchte nun endlich mal meinem ASURO beibringen, geradeaus zu fahren, da er das nicht tut. Ich habe hier ein Programm entworfen, dass eigendlich die Motoren Synchronisieren soll (was es nicht tut). Bitte gebt hier eure Verbesserungsvorschläge ab.
    Code:
    #include "asuro.h"
    int main(void){
    	int a;
    	int b;
    	int s;
    	unsigned int data[2];
    	Init();
    	a=0;
    	b=0;
    	s=100;
    	MotorDir(FWD,FWD);
    	while(1){
    	OdometrieData(data);
    	if (data[0] < 412){a++; BackLED(ON,OFF);}
    	if (data[1] < 412){b++; BackLED(OFF,ON);}
    	if (a<b){s++; StatusLED(RED);}
    	if (a>b){s--; StatusLED(YELLOW);}
    	if (a==b){StatusLED(GREEN);}
    	MotorSpeed(s,120);
    	}
    	return 0;
    }
    Habe ich vielleicht bloß einen Widerstand falsch eingelötet, der für die Geschwindigkeit der Motoren zuständig ist, oder ist das bei euch auch das selbe Problem?

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.08.2004
    Ort
    Zwolle
    Alter
    68
    Beiträge
    531
    Hallo Julien,

    ist mir auch immer noch nicht gelungen,

    die 'OdometrieData()' function gibt die momentane helligkeit des reflectierten InfraRot (IR) licht. Beim linker/rechter rad gibts ein separaten IR sender und separaten IR empfanger.

    Wenn Asuro fahrt drehen sich die odometrie schwarz/wiess scheiben unabhangig von der zeit dass deine 'while()' schleiffe lauft.

    Ich meine, immer wenn die function 'OdometrieData()' ausgelesen wird gibts ein willkurlichen wert zwischen 0 und 255 abhangig ob ein weisen/schwarzen teil (oder ubergang) vom odometrierad gerade auf diesen moment an die IR detector vorbei geht.

    Oder hab ich deine frage vielleicht falsch verstanden?
    Kannst du mahl genauer sagen wie du die synchronisierung gemeint hast?

    gruss

    Henk

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    18.03.2005
    Ort
    Mecklenburg Vorpommern / Hamburg
    Alter
    35
    Beiträge
    80
    Hallo!
    Kann sein, dass ich mich falsch ausgedrückt habe.
    Meine Frage war, wie man ein Programm entwerfen kann, damit beide Räder mit gleicher Geschwindigkeit laufen. Dazu werden die Gesamtdrehzahlen des linken und des rechten Rades ausgelesen (durch die Odometrie an den jeweils 1. großen Zahnrädern) und in zwei Zählervariablen (jeweils für das linke und rechte Rad) gespeichert. Da das rechte Rad immer mit konstanter Geschwindigkeit läuft, muss sich das linke Rad nach der Geschwindigkeit des rechten richten. Dafür werden die Variablen verglichen, um so den Unterschied festzustellen. Ist die Zahl der Variable des linken Rades größer als die des rechten, muss die Drehzahl des linken Rades verringert werden ansonsten vergrößert werden.
    Mir scheint es so, als wenn du die Funktion OdometrieData() nicht ganz richtig verstanden hast, weil in der Anleitung steht, dass data[0] und data[1] einen Wert von minimal 0 (sehr dunkel) bis maximal 1023 (sehr hell) von der Odometriescheibe (die mit dem schwarz-weiß dreiecken im Kreis) rausschmeisst.
    Außerdem habe ich einen Fehler bei den Zählervariablen gemacht, weil, wenn sich die Räder drehen, werden die Zählervariablen um 1 erhöht, und wenn man den Roboter lange genug laufen lässt, könnten die Zählervariablen zu groß werden. D.h. dass die Zählervariablen bloß bis zu einem bestimmten Wert gehen dürfen. Dazu darf eigendlich die Zählervariable der Drehzahl des rechten Rades bloß z.B. bis 10 gehen und dann müssen beide Zählervariablen (des linken und des rechten Rades) wieder bei 0 anfangen. So könnte man jetzt immer weiter rumexperimentieren...
    Ich experimentier jetzt mal ein bisschen.
    MfG julien

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Jetzt red' ich als Blinder von der Farbe, da ich den Asuro nicht näher kenne:
    Die Odometrie scheinen zwei opt.Sensoren zu sein, deren Zustand dur abfragen kannst.
    Du brauchst aber nicht den Zustand, sondern den Wechsel (hell/dunkel)
    und immer bei einem Übergang zählst du.
    Damit der Zähler nicht überlaufen kann, isses besser, bei einem Rad addierst du, beim anderen subtrahierst du, dann bleibt dir nur die Differenz über. Und je nach Vorzeichen reagierst du.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.08.2004
    Ort
    Zwolle
    Alter
    68
    Beiträge
    531
    Hallo,

    da mit die 0-255 bin ich falsch, du hast recht, ist 0-1023.

    Ich hatte mich schon mit dieses synchronisierung beschaftigt (nicht gelungen) und hatte dazu folgendes gemessen:

    Bei speed = 0x70 fahrt Asuro 7 cm pro sekunde. (nachgemessen)
    Bei eine umdrehung vom Aussenrad fahrt Asuro 12,3cm weit.
    Dass sind 7/12,3 = 0,57 = ungefahr 0,5 Aussenrad umdrehungen pro Sekunde
    Dass Odometrierad dreht zich 5 mal schneller als dass Aussenrad.
    Es dreht sich 5 * 0,5 = 2,5 mal pro secunde.
    Mit 4 schwarz/weiss dreiecken macht dass 4 * 2,5 = 10 schwarz/weiss ubergange pro Sekunde.

    Ein einzigen while() Schleiffe daurt vielleicht nur 100us. Dass heist dass die while() Schleiffe 10.000 mal pro Sekunde oder 1.000 mal pro schwarz/weiss dreieck ausgefuhrt wird.

    So lange die lichtwert kleiner ist als 412 werden die variabelen 'a' und 'b' erhoht. Damit werden die variabelen doch mit eine 'geschwindigkeit' von 10.000 mahl pro Sekunde erhoht.

    Mann sollte sich doch die schwarz/weiss ubergange-pro-sekunde zahlen und nicht die Zeit zahlen wie lange ein reflectionswert unter zB 412 ist?

    Irgendwo fasse ich's nicht. (ist vielleicht mijn fehler... )

    Aber lass es sein, ich bin gespannt, wenn Du es fertig bringst mochte ich auch mal dein program ausprobieren.

    gruss

    Henk

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Es gibt mehrere Möglichkeiten, das Odometrische Zeugs auszuwerten. Eine davon ist eben, die Anzahl der Übergänge links mit denen von rechts zu vergleichen.
    Als Erstes machst du aus 0-1023 einen Nuller oder Einser
    if (data[0] > 412) Lnow = 1; else Lnow = 0;
    if (data[1] > 412) Rnow = 1; else Rnow = 0;
    Um einen Übergang zu erkennen, brauchst du den Werte von jetzt und den von vorher (Lold , Rold),vergleichst auf Wechsel und zählst
    if (Lnow ^ Lold) Count++; // links
    if (Rnow ^ Rold) Count--; // rechts
    Lold = Lnow; // merken
    Rold = Rnow; // merken
    // ---------------------------Vergleich:
    If (Count > 0) { rechts -zu- langsam }
    If (Count < 0) { rechts -zu- schnell }

    Anm: Im Beispiel wird sowohl hell / dunkel als auch dunkel /hell gezählt. geht auch anders, is aber mal egal.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    18.03.2005
    Ort
    Mecklenburg Vorpommern / Hamburg
    Alter
    35
    Beiträge
    80
    Joa, danke! Werd's gleich mal damit ausprobieren.

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    18.03.2005
    Ort
    Mecklenburg Vorpommern / Hamburg
    Alter
    35
    Beiträge
    80
    So sieht das jetzige Programm aus:
    Code:
    #include "asuro.h"
    int main(void){
    int Lnow;
    int Rnow;
    int Rold;
    int Lold;
    int Count;
    int sl;
    int sr;
    unsigned int data[2];
    unsigned char taste;
    	Init();
    	while(1){
    	Count=0;
    	sl=120;
    	sr=120;
    	MotorDir(FWD,FWD);
    	MotorSpeed(sr,sl);
    	OdometrieData(data);
    	if (data[0] > 412) Lnow = 1; else Lnow = 0;
        if (data[1] > 412) Rnow = 1; else Rnow = 0;
    	if (Lnow ^ Lold) Count++;
    	if (Rnow ^ Rold) Count--;
    	Lold=Lnow;
    	Rold=Rnow;
    	if (Count>0) {sr++; BackLED(OFF,ON);}
    	if (Count<0) {sr--; BackLED(ON,OFF);}
    	if (sr>254){sr=255; sl--;}
    	if (sr<61){sr=60; sl++;}
    	}
    	return 0;
    }
    So müsste es gehn. Wenn nicht, gebt hier eure Verbesserungsvorschläge.

  9. #9
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Hopperla, das Count = 0 , sl = 120 etc. muß VOR der Schleife sein.
    (Sonst ändert sich nie was )
    Grundsätzlich sollt es so gehen.
    Feinheiten kommen dann. Das Regelsystem darf sich nicht aufschaukeln können.
    Je kleiner die Differenz, desto kleiner sollte auch die Reaktion sein, und vice versa. Vielleicht sollte man eine Differenz vom +/-1 überhaupt tolerieren, weil taktsynchron wird das wohl nie.
    if (abs(Count) < 1)

    Und wenn du mit der Speed oben oder unten anstehst, mußt du wohl auch ein Wort mit dem anderen Motor wechseln, sonst bricht Verzweiflung aus.

    Let 'em Robbies roll !
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  10. #10
    Hallo,

    ich habe mir auch den Asuro zugelegt und wollte einen kleinen Tipp abgeben.
    Passt bitte auf mit Odometrie und BackLED.
    Schaut euch mal den Schaltplan auf Seite 74 an.
    Dort sieht man dass die Fototransistoren T11 und T12 gekoppelt sind mit den BackLED D15 und D16. So wie ich das verstehe ist entweder Odometrie oder BackLED.
    Beides gleichzeitig geht nicht. Wie ist eure Meinung?

    Gruss
    Robert

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen