- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Wie bestimmte Stecke zurücklegen, Encoder ?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    19.10.2006
    Beiträge
    23

    Wie bestimmte Stecke zurücklegen, Encoder ?

    Anzeige

    Praxistest und DIY Projekte
    Hallo, ich habe da einige Probleme bzw. Fragen an euch:

    Mit diesem Programm fährt auch mein Asuro wunderbar geradeaus

    #include "asuro.h"
    int main(void)
    {
    int diff;
    Init();
    while(1){
    StartSwitch();
    Encoder_Init();
    while (!switched) {
    MotorDir(RWD,RWD);
    MotorSpeed(130,130);
    diff = encoder[RIGHT]-encoder[LEFT];
    MotorSpeed(175+diff,175-diff);
    Msleep(100);

    }
    if(switched){BackLED(OFF,ON);
    StatusLED(YELLOW);}
    else if(!switched){BackLED(OFF,OFF);
    StatusLED(RED);}
    }
    return 0;
    }



    1.) Aber ich verstehe überhaupt nicht ,wie es funktioniert (diff= encoder[RIGHT]... ? ; ...175+diff; eigentlich versteh ich garnichts an diesem Programm) ! Könnte mir einer freundlicherweise das Fettgedruckte genau erklären? Hat etwas mit der neuen Asuro Lib zu tun, aber damit komme ich leider auch nicht klar.

    2.) Wieso gehen die BackLEDs nicht mehr aus, sobald der/die Taster losgelassen wurden ?

    else if(!switched){BackLED(OFF,OFF);
    StatusLED(RED);}

    3.) Am wichtigsten: Wie bekomme ich den Programm hin, mit dem ich den Asuro sagen kann, wie weit er fahren soll (in cm oder mm ...) ? Das habe ich hier schon einmal gefragt, aber kam mit den gegebenen Antworten nicht weiter.

    Achja bevor wieder gesagt wird: "Forumsuche verwenden..."
    -> Ich habe schon alle Beiträge gelesen...


    Wäre genial wenn ihr meine Fragen beantworten könntet !

  2. #2
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.064
    probier mal else {BACKLED(OFF,OFF)...
    also ohne zweites if...

    Wie das funktioniert?? eigentlich ganz einfach... ich such mal den thread raus wenn ich mal nen bissl mehr zeit hab...

    und was die wegstrecke angeht... da kannst du wirklich nur die suchfunktion benutzen. das problem wurde schon so oft diskutiert, da ist mit sicherheit ne lösung dabei.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    19.10.2006
    Beiträge
    23
    Hi,
    nur mit else geht es auch nicht, aber das ist nicht so wichtig...

    und was die wegstrecke angeht... da kannst du wirklich nur die suchfunktion benutzen. das problem wurde schon so oft diskutiert, da ist mit sicherheit ne lösung dabei.
    Also ich finde da leider nichts, es wurde vielleicht über das Ausgeben des zurückgelegten Weges gesprochen, jedoch nicht über eine Eingabe des gewünschen Weges in einer bestimmten Einheit

  4. #4
    Erfahrener Benutzer Begeisterter Techniker Avatar von Osser
    Registriert seit
    31.10.2006
    Ort
    Köln
    Alter
    54
    Beiträge
    396
    Code:
    #include "asuro.h"
    int main(void)
    {
      int diff;
      Init();
    
      // Nur einmal initilisieren vor der Hauptschleife...
      Encoder_Init();
    
      while(1){
    
        // Wie soll die LED aus gehen wenn sie nicht 
        // ausgeschaltet wird? 
        // switched muss auch restauriert werden auf 
        // den Urzustand.
        BackLED(OFF,OFF);
        StatusLED(RED);
        switched = 0;  
        StartSwitch();
    
        while (!switched) {
          MotorDir(RWD,RWD);
          MotorSpeed(130,130);
    
          // Die variable diff bildet die Differenz aus rechtem und 
          // linkem Encoder stand ab, d.h. also die (pseudo) 
          // differenz in der Wegstrecke. 
          // Durch addition/subtraktion dieser Differenz auf die 
          // PWM des jeweils anderen Rades wird dieser Fehler
          // im Zeitmittel ausgeglichen und dein ASURO fährt
          // geradeaus. Natürlich ist dass keine exakte
          // Herangehensweise, aber eine gute Näherung.
          // Klar?! :)
          diff = encoder[RIGHT]-encoder[LEFT];
          MotorSpeed(175+diff,175-diff);
          Msleep(100);
        }
    
    
        // ...sorry, aber dein else Zweig wird niemals 
        // ausgeführt... 
        // Dass If-Konstrukt ist somit überflüssig.
        /*if(switched){ */
          BackLED(OFF,ON);
          StatusLED(YELLOW);
        /*} else {
          BackLED(OFF,OFF);
          StatusLED(RED);}
        }*/
    
        Msleep(100); // sonst sieht man die LED nicht...
    
      }
    
      // Nie vergessen, reine Vorsichtsmassnahme..
      while(1){}  
      return 0;
    
    }
    O.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    19.10.2006
    Beiträge
    23
    Aha, danke schonmal !
    was genau macht denn die encoder Funktion , was ist z.B. hier enthalten encoder[RIGHT] ?

    meine dritee Frage kann keiner beantworten ?

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    01.11.2006
    Beiträge
    433
    hi Pitchriddik
    um eine bestimmte strecke zu fahren , musst du entweder die geschwindigkeit, oder die anzahl der "farbwechsel" bei der odometrie kennen. Zweitere ist leichter zu bestimmen
    welcher strecke ein farbwechsel entspricht hängt davon ab, was für eine auflösung die schwarzen und weisen felder auf der scheibe ahben. die strecke kann man dann wie folgt berechnen

    1Farbwechsel = Durchmesser * pi / Auflösung

    Soweit die theoretischen vorüberlegungen. Der rest ist dann eigentlichkein problem mehr. Ich schreib morgen vieleicht noch den passenden code.

    mfg EDH

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    01.11.2006
    Beiträge
    433
    wo ist eigentlich die deklaration/definition der geheimnissvollen encoder funktion
    bin ich nur blind oder gibts die gar nicht. (warum das programm dann aber trotzdem funktioniert ist eine andere frage)
    andere möglichkeit: ich hab ne zu alte asuro.h
    dann schick mir bitte die neure.

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    22.11.2005
    Ort
    Stralsund
    Beiträge
    93
    was genau macht denn die encoder Funktion , was ist z.B. hier enthalten encoder[RIGHT] ?
    Wenn du in die Header-Datei asuro.h schaust, siehst Du, dass encoder keine Funktion sondern ein array mit 2 Werten vom Typ integer ist.
    in encoder[0] steht der Odometriesensorwert für links und
    in encoder[1] der für Rechts.
    encoder[0] ist das gleiche wie encoder[LEFT] und
    encoder[1] ist das gleiche wie encoder[RIGHT].
    In der Headerdatei findest du nämlich auch die Zuweisungen, dass LEFT gleichbedeutend mit 0 und RIGHT mit 1 ist.

    Berichtigt mich, wenn ich mich irre,
    in der Interuptroutine signal (SIG_ADC) in der Datei asuro.c kann man lesen, dass dort mitgezählt wird, wie oft sich der Hell/Dunkelwechsel vollzieht. Die werte für linke und rechte Odometrie werden dann in besagtem array encoder[] gespeichert.
    viele Grüße
    Gast1234

    fressen und gefressen werden

  9. #9
    Erfahrener Benutzer Begeisterter Techniker Avatar von Osser
    Registriert seit
    31.10.2006
    Ort
    Köln
    Alter
    54
    Beiträge
    396
    Um den Abstand in [mm] eingeben zu können, kanst Du deine Sensorik ganz einfach normieren.

    1) Nimm ein Maßband von ca. einem Meter länge

    2) Schreib ein Proggi das genau n encoderschritte fährt ( siehe Beispiel )

    3) Setz Robbi an den Anfang des Massbandes und "Engage..."

    4) Miss den Abstand(Ln) den er zurückgelegt hat und normiere auf 1mm
    z.B. für n = 1000
    vex = Ln / n
    Ln = 80cm ==> vex = 800mm/1000 = 0.8mm ==> 8 Einheiten für 10mm in diesem Beispiel.

    6) Schreibe eine Routine die unter Beruecksichtigung von diesem Faktor die Werte mit der
    Einheit [mm] multipliziert.

    Das wars...


    Code:
    /* Normierungstest für Einheitsvektor Längenbestimmung 
       ohne Ausgleich der Gangunterschiede der angeschlossenen
       GS-Motoren.
    */
    #include "asuro.h"
    int main(void)
    {
      int diff;
      Init();
    
      Encoder_Init();
      MotorDir(FWD,FWD);
    
      MotorSpeed(170,170);
      while( encoder[RIGHT] < 900 ) {}
    
      MotorSpeed(110,110);
      while( encoder[RIGHT] < 1000 ) {}
    
      MotorDir(BREAK,BREAK);
      
    
      while(1){} 
      return 0;
    
    }

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    19.10.2006
    Beiträge
    23
    Sorry, aber ich bin anscheinend zu dumm dafür. Auch die Go Funktion funktiniert nicht (fährt entweder nur einen Tick oder unendlich).

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