- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 8 ErsteErste 1234 ... LetzteLetzte
Ergebnis 11 bis 20 von 78

Thema: minIMU-9 v2, software, kalibrierung...

  1. #11
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Du musst aber nicht - Du kannst mir auch die hex schicken und ich teste...
    gruß inka

  2. #12
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi inka,

    HEX ist auf dem Weg zu dir!
    Gruß
    Dirk

  3. #13
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    hi Dirk,

    sie funktioniert, es ist nun die frage ob die, die ich selbst kompiliere es auch tut?
    gruß inka

  4. #14
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi inka,

    ja, das probier mal mit den Kalibrierungs-Werten, die ich geschickt hatte.
    Wenn das nicht klappt:
    Stell eine zip zusammen mit allen Dateien, die du fehlerfrei kompiliert hast und die dann aber NICHT läuft.
    Ich kompiliere sie dann bei mir und schicke sie dir, wenn sie funktioniert, als HEX zum Testen.
    Gruß
    Dirk

  5. #15
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    hi Dirk,

    in einer mail die zip datei an Dich:

    - libs (c + h) die in der "min_IMU_RP6Control_MultiIO_05.c" included sind
    - mein komplettes libverzeichnis, sollte ich was vergessen haben
    - c + hex datei - funktioniert
    - c + hex datei - funktioniert nicht

    funktioniert, bzw. funktioniert nicht - unterscheiden sich NUR in der auskommentierter zeile 196 in der "min_IMU_RP6Control_MultiIO_05.c"

    kompilieren lassen sich beide versionen fehlerfrei...

    Deine daten in der RP6Control_orientation.h habe ich vor dem kompilieren eingefügt...
    gruß inka

  6. #16
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    Hi Dirk,

    ich habe den code ähnlich der struktur des base-selftest umstrukturiert:

    Code:
    #include "RP6ControlLib.h"
    #include "RP6I2CmasterTWI.h"
    #include "RP6Control_MultiIOLib.h"
    #include "RP6Control_I2CMasterLib.h"
    #include "RP6Control_OrientationLib.h"
    //#include "RP6ControlServoLib.h"
    
    #define I2C_RP6_BASE_ADR 10
    
    /************************variables*****************************************/
    
    uint8_t ch;
    char item[12];
    char dir[3];
    
    
    
    /*********************I2C-fehlermeldungen******************/
    
    void I2C_transmissionError(uint8_t errorState) //gibt I2C fehlermeldungen über LCD aus
    {
        clearLCD();
        writeStringLCD_P("I2C ERROR -->");
        setCursorPosLCD(1, 0);        // line 2
        writeStringLCD_P("TWI STATE: 0x");
        writeIntegerLCD(errorState, HEX);
    }
    
    /**
     * Returns a 2 character string for the eighth
     * parts of the direction calculated from the
     * heading value.
     *
     * Input: heading -> Heading value [0..359]
     *
     */
    void calculateDir(char *dir, uint16_t heading)
    {
        dir[1] = ' ';
        dir[2] = '\0';
        if ((heading <= 22) || (heading >=338)) dir[0] = 'N';
        if ((heading >= 23) && (heading <= 67)) {dir[0] = 'N'; dir[1] = 'E';}
        if ((heading >= 68) && (heading <= 112)) dir[0] = 'E';
        if ((heading >= 113) && (heading <= 157)) {dir[0] = 'S'; dir[1] = 'E';}
        if ((heading >= 158) && (heading <= 202)) dir[0] = 'S';
        if ((heading >= 203) && (heading <= 247)) {dir[0] = 'S'; dir[1] = 'W';}
        if ((heading >= 248) && (heading <= 292)) dir[0] = 'W';
        if ((heading >= 293) && (heading <= 337)) {dir[0] = 'N'; dir[1] = 'W';}
    }
    
    /************************Write a floating point number to the LCD.******/
     /*
     * Example:
     *
     *            // Write a floating point number to the LCD (no exponent):
     *            writeDoubleLCD(1234567.890, 11, 3);
     *
     * The value of prec (precision) defines the number of decimal places.
     * For 32 bit floating point variables (float, double ...) 6 is
     * the max. value for prec (7 relevant digits).
     * The value of width defines the overall number of characters in the
     * floating point number including the decimal point. The number of
     * pre-decimal positions is: (width - prec - 1).
     */
    void writeDoubleLCD(double number, uint8_t width, uint8_t prec)
    {char buffer[width + 1];
        dtostrf(number, width, prec, &buffer[0]);
        writeStringLCD(&buffer[0]);
    }
    
    
    void writeDouble(double number, uint8_t width, uint8_t prec)
    {char buffer[width + 1];
        dtostrf(number, width, prec, &buffer[0]);
        writeString(&buffer[0]);
    }
    
    /*****************gyroscope***************/
    void gyroscope(void) //  L3GD20 gyroscope
        {
        orientation_init();
        task_I2CTWI();
        readL3GD20();                        // Get sensor values
    //    normalizeL3GD20();
        task_I2CTWI();
        setCursorPosLCD(0, 0);        // line 1
        writeStringLCD_P("X");
        writeIntegerLCD(x_axisg, DEC);
        writeStringLCD_P("   ");
        setCursorPosLCD(0, 8);        // line 1 pos 9
        writeStringLCD_P("Y");
        writeIntegerLCD(y_axisg, DEC);
        writeStringLCD_P("   ");
        setCursorPosLCD(1, 0);        // line 2
        writeStringLCD_P("Z");
        writeIntegerLCD(z_axisg, DEC);
        writeStringLCD_P("    ");
    #ifdef GET_TEMP
        temperatureg = calcTempL3GD20(temperatureg) + 5;
        temperatureg += OFFSET_TEMP;
        setCursorPosLCD(1, 8);        // line 2 pos 9
        writeStringLCD_P("T");
        writeIntegerLCD(temperatureg, DEC);
        writeStringLCD_P("    ");
    #endif
        task_I2CTWI();
        mSleep(3000);//4,5 sec
        clearLCD();
        }
    
    /************accelerometer****************/
       void accelerometer(void) //  LSM303DLHC accelerometer
        {
        orientation_init();
        clearLCD();
        task_I2CTWI();
        readLSM303DLHC_A();                    // Get sensor values
        task_I2CTWI();
        setCursorPosLCD(0, 0);        // line 1
        writeStringLCD_P("X");
        writeIntegerLCD(x_axisa, DEC);
        writeStringLCD_P("   ");
        setCursorPosLCD(0, 5);        // line 1 pos 6
        writeStringLCD_P("Y");
        writeIntegerLCD(y_axisa, DEC);
        writeStringLCD_P("   ");
        setCursorPosLCD(0, 10);        // line 1 pos 11
        writeStringLCD_P("Z");
        writeIntegerLCD(z_axisa, DEC);
        writeStringLCD_P("    ");
        normalizeLSM303DLHC_A();            // Normalize data
        positionLSM303DLHC_A();                // Calculate position
        setCursorPosLCD(1, 0);        // line 2
        writeStringLCD_P("P");
        writeDoubleLCD(pitch, 6, 1);
        writeStringLCD_P(" ");
        setCursorPosLCD(1, 8);        // line 2 pos 9
        writeStringLCD_P("R");
        writeDoubleLCD(roll, 6, 1);
        writeStringLCD_P(" ");
        task_I2CTWI();
        mSleep(3000);
        }
    
    /*****************magnetometer************/
    void magnetometer(void) //  LSM303DLHC magnetometer
        {
        orientation_init();
        clearLCD();
        task_I2CTWI();
        readLSM303DLHC_M();                    // Get sensor values
        task_I2CTWI();
        setCursorPosLCD(0, 0);        // line 1
        writeStringLCD_P("X");
        writeIntegerLCD(x_axism, DEC);
        writeStringLCD_P("   ");
        setCursorPosLCD(0, 5);        // line 1 pos 6
        writeStringLCD_P("Y");
        writeIntegerLCD(y_axism, DEC);
        writeStringLCD_P("   ");
        setCursorPosLCD(0, 10);        // line 1 pos 11
    #ifndef GET_TEMP_M
        writeStringLCD_P("Z");
        writeIntegerLCD(z_axism, DEC);
        writeStringLCD_P("    ");
    #else
        temperature_imu = (double) temperaturem / 8.0 + OFFSET_TEMP_M;
        writeStringLCD_P("T");
        writeDoubleLCD(temperature_imu, 5, 1);
    #endif
    //    normalizeLSM303DLHC_M();            // Normalize data
        headingm = headingLSM303DLHC_M();    // Calculate heading
        calculateDir(dir, headingm);
        setCursorPosLCD(1, 0);        // line 2
        writeStringLCD_P("H");
        writeIntegerLengthLCD(headingm, DEC, 3);
        writeStringLCD_P(" ");
        writeStringLCD(dir);
        headingtc = headingLSM303DLHC_TC();    // Calculate TILT COMPENSATED
        calculateDir(dir, headingtc);        // heading
        writeStringLCD_P(" C");
        writeIntegerLengthLCD(headingtc, DEC, 3);
        writeStringLCD_P(" ");
        writeStringLCD(dir);
        writeStringLCD_P(" ");
        mSleep(3000);//4,5 sec
        clearLCD();
        task_I2CTWI();
        }
    
    
    
    /*************** hauptprogramm ***********/
    
    int main(void)
    {
    
    
    initRP6Control();
    multiio_init();
    initLCD();
    //orientation_init();
    
    setLEDs(0b1111);
    mSleep(500);
    setLEDs(0b0000);
    
    I2CTWI_initMaster(100);
    I2CTWI_setTransmissionErrorHandler(I2C_transmissionError); //aktiviert I2C fehlermeldungen
    
    // Voltage & current sensor test:
    LTC2990_measure();
    setCursorPosLCD(0, 0);
    //writeStringLCD("BAT Current: ");
    //writeDoubleLCD(cbat, 6, 1);
    writeStringLCD(" accu: ");
    writeDoubleLCD(vbat, 4, 1);
    writeStringLCD( " V");
    mSleep(1500);
    
    
    showScreenLCD(" RP6Control M32", " gyro_test_3");
    mSleep(2500);
    clearLCD();
    
    
    
    while(true)
    {
    
    /*****************anzeige gedrückter buttons****************/
        clearLCD();
        pressedMultiIOButtonNumber = getMultiIOPressedButtonNumber();
        setCursorPosLCD(0, 0);
        writeStringLCD("Button: ");
        writeIntegerLCD(pressedMultiIOButtonNumber, DEC);
        mSleep(500);
    
        uint8_t key = getMultiIOPressedButtonNumber();
    
    
    /********************funktion der buttons*********************/
        if(key)
        {
        switch(key)
        {
        case 1://
        setLEDs(0b0001);
        gyroscope();
        break;
    
        case 2://
        setLEDs(0b0010);
        accelerometer();
        break;
    
        case 3://
        setLEDs(0b0100);
        magnetometer();
        break;
    
        case 4://
        setLEDs(0b1000);
        gyroscope();
        accelerometer();
        magnetometer();
        break;
        }
        }
    }
        return 0;
    }
    folgendes fiel mir auf wofür ich noch nach einer erklärung suche:

    1) die anweisung "orientation_init();" stand ursprünglich am anfang der main(), als ich feststellte, dass beim case2 der pitch und rool mit jeweils einer null angezeigt wurden, versetzte ich diese in die jeweiligen unterprogramme (gyroscope, accelerometer und magnetometer) - jetzt werden die werte richtig angezeigt. War das die richtige massnahme?

    2) wenn ich den RP6 neu einschalte (nicht start mit dem startbutton, sondern S1) werden beim ersten druck des button 1 die gyrowerte 4stellig, also nicht normalisiert angezeigt. Beim zweiten druck auf button 1, kommen sie nur noch 2stellig. Womit wird das verursacht?
    gruß inka

  7. #17
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi inka,

    Demo und HEX sind auf dem Weg zu dir!
    Gruß
    Dirk

  8. #18
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    hi Dirk,

    danke für die files, beide von dir kompilierten hex funktionieren bei mir...

    das mit der anzeige der accuspannung habe ich auch geschafft...

    meine kompilierung der 05_05 funktioniert nach wie vor nicht, absturz an der bekannten stelle - normalize im magnetometerabschnitt...

    wenn ich den RP6 neu einschalte (nicht start mit dem startbutton, sondern S1) werden beim ersten druck des button 1 die gyrowerte 4stellig, also nicht normalisiert angezeigt. Beim zweiten druck auf button 1, kommen sie nur noch 2stellig. Womit wird das verursacht?
    was hälst du denn davon? das passiert auch bei deiner, von dir kompilierten, 05_04, bei der 05_05 nicht...

    frage: lassen sich die funktionierenden werte (also ohne den magnetometer) nicht - wie bei der HDMM - auch in gradzahlen und heading umrechnen?
    Geändert von inka (14.07.2013 um 16:32 Uhr)
    gruß inka

  9. #19
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi inka,

    1.:
    Die 05_04 ist nicht ok, weil multiio_init() [und orientation_init()] VOR dem Befehl I2CTWI_initMaster(100) stehen.
    Das geht nicht, weil die init-Funktionen den I2C-Bus brauchen,- also muss der I2C-Bus VOR den inits gestartet werden.
    Daher kannst du die 05_04 vergessen.

    2.:
    Dass du die 05_05 immer noch nicht selbst funktionsfähig kompilieren kannst (obwohl sie ja von mir kompiliert funktioniert!), verstehe ich weiterhin nicht. Was damit die Funktion normalizeLSM303DLHC_M() zu tun hat, weiß ich auch nicht.
    Du könntest aber versuchen, es herauszufinden:
    Im 1. Schritt kommentiere mal in der Funktion die Zeilen:
    x_axism += OFFSET_X_M;
    y_axism += OFFSET_Y_M;
    z_axism += OFFSET_Z_M;
    ... aus.
    Funktioniert die Demo bei dir neu kompiliert (und Hilfsdateien gelöscht!) damit?
    Im 2. Schritt ersetz mal die Zeilen:
    xm = (x_axism - MIN_X_M) / (MAX_X_M - MIN_X_M) * 2 - 1;
    ym = (y_axism - MIN_Y_M) / (MAX_Y_M - MIN_Y_M) * 2 - 1;
    zm = (z_axism - MIN_Z_M) / (MAX_Z_M - MIN_Z_M) * 2 - 1;
    ... durch:
    xm = (double) x_axism;
    ym = (double) y_axism;
    zm = (double) z_axism;
    Funktioniert die Demo bei dir neu kompiliert (und Hilfsdateien gelöscht!) damit?

    frage: lassen sich die funktionierenden werte (also ohne den magnetometer) nicht - wie bei der HDMM - auch in gradzahlen und heading umrechnen?
    Der HDMM01 ist ja auch ein Magnetometer!?? Für die Himmelsrichtung braucht man das ja auch,- bei der minIMU ist das dann der Magnetometer im LSM303DLHC. Man kommt also nicht ohne den aus, wenn man die Himmelsrichtung braucht. Oder was meinst du?
    Gruß
    Dirk

  10. #20
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    Zitat Zitat von Dirk Beitrag anzeigen
    Dass du die 05_05 immer noch nicht selbst funktionsfähig kompilieren kannst (obwohl sie ja von mir kompiliert funktioniert!), verstehe ich weiterhin nicht. Was damit die Funktion normalizeLSM303DLHC_M() zu tun hat, weiß ich auch nicht.
    Du könntest aber versuchen, es herauszufinden:
    Im 1. Schritt kommentiere mal in der Funktion die Zeilen:
    x_axism += OFFSET_X_M;
    y_axism += OFFSET_Y_M;
    z_axism += OFFSET_Z_M;
    ... aus.
    Funktioniert die Demo bei dir neu kompiliert (und Hilfsdateien gelöscht!) damit?
    nein, absturz in case3...

    Zitat Zitat von Dirk Beitrag anzeigen
    Im 2. Schritt ersetz mal die Zeilen:
    xm = (x_axism - MIN_X_M) / (MAX_X_M - MIN_X_M) * 2 - 1;
    ym = (y_axism - MIN_Y_M) / (MAX_Y_M - MIN_Y_M) * 2 - 1;
    zm = (z_axism - MIN_Z_M) / (MAX_Z_M - MIN_Z_M) * 2 - 1;
    ... durch:
    xm = (double) x_axism;
    ym = (double) y_axism;
    zm = (double) z_axism;
    Funktioniert die Demo bei dir neu kompiliert (und Hilfsdateien gelöscht!) damit?
    die im schritt 1 auskommentierten zeile blieben im schritt 2 auskommentiert, zusätzlich ersatz der anderen 3 zeilen, demo stürzt in case3 ab...Anschliessen habe ich die funktion in den originalzustand versetzt...

    Zitat Zitat von Dirk Beitrag anzeigen
    Der HDMM01 ist ja auch ein Magnetometer!?? Für die Himmelsrichtung braucht man das ja auch,- bei der minIMU ist das dann der Magnetometer im LSM303DLHC. Man kommt also nicht ohne den aus, wenn man die Himmelsrichtung braucht. Oder was meinst du?
    ich meine, wir versuchen hier den magnetometer zum laufen zu bekommen. Ich hatte früher ein wenig mit kreiseln zu tun. Mechanisch, mit ein paar spulen, schnell drehenden bürstenllosen motoren mit schwungmasse und etwas auswertungselektronik (transistoren!). Damals war noch kein rede von strap down, schon garnicht von elektronischen gyros auf 5mm² fläche...
    Was ich nicht begreife ist, weiso ich einen magnetometer brauche, wenn ich einen gyro und beschlenigungsmesser habe? Aber die erklärung würde hier vermutlich zu weit führen. testen wir also weiter...

    Ich kann verstehen, dass dir das langsam auf den keks geht, aber du bist etztendlich der einziger hier der mir da weiterhelfen kann...
    gruß inka

Seite 2 von 8 ErsteErste 1234 ... LetzteLetzte

Ähnliche Themen

  1. Arduino und Pololu MinIMU-9 v2
    Von MechMac im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 2
    Letzter Beitrag: 11.05.2013, 18:44
  2. CMPS03 kalibrierung
    Von rideyourstyle im Forum Sensoren / Sensorik
    Antworten: 10
    Letzter Beitrag: 03.03.2009, 17:01
  3. Kalibrierung
    Von seppo1903 im Forum Sensoren / Sensorik
    Antworten: 7
    Letzter Beitrag: 26.10.2007, 08:26
  4. Kalibrierung der Motoren
    Von BeeWee im Forum Asuro
    Antworten: 21
    Letzter Beitrag: 16.07.2007, 23:53
  5. Notebook Akku Kalibrierung
    Von Lars. im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 1
    Letzter Beitrag: 08.03.2007, 22:04

Berechtigungen

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

12V Akku bauen