[How to] Crius All In One Pro V1.1, Multiwii 2.2, externes Magnetometer-experimentell

#1
[How to] Crius All In One Pro V1.1, Multiwii 2.2, externes Magnetometer

Hallo,
da ich Probleme mit meinem internen Mag auf dem Crius AIOP Board habe, wollte ich auf einen externen Mag umsteigen.
Da ich ungerne den internen Mag physisch entfernen wollte. (Siehe Anleitung von sandrodadon ), habe ich mir mal den Quellcode vorgenommen.

Um einen externen Mag (hier HMC5883L), Multwii 2.2, am I2C Bus des AIOP Boards zu betreiben, muss folgendes vorgenommen werden.
  • Schritt 1:
    In der Datei Sensors.ino muss um die fett gedruckte Zeile ergänzt werden.

    Code:
    ...
    // ************************************************************************************************************
    // I2C Gyroscope and Accelerometer MPU6050
    // ************************************************************************************************************
    #if defined(MPU6050)
    
    void Gyro_init() {
      TWBR = ((F_CPU / 400000L) - 16) / 2; // change the I2C clock rate to 400kHz
      i2c_writeReg(MPU6050_ADDRESS, 0x6B, 0x80);             //PWR_MGMT_1    -- DEVICE_RESET 1
      delay(5);
      i2c_writeReg(MPU6050_ADDRESS, 0x6B, 0x03);             //PWR_MGMT_1    -- SLEEP 0; CYCLE 0; TEMP_DIS 0; CLKSEL 3 (PLL with Z Gyro reference)
      i2c_writeReg(MPU6050_ADDRESS, 0x1A, MPU6050_DLPF_CFG); //CONFIG        -- EXT_SYNC_SET 0 (disable input pin for data sync) ; default DLPF_CFG = 0 => ACC bandwidth = 260Hz  GYRO bandwidth = 256Hz)
      i2c_writeReg(MPU6050_ADDRESS, 0x1B, 0x18);             //GYRO_CONFIG   -- FS_SEL = 3: Full scale set to 2000 deg/sec
      // enable I2C bypass for AUX I2C
      #if defined(MAG)
        i2c_writeReg(MPU6050_ADDRESS, 0x37, 0x02);           //INT_PIN_CFG   -- INT_LEVEL=0 ; INT_OPEN=0 ; LATCH_INT_EN=0 ; INT_RD_CLEAR=0 ; FSYNC_INT_LEVEL=0 ; FSYNC_INT_EN=0 ; I2C_BYPASS_EN=1 ; CLKOUT_EN=0
      #endif
       [B]i2c_writeReg(MPU6050_ADDRESS, 0x37, 0x00);[/B]
    }
    
    void Gyro_getADC () {
    ...
  • Schritt 2:
    In der Datei def.h
    muss folgender Abschnitt:
    Code:
    ...
    #if defined(CRIUS_AIO_PRO_V1) 
      #define MPU6050 
      #define HMC5883 
      #define MS561101BA 
      #define ACC_ORIENTATION(X, Y, Z)  {accADC[ROLL]  = -X; accADC[PITCH]  = -Y; accADC[YAW]  =  Z;} 
      #define GYRO_ORIENTATION(X, Y, Z) {gyroADC[ROLL] =  Y; gyroADC[PITCH] = -X; gyroADC[YAW] = -Z;} 
      #define MAG_ORIENTATION(X, Y, Z)  {magADC[ROLL]  =  X; magADC[PITCH]  =  Y; magADC[YAW]  = -Z;} 
      [B]#define MPU6050_I2C_AUX_MASTER // MAG connected to the AUX I2C bus of MPU6050 [/B]
      #undef INTERNAL_I2C_PULLUPS 
      #define I2C_SPEED 400000L         //400kHz fast mode
    ...
    zu:
    Code:
    ...
    #if defined(CRIUS_AIO_PRO_V1) 
      #define MPU6050 
      #define HMC5883 
      #define MS561101BA 
      #define ACC_ORIENTATION(X, Y, Z)  {accADC[ROLL]  = -X; accADC[PITCH]  = -Y; accADC[YAW]  =  Z;} 
      #define GYRO_ORIENTATION(X, Y, Z) {gyroADC[ROLL] =  Y; gyroADC[PITCH] = -X; gyroADC[YAW] = -Z;} 
      #define MAG_ORIENTATION(X, Y, Z)  {magADC[ROLL]  =  X; magADC[PITCH]  =  Y; magADC[YAW]  = -Z;} 
     [B] //#define MPU6050_I2C_AUX_MASTER // MAG connected to the AUX I2C bus of MPU6050 [/B]
      #undef INTERNAL_I2C_PULLUPS 
      #define I2C_SPEED 400000L         //400kHz fast mode
    ...
    geändert werden.

Danach kann im GUI der Mag neu kalibriert werden, es werden dann keine Mag Werte mehr ausgelesen,falls noch kein Externer am I2C angeschlossen. Ist ein Externer angeschlossen, so sollte dessen Werte jetzt ausgelesen werden.

Die Methode sollte auch für andere Boards mit MPU6050 und Mag am Aux I2C Bus funktionieren.




***Achtung***
Warum ist es noch experimentell?
Ich habe ich moment leider kein externes Magnetometer zum testen, daher bin ich mir noch nicht sicher ob es wirklich funktioniert, sollte aber. Falls jemand einen Mag für mich übrig hat oder es selber testen würde, wäre das großartig.


Gruß
tigerente4x

Update: nicht mehr experimentell, funktioniert wunderbar


Anhang:
-die Sensors.txt muss wieder in Sensors.ino umbenannt werden
-die def.txt muss wieder in def.h umbenannt werden
 

Anhänge

Zuletzt bearbeitet:

JUERGEN_

Generation 60++
#4
.
das heist du deaktivierst quasie softwaremässig den "AUX I2C bus of MPU6050 "

Schaltung wie hier beim GY-86 .



und fragst den HMC5883, direkt auf dem I2C Bus ab.

:)
 

lans38

Erfahrener Benutzer
#7
hm..deine Methode funktioniert bei mir nicht. ich bekomme dann fehler auf dem i2c bus. Ausserdem ist der interne mag. immer noch aktiv. Habe es mit dem orig. Crius AIOPv1.1 Board als auf mit dem Clone von HK probiert. Hast du evtl. noch was im Code geändert...was du vergessen hast zu erwähnen.

gruss
 
#8
Hast du danach den Mag neu kalibriert?
Sonst hab ich im ersten Post mal meine Sensor.ino und def.h dateien angefügt.
In der config.h muss das Crius All In One Board ausgewählt werden.
 

lans38

Erfahrener Benutzer
#9
warum sollte ich den Mag kalibrieren, wenn ich fehler auf dem bus habe.??
Die i2c busfehler treten dann übrigens bei mir auch ohne angeschlossenes externes Mag. auf. Bei meinem Drotek HMC5883L ist eine lötbrücke zum setzen der internen pull-up widerstände, muss ich da was beachten?? (momemtan sind die pull-ups deaktiviert)
 
FPV1

Banggood

Oben Unten