- LiTime Speicher und Akkus         
Seite 1 von 8 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 78

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

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

    minIMU-9 v2, software, kalibrierung...

    Anzeige

    Praxistest und DIY Projekte
    @Dirk:

    habe jetzt wieder ein neues thema aufgemacht, finde ich übersichtlicher...

    hier wird z.b. die kalibreierung der minIMU beschrieben:
    Code:
    Gyrosensor: 
    
    • Wenn der RP6 ruhig auf einer ebenen Fläche steht und nicht bewegt wird, sollten die Werte der X-, Y- und Z-Achse um den Nullpunkt schwanken. Tatsächlich wird es Abweichungen zum Nullwert geben. Zur Kompensierung der Null-Abweichung kann man die Definitionen OFFSET_X, OFFSET_Y und OFFSET_Z verwenden, um die Achsen zu "nullen". Zeigt die X-Achse in Ruhe z.B. 756 an, trägt man für OFFSET_X -756 ein.
    die werte die ich in der ersten anzeige am LCD (demo_5) messe sind a) wesentlich kleiner als z.b. -759 und b) sie streuen sehr:

    X: -66/ -68/ -58/ -83/ -66
    Y: -8/ 1/ -23/ -8/ -20
    Z: -56/ -26/ -76/ -57/ -64

    die 5 werte sind jeweils beim neustart der demo_5 entstanden, der RP6 wurde nicht bewegt und störeinflüsse kann man ausschileßen (weit weg vom pc und sonstigen störquellen)

    fragen:

    1) ist die streuung so ok?
    2) welchen wert soll ich in die OFFSET's eintragen? durchschnitt?
    3) die erste LCD anzeige ist noch recht gut interpretierbar. Gibt es irgendwo eine erklärung was in den beiden folgenden LCD anzeigen für werte ausgegeben werden?
    gruß inka

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

    Zu 1:
    Das dürften die kalibrierten Werte sein. Siehe 2!


    Zu 2:
    Wichtig ist, dass du dir die ROHWERTE, die der Sensor direkt ausgibt, ansiehst. Für den Gyro wären das also die Werte, die die Funktion readL3GD20() ausgibt. Wenn die Werte erst durch die Normalisierungsfunktion normalizeL3GD20() gejagt sind, kannst du sie für die Kalibrierung nicht mehr verwenden, weil die Normalisierungsfunktion ja genau die von dir angegebenen Kalibrierungswerte nutzt, um die Rohwerte anzupassen.
    Siehe auch den Hinweis im RN-Wissen-Artikel:
    HINWEISE ZUR KALIBRIERUNG:
    * Das Demo-Programm ist nicht sehr gut geeignet, um die Kalibrierungen durchzuführen.
    * Man sollte mit einem eigenen kurzen Programm die Rohwerte der jeweiligen X-, Y- und Z-Achse z.B. zweimal pro Sekunde ausgeben.
    * Es müssen die Rohwerte angezeigt werden, BEVOR sie durch die Funktionen normalizeHDMM01(), normalizeL3GD20(), normalizeLSM303DLHC_A() oder normalizeLSM303DLHC_M() verändert werden,- also direkt nach dem Lesen der Rohwerte aus dem Sensor.
    Das heißt:
    Die Demo ist ungeeignet, um die Kalibrierung durchzuführen, sondern sie dient dazu, nach der Kalibrierung die "fertigen", d.h. kalibrierten Werte anzuzeigen.
    Du müßtest dir also als erstes ein "Kalibrierungsprogramm" schreiben, das die Rohwerte anzeigt. Du kannst die Demo dazu so abwandeln, dass die normalizeL3GD20() Funktion auskommentiert wird.
    Die X-/Y-/Z-Achsen Rohwerte läßt du dann wie beschrieben ausgeben. Liegen die z.B. in Nullstellung des RP6 zwischen -120 und -40, dann müßtest du als Offset 80 eintragen (-(-40 - -120)). Wenn du dann als Kontrolle wieder die unveränderte Demo 05 laufen läßt, müßten die Werte dann zwischen -40 und +40 schwanken, also genau um den Nullpunkt.


    Zu 3:
    Die MinIMU hat ja 3 Sensoren. In der Control M32 Demo gibt es also drei LCD-Anzeigen für jeden der 3 Sensoren:

    1. Gyro:
    Zeile 1 -> X-Achse Y-Achse
    Zeile 2 -> Z-Achse Temperatur*

    Zu *) Falls GET_TEMP definiert ist, sonst leer!


    2. Beschleunigungssensor:
    Zeile 1 -> X-Achse Y-Achse Z-Achse
    Zeile 2 -> Pitch Roll


    3. Kompasssensor:
    Zeile 1 -> X-Achse Y-Achse Z-Achse*
    Zeile 2 -> Heading TC-Heading**

    Zu *) ODER Temperatur, wenn GET_TEMP_M definiert ist!
    Zu **) Tilt kompensiertes Heading!
    Gruß
    Dirk

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

    ich muss noch einmal zu diesem thema zurück:


    Dirk: Geschafft:
    Alle drei Libs (RP6ControlServoLib, RP6Control_LFSBumperLib und RP6Control_MultiIOLib) nacheinander mit eingebunden, allerdings ohne eine Funktion daraus aktiv zu nutzen.
    Ergebnis: Demo 05 läuft.
    Also:
    Keine Ahnung, was da gelaufen ist.

    inka:

    bei mir läuft die demo_05 nur wenn ich die "RP6Control_MultiIOLib.c" NICHT in den projektsettings verwende. Die anderen beiden (RP6ControlServoLib, RP6Control_LFSBumperLib) sind eingebunden, es werden aber keine funktionen daraus verwendet...
    ich versuche jetzt die demo_5 so anzupassen, dass ich die rohwerte bekomme. damit ich flexibel bin, wollte ich die möglichkeit der 4 taster auf der I/O nutzen, das sieht so aus:

    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);
    }
    /*********************calculateDir*********************************************/
    
    /**
     * 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]);
    }
    
    
    
    /*************** 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
    
    showScreenLCD(" RP6Control M32", " min_IMU");
    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);
    
        startStopwatch1();
    
        // IMPORTANT:
        orientation_init();                            // Orientation init!
    
        while(true)
        {
            if(getStopwatch1() > 1000) // 15s
            {
    #ifdef IMU_9D
                // 9D-IMU test:
                //  L3GD20 gyroscope:
                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(10000);
                //  LSM303DLHC accelerometer:
                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(10000);
                //  LSM303DLHC magnetometer:
                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(" ");
                task_I2CTWI();
    #endif
                setStopwatch1(0);
            }
    
            task_I2CTWI();
        }
    
        break;
    
        case 2://
        setLEDs(0b0010);
    
        break;
        case 3://
        setLEDs(0b0100);
    
        break;
        case 4://
        setLEDs(0b1000);
    
        break;
    
        }
        }
    
    
    }
    
    
        return 0;
    }
    weil ich jetzt die abfrage der taster nutze, muss ich die "RP6Control_MultiIOLib.c" in code:blocks einbinden, das bedeutet das programm stürzt wieder nach der (diesmal der zweiten) anzeige der werte ab. Es wird also noch roll und pitch angezeigt und dann ist schluss...
    gruß inka

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Ich habe dein Programm mal als Projekt in WinAVR/PN aufgesetzt,- mit allen Libs, die du auch eingebunden hast.
    Wie erwartet kompiliert das ohne Fehler.
    Da ich nicht ständig die M256 gegen die M32 tauschen will, teste ich das Ganze wohl erst irgendwann an diesem Wochenende.
    Mal sehen ...
    Gruß
    Dirk

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    Du könntest mir aber die hexdatei schicken? vielleicht liegt es ja wirklich an der konfiguration von code:blocks und nicht an deiner lib?
    gruß inka

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

    also die hexdatei, die du mir geschickt hast, die hat funktioniert, Die selbst kompilierte immer noch nicht...

    Den "schalter" bei code:blocks zum löschen aller hilfsdateien fürs kompilieren habe ich nur indirekt gefunden: "erstellen" und "neu erstellen", wobei das neu erstellen die objekt- datein löscht. Auch das manuelle löschen dieser dateien brachte keine abhilfe - die darstellung der LCD-seiten bricht nach der zweiten seite ab...

    schade, aber ich weiss echt nicht weiter...
    gruß inka

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Ich auch nicht.
    Frage: Werden durch "neu erstellen" auch die Hilfsdateien für ALLE Libs gelöscht?
    Immerhin bindest du ja 7 Libs ein. Du müßtest also im Programmverzeichnis (3 Libs), aber auch in den Ordnern RP6common (2 Libs) und RP6control (2 Libs) die zu den Libs gehörigen .st und .o Dateien vor dem Neukompilieren löschen. Im Programmverzeichnis würde ich auch noch den Hilfsordner .dep löschen oder die .d Dateien da drin.
    Gruß
    Dirk

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    also bei mir werden in diesem fall 7 *.o dateien erstellt (in einem verzeichnis), keine *.st, ordner .dep gibt es bei code:blocks - zumindest in der einsehbaren, für die programmierung verwendeten - stuktur nicht...

    ich werde also die imu mal auf die seite legen und mich wieder mit den Servos und normaler programmierung beschäftigen...

    danke noch einmal Dirk...
    gruß inka

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    @Dirk:

    eigentlich mehr oder weniger zufällig folgendes entdeckt:

    - der code stürzt bei NICHT auskommentierter zeile 196 (// normalizeLSM303DLHC_M(); // Normalize data) - im codebereich magnetometer - reproduzierbar nach der zweiten LCD-anzeige ab

    - ist die zeile auskommentiert, laufen alle drei LCD-anzeigen nacheinander durch

    - die drei dateien, um die es hier zum schluss ging (RP6ControlServoLib, RP6Control_LFSBumperLib und RP6Control_MultiIOLib) sind included

    Code:
    #include "RP6ControlLib.h"
    #include "RP6I2CmasterTWI.h"
    #include "RP6Control_MultiIOLib.h"
    #include "RP6Control_I2CMasterLib.h"
    #include "RP6Control_OrientationLib.h"
    #include "RP6ControlServoLib.h"
    #include "RP6Control_LFSBumperLib.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);
    }
    /*********************calculateDir*********************************************/
    
    /**
     * 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]);
    }
    
    
    
    /*************** 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
    
    showScreenLCD(" RP6Control M32", " min_IMU");
    mSleep(2500);
    clearLCD();
    
    
    
    while(true)
    {
        setLEDs(0b0001);
    
        startStopwatch1();
    
        // IMPORTANT:
        orientation_init();                            // Orientation init!
    
        while(true)
        {
            if(getStopwatch1() > 1000) // 1,5s
            {
    #ifdef IMU_9D
                // 9D-IMU test:
    
                //  L3GD20 gyroscope:
                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();
    
                //  LSM303DLHC accelerometer:
                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);
    
                //  LSM303DLHC magnetometer:
                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();
    #endif
                setStopwatch1(0);
            }
    
            task_I2CTWI();
        }
    
    
    
    }
    
    
        return 0;
    }
    ich weiss jetzt natürlich nicht was die werte, die da angezeigt werden, nun bedeuten, ob sie richtig sind...
    gruß inka

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Ok, am Wochenende baue ich wieder um ...
    Gruß
    Dirk

Seite 1 von 8 123 ... 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, 19:44
  2. CMPS03 kalibrierung
    Von rideyourstyle im Forum Sensoren / Sensorik
    Antworten: 10
    Letzter Beitrag: 03.03.2009, 18:01
  3. Kalibrierung
    Von seppo1903 im Forum Sensoren / Sensorik
    Antworten: 7
    Letzter Beitrag: 26.10.2007, 09:26
  4. Kalibrierung der Motoren
    Von BeeWee im Forum Asuro
    Antworten: 21
    Letzter Beitrag: 17.07.2007, 00:53
  5. Notebook Akku Kalibrierung
    Von Lars. im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 1
    Letzter Beitrag: 08.03.2007, 23:04

Berechtigungen

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

LiFePO4 Speicher Test