Hi… I am using the LSM303D part on 10DOF sensor board and i am communicating it with esp8266. I am not able to read the correct Device identification register(WHO_AM_I = 0x49) and after writing all the control registers correctly the output doesnot change. I am also reading all the registers to see if i am able to write into registers properly. Attached excel sheet has the registers.
LSM303S_registers.xlsx (14.5 KB)
My code:
#include <Wire.h>
byte Address = 0B00011110;
byte OUT_X_L_M = 0B00001000;
byte OUT_X_H_M = 0B00001001;
byte OUT_Y_L_M = 0B00001010;
byte OUT_Y_H_M = 0B00001011;
byte OUT_Z_L_M = 0B00001100;
byte OUT_Z_H_M = 0B00001101;
byte WHO_AM_I = 0B00001111;
byte OUT_X_L_A = 0B00101000;
byte OUT_X_H_A = 0B00101001;
byte OUT_Y_L_A = 0B00101010;
byte OUT_Y_H_A = 0B00101011;
byte OUT_Z_L_A = 0B00101100;
byte OUT_Z_H_A = 0B00101101;
void setup()
{
Wire.begin();
Serial.begin(9600);
while (!Serial);
Serial.println("\nI2C Scanner");
delay(5000);
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ )
{
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.print(" !; WHO_AM_I register: ");
Wire.beginTransmission(address);
Wire.write(0x0F); //Start reading @ register 0x1B
Wire.endTransmission(); //End the transmission
Wire.requestFrom(address, 1); //Request 1 bytes from the gyro
while(Wire.available() < 1); //Wait until the byte is received
Serial.println(Wire.read(),HEX);
nDevices++;
}
else if (error==4)
{
Serial.print("Unknow error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
for(byte i=1; i<64;i++) {
Wire.beginTransmission(0x1E);
Wire.write(i); //Start reading @ register 0x1B
Wire.endTransmission(0); //End the transmission
Wire.requestFrom(0x1E,1); //Request 1 bytes from the gyro
while(Wire.available() < 1)
Serial.println("xxx");
Serial.print("0x");
Serial.print(i,HEX); //Wait until the byte is received
Serial.print(": 0x");
Serial.println(Wire.read(),HEX);
}
Wire.beginTransmission(0x1E);
Wire.write(0x1F); //Start reading @ register 0x1B
Wire.write(0x00);
Wire.endTransmission();
Wire.beginTransmission(0x1E);
Wire.write(0x20); //Start reading @ register 0x1B
Wire.write(0x37);
Wire.endTransmission();
Wire.beginTransmission(0x1E);
Wire.write(0x21); //Start reading @ register 0x1B
Wire.write(0x00);
Wire.endTransmission();
Wire.beginTransmission(0x1E);
Wire.write(0x22); //Start reading @ register 0x1B
Wire.write(0x00);
Wire.endTransmission();
Wire.beginTransmission(0x1E);
Wire.write(0x23); //Start reading @ register 0x1B
Wire.write(0x00);
Wire.endTransmission();
Wire.beginTransmission(0x1E);
Wire.write(0x24); //Start reading @ register 0x1B
Wire.write(0x90);
Wire.endTransmission();
Wire.beginTransmission(0x1E);
Wire.write(0x25); //Start reading @ register 0x1B
Wire.write(0x40);
Wire.endTransmission();
Wire.beginTransmission(0x1E);
Wire.write(0x26); //Start reading @ register 0x1B
Wire.write(0x00);
Wire.endTransmission();
Wire.beginTransmission(0x1E);
Wire.write(0x2E); //Start reading @ register 0x1B
Wire.write(0x00);
Wire.endTransmission();
Serial.println("--------------------------------------------------------------------------");
delay(1000);
for(byte i=1; i<64;i++) {
Wire.beginTransmission(0x1E);
Wire.write(i); //Start reading @ register 0x1B
Wire.endTransmission(0); //End the transmission
Wire.requestFrom(0x1E,1); //Request 1 bytes from the gyro
while(Wire.available() < 1)
Serial.println("xxx");
Serial.print("0x");
Serial.print(i,HEX); //Wait until the byte is received
Serial.print(": 0x");
Serial.println(Wire.read(),HEX);
}
}
void loop()
{
byte Who = ReadRegister(WHO_AM_I);
byte X_L_M = ReadRegister(OUT_X_L_M);
byte X_H_M = ReadRegister(OUT_X_H_M);
byte Y_L_M = ReadRegister(OUT_Y_L_M);
byte Y_H_M = ReadRegister(OUT_Y_H_M);
byte Z_L_M = ReadRegister(OUT_Z_L_M);
byte Z_H_M = ReadRegister(OUT_Z_H_M);
byte X_L_A = ReadRegister(OUT_X_L_A);
byte X_H_A = ReadRegister(OUT_X_H_A);
byte Y_L_A = ReadRegister(OUT_Y_L_A);
byte Y_H_A = ReadRegister(OUT_Y_H_A);
byte Z_L_A = ReadRegister(OUT_Z_L_A);
byte Z_H_A = ReadRegister(OUT_Z_H_A);
int X_AXIS_M = X_H_M <<8 | X_L_M;
int Y_AXIS_M = Y_H_M <<8 | Y_L_M;
int Z_AXIS_M = Z_H_M <<8 | Z_L_M;
int X_AXIS_A = X_H_A <<8 | X_L_A;
int Y_AXIS_A = Y_H_A <<8 | Y_L_A;
int Z_AXIS_A = Z_H_A <<8 | Z_L_A;
Serial.print("X-Axis_M: ");
Serial.print(X_AXIS_M, HEX);
Serial.println(" Gauss");
Serial.print("Y-Axis_M: ");
Serial.print(Y_AXIS_M, HEX);
Serial.println(" Gauss");
Serial.print("Z-Axis_M: ");
Serial.print(Z_AXIS_M, HEX);
Serial.println(" Gauss");
Serial.print("X-Axis_A: ");
Serial.print(X_AXIS_A, HEX);
Serial.println(" G");
Serial.print("Y-Axis_A: ");
Serial.print(Y_AXIS_A, HEX);
Serial.println(" G");
Serial.print("Z-Axis_A: ");
Serial.print(Z_AXIS_A, HEX);
Serial.println(" G");
delay(2000);
}
byte ReadRegister(int Register){
byte result = 0;
Wire.beginTransmission(Address); //slave ID start talking
//ask for info in register
Wire.write(Register);
//complete the send
Wire.endTransmission(0);
//Request 1 byte
Wire.requestFrom(Address , 1);
//wait for info
while( Wire.available() == 0)
Serial.println("xxxxxxxxxx");
result = Wire.read();
//get info
Wire.endTransmission();
return(result);
}
void WriteRegister(byte Register, byte Value){
Wire.beginTransmission(Address );
Wire.write(Register);
Wire.write(Value);
Wire.endTransmission();
}
Please help!!