- LiFePO4 Speicher Test         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 22

Thema: Kalibrierung der Motoren

  1. #11
    Neuer Benutzer Öfters hier Avatar von Werner++
    Registriert seit
    05.05.2007
    Ort
    Freising
    Beiträge
    8
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Zitat Zitat von BeeWee
    Wenn ich das ausführe, fährt er erst 5 Sekunden im Kreis, danach aber relativ gerade. Hat jemand eine Ahnung, wie das geht?
    Hallo BeeWee,

    nein, da habe ich auch keine Idee. Aber um nochmal auf Dein ursprüngliches Programm zurückzukommen. Mit der Funktion CalibrateWheels stellst Du das Verhältnis der Geschwindigkeiten von rechtem zu linken Rad fest. Warum sollte der Asuro gerade aus fahren, wenn man den linken Wert bei Motorspeed damit multipliziert?
    Da der Nullpunkt der Geschwindigkeit nicht bei 0 liegt, sondern bei einem Wert für MotorSpeed ca. um die 100 oder mehr, so kann das gewählte Verfahren im Grunde nie zu einer Geradeausfahrt führen.

    Gruß
    Werner

  2. #12
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Oh, oh,
    wer hat denn da all die schönen warnings vom Compiler übersehen?

    Ich habe den Code nun auch mal übersetzt und die warnings gesehen.
    Das übersetzen vom Programm, mit der Abc()-Funktion, liefert einen Output mit:
    "test.c:9: warning: implicit declaration of function `Abc'"

    Was macht der Compiler da den raus?
    Oh, schade, das wird ein int-Typ. Danach ist alles irgendwie falsch.

    So geht es nun:
    (Im ersten Programm fehlt auch noch ein "#include <string.h>", und dan sind da immer noch warnings)"
    Code:
    #include "asuro.h"
    
    /*  DAS HIER IST WICHTIG */
    float Abc(void);
    void TimeSleep (unsigned int time);
    
    int main (void)
    {
       float wheel_factor;
    
       Init ();
       
       wheel_factor = Abc ();
    
       MotorSpeed (255, 255 * wheel_factor);
       TimeSleep (2000);
    
       MotorSpeed (255, 255 * 1.00);
       TimeSleep (2000);
    
       MotorSpeed (0, 0);
    
       while (1);
       return 0;
    }
    
    float Abc(void)
    {
       return 1.00;
    }
    
    void TimeSleep (unsigned int time)
    {
       // Sleep for ``time`` miliseconds
       unsigned int i;
    
       for (i = 0; i < time; i++)
          Sleep(72);
    }
    Lieber Asuro programieren als arbeiten gehen.

  3. #13
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Man seid ihr schnell. Ein Lösungsversuch ohne float:

    Code:
    int8_t CalibrateWheels(int8_t power_right) {
    ....
    
    return power_right * count_left / count_right ;
    }
    @Werner++
    Mit der Funktion CalibrateWheels stellst Du das Verhältnis der Geschwindigkeiten von rechtem zu linken Rad fest.
    Es werden die Impulse innerhalb einer bestimmten Zeit gemessen. Daraus könnte man dann schon die Geschwindigkeit berechen, aber das braucht man nicht. Das wird auch sehr ungenau, weil der Hochlauf der Motoren noch nicht berücksichtigt ist. Auch andere Faktoren wie mechanische Ungenauigkeiten der Räder, der Untergrund und die Traktion spielen hier noch rein. Vereinfacht kann man aber sagen: Gleiche Impulszahl auf beiden Seiten bedeutet geradeaus.
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #14
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Und dann hier auch noch die Lösung für den letzten warning aus dem eigendlichen Programm:

    void Write (char *msg); // Die Variable msg bitte mit * als Pointer uebergeben.

    Und nun, alle zusammen: Juchu

    @radbruch
    Pfiffige Lösung zum umgehen des Problems!
    Lieber Asuro programieren als arbeiten gehen.

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    68
    Beiträge
    698
    Ihr seid ja richtig fix bei der Hitze.
    Ich habe in der Zwischenzeit doch noch mit float herum gespielt, zum Geradeausfahren reicht das leider noch nicht, mal dreht er nach links, mal nach rechts ab.
    Code:
    #include "asuro.h"
    #include <string.h> //strlen
    
    void TimeSleep(unsigned int time) 
    {
            unsigned int i;
            for (i = 0; i < time; ++i) 
                Sleep(72);
    } 
    
    void Write(char * msg) 
    {
            SerWrite( msg, strlen(msg));
    }
    
    unsigned int is_bright(unsigned int darkness) 
    {
        if (darkness > 512) 
            return 0;
    	else 
            return 1;
    }
    
    float CalibrateWheels(void) 
    {
        Write("Start calibration");
        
        unsigned int i;        // counter
        unsigned int data[2];  // odometry data
    
        // rotation count of the wheels
        unsigned int count_left  = 0;
        unsigned int count_right = 0;
    
        // contains the last brightness state for the wheels
        unsigned int last_state[2];
        OdometrieData(data);
        last_state[0] = is_bright(data[0]);
        last_state[1] = is_bright(data[1]);
    
         // the relation between the left amd the right wheel's rotation count
         float relation;
    
         // start driving
         MotorDir(FWD, FWD);
         MotorSpeed(120, 120);
         TimeSleep(500); //Zum Hochfahren
    
         // 5 seconds
         for (i = 0; i < 100; ++i) 
         {
            OdometrieData(data);
    
            // if a wheel's brightness changed, increase the counter
            if (is_bright(data[0]) != last_state[0]) 
    	    count_left++;
            if (is_bright(data[1]) != last_state[1]) 
                count_right++;
    
            last_state[0] = is_bright(data[0]);
        	last_state[1] = is_bright(data[1]);
    
            TimeSleep(50);
        }
    
        relation = (float) count_right / (float) count_left;
    
        // done testing, stop wheels
        MotorSpeed(0, 0);
    
        Write("Finished calibration");
        return relation;
    }
    
    int main(void)
    {
            Init();
    
            MotorSpeed(120, 120.0f * CalibrateWheels());
    
            while(1);
            return 0;
    }
    Hat jemand einen Tipp dazu aus euren bisherigen Überlegungen?

  6. #16
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Im Moment fällt mir nur folgendes ein:

    Drum prüfe, was der Linker bindet, ob sich nicht noch ein warning findet.

    Und auch von mir ein Willkommen an BeeWee und Werner++
    Tut mit leid, hatte ich in der Hitze des Tages und der Fehlersuche übersehen, dass es euch neu in's Roboternetz gebracht hat.
    Lieber Asuro programieren als arbeiten gehen.

  7. #17
    Benutzer Stammmitglied
    Registriert seit
    17.06.2007
    Ort
    Geretsried
    Alter
    34
    Beiträge
    43
    hi ehenks,

    und von mir ebenfalls ein Willkommen an BeeWee und Werner++

    ich habe noch nicht allzuviel ahnung,
    aber ich würde mir mal am ende der calibration count_left und count_right ausgeben lassen, weil ich einfach mal spekulieren würde dass die nicht sonderlich hoch sind...vielleicht täusch ich mich auch...

    gruß tobi

  8. #18
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    68
    Beiträge
    698
    Der ASURO fährt während der Kalibrierung besser gerade aus als danach. Laughing

    Drum prüfe, was der Linker bindet, ob sich nicht noch ein warning findet.
    Süßer Spruch! Den kannte ich noch gar nicht.

  9. #19
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    Sagt mal fahren euro asuros echt erst so spät los? meiner fährt bei (70,70) schon (solage es nicht bergauf geht =)
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  10. #20
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    @damaltor
    Bei 70? Wahnsinn!!! Fährst du mit Batterien? Alles geölt? Oder normaler Asuro?

    @ehenkes
    Hatte ich im Überschwang des Glück's gestern mal so erfunden. Meine Mutter hatte in meiner Sturm- und Drangzeit immer etwas Ähnliches auf den Lippen. Allerdings hatte sie keine Linker im Sinn. Und ich auch nicht
    Lieber Asuro programieren als arbeiten gehen.

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress