[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.
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
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 ...
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 ...
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
-
62,8 KB Aufrufe: 13
-
72,9 KB Aufrufe: 6
Zuletzt bearbeitet: