Bear with me, I struggle with I2C setups, but I am trying to read data from two MinIMU-9 V3 sensors. I am able to read from each sensor on their own, and view the data in the serial monitor. I also have a sketch to make sure that both sensors can be seen on the I2C bus, to make sure they each have their own address, which they do. Where I am struggling with is understanding do I need to modify the sketch to read data from a different address, or do I need to modify the library (.cpp or .h file)?
I am currently working on making this work on the LSM303D sensor, the files I am using can be found here:
I am currently using the Serial sketch, trying to view data from two LSM303D sensors at the same time. Once I figure that out, I can apply it to the actual application.
The Serial sketch can be found in the examples folder in that link. I am just trying to modify that, because its basic, to read the data from the two sensors.
Have you run the I2CScanner program to insure both addresses are showing?
If so, you will probably need to change the Pololu library to use both LSM303 devices.
edit: Maybe the library doesn't need to be changed. Your compass.init call will need to be changed tho. You will need two compass declarations.
// from LSM303.h
bool init(deviceType device = device_auto, sa0State sa0 = sa0_auto);
// from LSM303.cpp
bool LSM303::init(deviceType device, sa0State sa0)
{
// perform auto-detection unless device type and SA0 state were both specified
if (device == device_auto || sa0 == sa0_auto)
{
// check for LSM303D if device is unidentified or was specified to be this type
if (device == device_auto || device == device_D)
{
// check SA0 high address unless SA0 was specified to be low
if (sa0 != sa0_low && testReg(D_SA0_HIGH_ADDRESS, WHO_AM_I) == D_WHO_ID)
{
// device responds to address 0011101 with D ID; it's a D with SA0 high
device = device_D;
sa0 = sa0_high;
}
// check SA0 low address unless SA0 was specified to be high
else if (sa0 != sa0_high && testReg(D_SA0_LOW_ADDRESS, WHO_AM_I) == D_WHO_ID)
{
// device responds to address 0011110 with D ID; it's a D with SA0 low
device = device_D;
sa0 = sa0_low;
}
}
// check for LSM303DLHC, DLM, DLH if device is still unidentified or was specified to be one of these types
if (device == device_auto || device == device_DLHC || device == device_DLM || device == device_DLH)
{
// check SA0 high address unless SA0 was specified to be low
if (sa0 != sa0_low && testReg(DLHC_DLM_DLH_ACC_SA0_HIGH_ADDRESS, CTRL_REG1_A) != TEST_REG_ERROR)
{
// device responds to address 0011001; it's a DLHC, DLM with SA0 high, or DLH with SA0 high
sa0 = sa0_high;
if (device == device_auto)
{
// use magnetometer WHO_AM_I register to determine device type
//
// DLHC seems to respond to WHO_AM_I request the same way as DLM, even though this
// register isn't documented in its datasheet. Since the DLHC accelerometer address is the
// same as the DLM with SA0 high, but Pololu DLM boards pull SA0 low by default, we'll
// guess that a device whose accelerometer responds to the SA0 high address and whose
// magnetometer gives the DLM ID is actually a DLHC.
device = (testReg(DLHC_DLM_DLH_MAG_ADDRESS, WHO_AM_I_M) == DLM_WHO_ID) ? device_DLHC : device_DLH;
}
}
// check SA0 low address unless SA0 was specified to be high
else if (sa0 != sa0_high && testReg(DLM_DLH_ACC_SA0_LOW_ADDRESS, CTRL_REG1_A) != TEST_REG_ERROR)
{
// device responds to address 0011000; it's a DLM with SA0 low or DLH with SA0 low
sa0 = sa0_low;
if (device == device_auto)
{
// use magnetometer WHO_AM_I register to determine device type
device = (testReg(DLHC_DLM_DLH_MAG_ADDRESS, WHO_AM_I_M) == DLM_WHO_ID) ? device_DLM : device_DLH;
}
}
}
// make sure device and SA0 were successfully detected; otherwise, indicate failure
if (device == device_auto || sa0 == sa0_auto)
{
return false;
}
}
_device = device;
// set device addresses and translated register addresses
switch (device)
{
case device_D:
acc_address = mag_address = (sa0 == sa0_high) ? D_SA0_HIGH_ADDRESS : D_SA0_LOW_ADDRESS;
translated_regs[-OUT_X_L_M] = D_OUT_X_L_M;
translated_regs[-OUT_X_H_M] = D_OUT_X_H_M;
translated_regs[-OUT_Y_L_M] = D_OUT_Y_L_M;
translated_regs[-OUT_Y_H_M] = D_OUT_Y_H_M;
translated_regs[-OUT_Z_L_M] = D_OUT_Z_L_M;
translated_regs[-OUT_Z_H_M] = D_OUT_Z_H_M;
break;
case device_DLHC:
acc_address = DLHC_DLM_DLH_ACC_SA0_HIGH_ADDRESS; // DLHC doesn't have configurable SA0 but uses same acc address as DLM/DLH with SA0 high
mag_address = DLHC_DLM_DLH_MAG_ADDRESS;
translated_regs[-OUT_X_H_M] = DLHC_OUT_X_H_M;
translated_regs[-OUT_X_L_M] = DLHC_OUT_X_L_M;
translated_regs[-OUT_Y_H_M] = DLHC_OUT_Y_H_M;
translated_regs[-OUT_Y_L_M] = DLHC_OUT_Y_L_M;
translated_regs[-OUT_Z_H_M] = DLHC_OUT_Z_H_M;
translated_regs[-OUT_Z_L_M] = DLHC_OUT_Z_L_M;
break;
case device_DLM:
acc_address = (sa0 == sa0_high) ? DLHC_DLM_DLH_ACC_SA0_HIGH_ADDRESS : DLM_DLH_ACC_SA0_LOW_ADDRESS;
mag_address = DLHC_DLM_DLH_MAG_ADDRESS;
translated_regs[-OUT_X_H_M] = DLM_OUT_X_H_M;
translated_regs[-OUT_X_L_M] = DLM_OUT_X_L_M;
translated_regs[-OUT_Y_H_M] = DLM_OUT_Y_H_M;
translated_regs[-OUT_Y_L_M] = DLM_OUT_Y_L_M;
translated_regs[-OUT_Z_H_M] = DLM_OUT_Z_H_M;
translated_regs[-OUT_Z_L_M] = DLM_OUT_Z_L_M;
break;
case device_DLH:
acc_address = (sa0 == sa0_high) ? DLHC_DLM_DLH_ACC_SA0_HIGH_ADDRESS : DLM_DLH_ACC_SA0_LOW_ADDRESS;
mag_address = DLHC_DLM_DLH_MAG_ADDRESS;
translated_regs[-OUT_X_H_M] = DLH_OUT_X_H_M;
translated_regs[-OUT_X_L_M] = DLH_OUT_X_L_M;
translated_regs[-OUT_Y_H_M] = DLH_OUT_Y_H_M;
translated_regs[-OUT_Y_L_M] = DLH_OUT_Y_L_M;
translated_regs[-OUT_Z_H_M] = DLH_OUT_Z_H_M;
translated_regs[-OUT_Z_L_M] = DLH_OUT_Z_L_M;
break;
}
return true;
}
This compiles, but I'm not sure it works. I don't have two LSM303 devices to check it with.