Hallo SenseBox Team,
prüft doch bitte mal die Definition BMX055_MAGN_ADDR in der Datei SenseBoxMCU.h Diese ist derzeit mit „#define BMX055_MAGN_ADDR 0x10“ festgelegt.
Wenn ich mit folgenden kurzen Programmteil den I2C Bus scanne meldet sich das Magnetometer auf 0x12
In der senseBoxIO ist auch mit „#define I2C_MAGNET (0x12) // BMX055“ festgelegt
//
// Scan I2C bus #1
//
Wire1.begin();
Serial.println("\nScanning I2C bus #1 ...");
for (byte address = 1; address < 127; address++)
{
Wire1.beginTransmission(address);
byte error = Wire1.endTransmission();
if (error == 0)
{
String sensor = String("\tFound sensor at 0x") + String(address, HEX);
Serial.print(sensor);
switch (address)
{
case (BMX055_MAGN_ADDR): // 0x10
Serial.print(" BMX055 magnetometer 0x10");
break;
case (I2C_MAGNET): // 0x12
Serial.print(" BMX055 magnetometer 0x12");
break;
// case (I2C_ACCEL): // 0x18
case (BMX055_ACCL_ADDR): // 0x18
Serial.print(" BMX055 accelerometer");
break;
case (I2C_ATECC): // 0x60
Serial.println(" ATECC ATSAMD21G18A");
break;
// case (I2C_GYRO): // 0x76
case (BMX055_GYRO_ADDR): // 0x76
Serial.print(" BMX055 gyroscop");
break;
default:
Serial.println();
break;
}
}
else if(error == 4)
{
Serial.print("\tUnknow error at 0x");
Serial.println(address, HEX);
}
}
Serial.println("...scan finished");
Die Original Funktion BMX055::getMagnet liefert auch keine Werte zurück. Erst wenn die Adresse 0x12 verwendet wird antwortet der Bus
void BMX055::getMagnet(int *x, int *y, int *z)
{
Serial.print("BMX055 MAG: „); // debug
for (int i = 0; i < 6; i++)
{
// Start I2C Transmission
Wire1.beginTransmission(BMX055_MAGN_ADDR);
// Select data register
Wire1.write((66 + i));
// Stop I2C Transmission
Wire1.endTransmission();
// Request 1 byte of data
Wire1.requestFrom(BMX055_MAGN_ADDR, 1);
// Read 6 bytes of data
// xMag lsb, xMag msb, yMag lsb, yMag msb, zMag lsb, zMag msb
if (Wire1.available() == 1)
{
_data[i] = Wire1.read();
Serial.print(String(_data[i], HEX)); // debug
Serial.print(“ "); //debug
}
}
Serial.println(); // debug
// Convert the data
int xMag = ((_data[1] * 256) + (_data[0] & 0xF8)) / 8;
if (xMag > 4095)
xMag -= 8192;
*x = xMag;
int yMag = ((_data[3] * 256) + (_data[2] & 0xF8)) / 8;
if (yMag > 4095)
yMag -= 8192;
*y = yMag;
int zMag = ((_data[5] * 256) + (_data[4] & 0xFE)) / 2;
if (zMag > 16383)
zMag -= 32768;
*z = zMag;
}
Viele Grüße
Bernd