- Akku Tests und Balkonkraftwerk Speicher         
Seite 4 von 6 ErsteErste ... 23456 LetzteLetzte
Ergebnis 31 bis 40 von 52

Thema: HDMM01 und die orientierungslib von Dirk

  1. #31
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Anzeige

    Praxistest und DIY Projekte
    @inka:
    1. Hat der HDMM01 denn vorher funktioniert?
    2. Wenn ja: Mit welchem Programm?
    3. Kannst du ein älteres Programm reintun und damit testen (wenns vorher damit geklappt hat)?
    4. Probier mal, noch irgendeinen anderen I2C-Sensor an denselben I2C-Bus zu hängen. Änderung?
    5. Mach das mit 5. und lies den anderen Sensor VOR dem HDMM01 über I2C aus (must nix anzeigen!). Läuft der HDMM01 jetzt bzw. zeigt Werte an?
    Gruß
    Dirk

  2. #32
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    1+2:

    ja, mit diesem programm:

    Code:
    #include "RP6ControlLib.h"
    #include "RP6I2CmasterTWI.h"
    #include "RP6Control_OrientationLib.h"
    //#include "RP6Control_I2CMasterLib.h"
    #include "RP6Control_MultiIOLib.h"
    #include "RP6Control_I2CMasterLib.h"
    //#include "RP6RobotBaseLib.h"
    //#include "inka.h"
    
    
    #define I2C_RP6_BASE_ADR 10
    
    uint8_t ch;
    char item[12];
    char dir[3];
    int32_t new_dir; //neue richtung
    int32_t old_dir; //gemessene richtung
    int32_t temp; //berechnung korrektur richtung
    int16_t dev, rot, i;//berechnung rotation
    char rdir;
    
    /***********************calculate_dir**********************/
    void calculateDir(char* dir, uint16_t heading) //setzt headingwerte grob in himmelsrichtungen um
    {
        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';}
    }
    
    /*********************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);
    }
    
    /*******************sensorwerte holen*************************/
    void sensorwerte_holen(void)
    {
        intreg2dm = readHDMM01();        // holt sersorwerte
        if  (!intreg2dm)                //daten gültig?
        {
            normalizeHDMM01();              // daten werden "normalisiert"
            heading2dm = headingHDMM01(); // berechnung der headingwerte
        }
    }
    
    /*******************berechnung der richtungswerte***********/
    void richtung_berechnen(void)
    {
       calculateDir(dir, heading2dm);  //berechnung der richtung (N,S,W,E)
    }
    
    /*************korrektur richtung*****************************/
    
    void korrekrur_richtung(void)
    // Wertebereich new_dir und old_dir: 0..359
    // Ergebnis in rot! Positiv: Rechtsdrehung, negativ: Linksdrehung!
    {
    dev = new_dir - old_dir;
    rot = dev;
    if (abs(dev) > 180)
    {
        {
        if (dev < 0)
            {
            rot = 360 + dev;
            }
        else
            {
            rot = -360 + dev;
            }
        }
    }
    }
    /*******************werte schreiben************************/
    
    void werte_schreiben(void)
    {
        setCursorPosLCD(0, 0);
        writeStringLCD_P("HEA ODR NDR  ROT");
        old_dir = heading2dm;
        setCursorPosLCD(1, 0);
        writeIntegerLengthLCD(heading2dm, DEC, 3);
        setCursorPosLCD(1, 4);
        writeIntegerLengthLCD(old_dir, DEC, 3);
        setCursorPosLCD(1, 8);
        writeIntegerLengthLCD(new_dir, DEC, 3);
        korrekrur_richtung();
           if (rot<0)
           {
           setCursorPosLCD(1, 12);
           writeStringLCD_P("-");
           }
           else
           {
           setCursorPosLCD(1, 12);
           writeStringLCD_P(" ");
           }
        setCursorPosLCD(1, 13);
        writeIntegerLengthLCD(abs(rot), DEC, 3);
    }
    
    /**********************test rdir**************************/
    void test_rdir(void)
    {
    if (rot < 0)
    rdir = LEFT;
    else rdir = RIGHT;
    }
    
    /**********************hauptprogramm*********************/
    
    int main(void)
    {
    
    
    initRP6Control();
    multiio_init();
    initLCD();
    orientation_init();
    COMPASS_2D_init();
    resetCoilHDMM01();
    
        setLEDs(0b1111);
        mSleep(500);
        setLEDs(0b0000);
    
    I2CTWI_initMaster(100);
    I2CTWI_setTransmissionErrorHandler(I2C_transmissionError); //aktiviert I2C fehlermeldungen
    
        showScreenLCD(" RP6Control M32", " gyro_quadrat");
        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://richtung NORD
    
                            setLEDs(0b0001);                //LED 1 leuchtet
                            COMPASS_2D_init();
                            while(true)
                             {
                                {
                                new_dir = 360;
                                sensorwerte_holen();
                                setCursorPosLCD(0, 0);
                                writeStringLCD_P("HEA ODR NDR  ROT");
                                old_dir = heading2dm;
                                setCursorPosLCD(1, 0);
                                writeIntegerLengthLCD(heading2dm, DEC, 3);
                                setCursorPosLCD(1, 4);
                                writeIntegerLengthLCD(old_dir, DEC, 3);
                                setCursorPosLCD(1, 8);
                                writeIntegerLengthLCD(new_dir, DEC, 3);
                                korrekrur_richtung();
                                test_rdir();
                                    if (rot<0)
                                    {
                                    setCursorPosLCD(1, 12);
                                    writeStringLCD_P("-");
                                    }
                                    else
                                    {
                                    setCursorPosLCD(1, 12);
                                    writeStringLCD_P(" ");
                                    }
                                setCursorPosLCD(1, 13);
                                writeIntegerLengthLCD(abs(rot), DEC, 3);
                                mSleep(1000);
    //                            rotate(60, rdir, ((abs(rot)/2)), 0);
                                mSleep(1000);
    
                                for (i= 0; i<3; i++);
                                {
                                sensorwerte_holen();
                                old_dir = heading2dm;
                                korrekrur_richtung();
                                test_rdir();
                                if (rot<0)
                                    {
                                    setCursorPosLCD(1, 12);
                                    writeStringLCD_P("-");
                                    }
                                    else
                                    {
                                    setCursorPosLCD(1, 12);
                                    writeStringLCD_P(" ");
                                    }
                                setCursorPosLCD(1, 13);
                                writeIntegerLengthLCD(abs(rot), DEC, 3);
                                mSleep(1000);
    //                            rotate(60, rdir, ((abs(rot)/2)), 0);
                                setCursorPosLCD(1, 13);
                                writeIntegerLengthLCD(abs(rot), DEC, 3);
                                mSleep(1000);
                                }
    //                            if (rot == 0) break;
    
                                uint8_t key = getMultiIOPressedButtonNumber();
                                if (key)
                                    {
                                    break;
                                    }
    
                                }
                             }
    
                    break;
                    case 2:// richtung OST
                        setLEDs(0b0010);
                        while(true)
                             {
                                {
                                new_dir = 270;
                                sensorwerte_holen();
                                setCursorPosLCD(0, 0);
                                writeStringLCD_P("HEA ODR NDR  ROT");
                                old_dir = heading2dm;
                                setCursorPosLCD(1, 0);
                                writeIntegerLengthLCD(heading2dm, DEC, 3);
                                setCursorPosLCD(1, 4);
                                writeIntegerLengthLCD(old_dir, DEC, 3);
                                setCursorPosLCD(1, 8);
                                writeIntegerLengthLCD(new_dir, DEC, 3);
                                korrekrur_richtung();
                                test_rdir();
                                    if (rot<0)
                                    {
                                    setCursorPosLCD(1, 12);
                                    writeStringLCD_P("-");
                                    }
                                    else
                                    {
                                    setCursorPosLCD(1, 12);
                                    writeStringLCD_P(" ");
                                    }
                                setCursorPosLCD(1, 13);
                                writeIntegerLengthLCD(abs(rot), DEC, 3);
                                mSleep(1000);
    //                            rotate(60, rdir, ((abs(rot)/2)), 0);
                                mSleep(1000);
    
                                for (i= 0; i<3; i++);
                                {
                                sensorwerte_holen();
                                old_dir = heading2dm;
                                korrekrur_richtung();
                                test_rdir();
                                    if (rot<0)
                                    {
                                    setCursorPosLCD(1, 12);
                                    writeStringLCD_P("-");
                                    }
                                    else
                                    {
                                    setCursorPosLCD(1, 12);
                                    writeStringLCD_P(" ");
                                    }
                                setCursorPosLCD(1, 13);
                                writeIntegerLengthLCD(abs(rot), DEC, 3);
                                mSleep(1000);
    //                            rotate(60, rdir, ((abs(rot)/2)), 0);
                                setCursorPosLCD(1, 13);
                                writeIntegerLengthLCD(abs(rot), DEC, 3);
                                mSleep(1000);
                                }
    //                            if (rot == 0) break;
    
                                uint8_t key = getMultiIOPressedButtonNumber();
                                if (key)
                                    {
                                    break;
                                    }
    
                                }
                             }
    
                    break;                case 3:// richtung SÜD
                        setLEDs(0b0100);
    
                    break;
                    case 4:// richtung WEST
                        setLEDs(0b1000);
    
                    break;
    
                }
            }
    
    
        }
    
    
        return 0;
    }
    3: mit dem code von oben funktioniert der kompass nicht mehr, beim betätigen von button 1 wird angezeicht:
    HEA ODR NDR ROT / zeile2: 269 269 360 091

    bei button2: 269 269 270 001

    4: habe ich leider nicht (einen anderen I2C sensor)...
    gruß inka

  3. #33
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Ok, ich würde die Verbindung zum HDMM01 prüfen (Spannung ok?, SDA/SCL verbunden?). Wenn da auch alles ok ist, weiß ich nicht weiter ...
    Gruß
    Dirk

  4. #34
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    @Dirk: 5V und masse liegen an der HDMM01 platine an, auch SDA/SCL scheint verbunden (zwischen stiften der I/O platien un d der HDMM01), würde auf einen defekt an der HDMM01 deuten, oder? Gibt es sonst noch möglichkeiten die kompassplatine zu testen?

    @fabqu: gibt es auf die HDMM01 garantie? Es wurde ja schon gelötet...

    - - - Aktualisiert - - -

    Zitat Zitat von Dirk Beitrag anzeigen
    @inka:
    5. Mach das mit 5. und lies den anderen Sensor VOR dem HDMM01 über I2C aus (must nix anzeigen!). Läuft der HDMM01 jetzt bzw. zeigt Werte an?
    - was bedeutet "Mach das mit 5."?

    - ich hätte noch einen SRF02, der wird doch auch über I2C ausgelesen? Wie müsste ich den anschließen? Muss ich da auch softwaremäßig was tun, oder ging es bei dem versuch nur darum den "blockierten(?)" I2C wieder zu aktivieren?
    gruß inka

  5. #35
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    @inka:
    - was bedeutet "Mach das mit 5."?
    Oh, ich meinte "Mach das mit 4.", also das Anschließen eines weiteren I2C-Slaves.
    Der Grund ist: Ich konnte bei meinen Tests auch den HDMM01 einmal nicht mehr auslesen, als er allein am I2C-Bus hing. Ich wollte nur sichergehen (bevor du dir einen neuen kaufst), dass das bei dir nicht der Fall ist. Wenn du den SRF02 hast, häng ihn doch einfach an den I2C-Bus und lies in derselben Schleife wie den HDMM01 z.B. auch die Firmware-Version aus (SRF02_getFirmware).
    Wenn das nicht klappt: Vielleicht ist der HDMM01 kaputt.
    Gruß
    Dirk

  6. #36
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    @Dirk,
    der SRF 2 ist angeschlossen an dem 4er block, direkt an der beschriftung, dann habe ich in der schleife "SRF02_getFirmware(CH_SRF02_1);" und auch die zeile "#include "RP6Control_LFSBumperLib.h" hinzugefügt. Beim starten des programms leuchtet/blinkt die rode LED am SRF, die anzeige am LCD ändert sich nicht...

    habe bereits einen neuen HDMM01 bestellt...
    gruß inka

  7. #37
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Hi Inka,
    ich denke mal, wenn mans verlötet hat, verfällt die Garantie. Aber teste doch mal, ob Kontakte alle richtig sind, also ob vielleicht beim Löten was schief ging.

  8. #38
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    @fabqu: dachte ich mir, mit der garantie...

    @Dirk:

    den neuen HDMM01 habe ich vor zwei tagen bereits bestellt gehabt, heute kam er...

    aufgebaut, lötstellen (beim alten wie neuen) durchgemessen, sie gehen BEIDE NICHT! Heading von 269 wird angezeigt und schluss...

    @fabqu: sind auf der IO pltine irgendwelche stellen/bauteile die als ursache in frage kämen?

    @Dirk: was ich nun bräuchte wäre ein kurzes, simples testprogramm, kannst du mir da bitte helfen?

    ich habe zu beginn meiner letzten tests versucht die änderungen, die ich schon vor wochen an den standard-libs durchgeführt habe in die neu heruntergeladenen zu übertragen. z.b. habe ich die aktivierung des HDMM01 aus der Orientation.h rausgenommemn/dort deaktiviert gehabt und die aktivierung in eine separate datei (inka.h und inka.c) eingetragen. Es hat nicht hingehauen, deshalb habe ich es wieder zurückgeändert. Daran kann es wohl jetzt nicht liegen, oder?
    gruß inka

  9. #39
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    das hier wäre der letzter aktueller stand meiner hardware, bei abgezogenem SCL oder SDA kommt eine I2C fehlermeldung:

    "I2C ERROR -> X 0 TWI STATE 0x20"

    wobei dann das programm weiterläuft

    Anzeige im LCD display:

    1.zeile: Heading 227
    2.zeile: X 0 TATY 0 48
    ---------------------------------------------

    Zitat Zitat von fabqu Beitrag anzeigen
    verbinde mal VCC, GND und SDA/SCL vom i2c. Dann überprüfe diese Leitungen auf durchgang (im ausgeschalteten zustand deines rp6) von ihrem Ursprung aus. Also: klappt die Verbindung GND des hdmm zum GND von der rp6base?
    bei ausgeschaltetem RP6 gemessen zu M32/XBUS2/pin 14, durchgang ok, zum pin GND am lochfeld der BASE, durchgang ok

    Zitat Zitat von fabqu Beitrag anzeigen
    Klappt VCC hdmm zu VCC der Multi-IO, oder woher du auch immer deine Versorgung nimmst?
    HDMM wird von der I/O versorgt, die ersten 4 kontakte der pinreihe für gyro (VCC/GND/SDA/SCL), bei eingeschaltetem RP6 liegen am HDMM, direkt an den anschlüssen, 5V an.

    Zitat Zitat von fabqu Beitrag anzeigen
    klappt SDA und SCL vom hdmm zu deinem Master-Modul?
    bei ausgeschaltetem RP6 auf durchgang gemessen zu der M32/XBUS2 pins 10 und 12(unterhalb des LCD), durchgang ok
    Geändert von inka (29.05.2013 um 10:19 Uhr)
    gruß inka

  10. #40
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    @inka:
    Ich probiere das in den nächsten Tagen mal.
    In welcher Konfiguration der Lib klappt es denn nicht?
    Hast du nur COMPASS_2D aktiviert und GPS, IMU_9D nicht?
    Also: Betreibst du NUR den HDMM01 mit der Lib?
    Probieren kann ich es z.Zt. aber nur mit der M256, weil ich die M32 zur Zeit nicht greifbar habe.
    Gruß
    Dirk

Seite 4 von 6 ErsteErste ... 23456 LetzteLetzte

Ähnliche Themen

  1. Kompass-Modul Hdmm01 für den Rp6
    Von Morpheus1997 im Forum Robby RP6
    Antworten: 8
    Letzter Beitrag: 09.08.2012, 18:33
  2. 2 x HDMM01 auf Arduino Mega
    Von arnoa im Forum Sensoren / Sensorik
    Antworten: 2
    Letzter Beitrag: 08.02.2012, 17:19
  3. Pollin I2C Kompassmodul HDMM01
    Von malthy im Forum Sensoren / Sensorik
    Antworten: 11
    Letzter Beitrag: 15.09.2011, 13:53
  4. Zu Servo anssteuerung von Dirk frage
    Von Christian3 im Forum Robby RP6
    Antworten: 1
    Letzter Beitrag: 16.06.2009, 13:31
  5. @Dirk Gemeinsames Modul
    Von UweMD im Forum Robby CCRP5
    Antworten: 2
    Letzter Beitrag: 21.09.2004, 07:21

Berechtigungen

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

LiFePO4 Speicher Test