I have started on a Python class for LSM303 studying from Adafruit's BMP085 code, but there seems something not quite right that readings sometimes produces outrageous figures. Could you help me?
Code: Select all
#!/usr/bin/python
import time
from Adafruit_I2C import Adafruit_I2C
# ===========================================================================
# LSM303DLHC Class
# by Shigeru KAWAGUCHI
# ===========================================================================
class LSM303DLHC :
i2c_accel = None
i2c_mag = None
# Device Addresses
__LSM303DLHC_ADDRESS_ACCEL = 0x32
__LSM303DLHC_ADDRESS_MAG = 0x3C
__LSM303DLHC_ID = 0b11010100
# LSM303DLHC Registers Default Type
__LSM303DLHC_REGISTER_ACCEL_CTRL_REG1_A = 0x20 # 00000111 rw
__LSM303DLHC_REGISTER_ACCEL_CTRL_REG2_A = 0x21 # 00000000 rw
__LSM303DLHC_REGISTER_ACCEL_CTRL_REG3_A = 0x22 # 00000000 rw
__LSM303DLHC_REGISTER_ACCEL_CTRL_REG4_A = 0x23 # 00000000 rw
__LSM303DLHC_REGISTER_ACCEL_CTRL_REG5_A = 0x24 # 00000000 rw
__LSM303DLHC_REGISTER_ACCEL_CTRL_REG6_A = 0x25 # 00000000 rw
__LSM303DLHC_REGISTER_ACCEL_REFERENCE_A = 0x26 # 00000000 r
__LSM303DLHC_REGISTER_ACCEL_STATUS_REG_A = 0x27 # 00000000 r
__LSM303DLHC_REGISTER_ACCEL_OUT_X_L_A = 0x28
__LSM303DLHC_REGISTER_ACCEL_OUT_X_H_A = 0x29
__LSM303DLHC_REGISTER_ACCEL_OUT_Y_L_A = 0x2A
__LSM303DLHC_REGISTER_ACCEL_OUT_Y_H_A = 0x2B
__LSM303DLHC_REGISTER_ACCEL_OUT_Z_L_A = 0x2C
__LSM303DLHC_REGISTER_ACCEL_OUT_Z_H_A = 0x2D
__LSM303DLHC_REGISTER_ACCEL_FIFO_CTRL_REG_A = 0x2E
__LSM303DLHC_REGISTER_ACCEL_FIFO_SRC_REG_A = 0x2F
__LSM303DLHC_REGISTER_ACCEL_INT1_CFG_A = 0x30
__LSM303DLHC_REGISTER_ACCEL_INT1_SOURCE_A = 0x31
__LSM303DLHC_REGISTER_ACCEL_INT1_THS_A = 0x32
__LSM303DLHC_REGISTER_ACCEL_INT1_DURATION_A = 0x33
__LSM303DLHC_REGISTER_ACCEL_INT2_CFG_A = 0x34
__LSM303DLHC_REGISTER_ACCEL_INT2_SOURCE_A = 0x35
__LSM303DLHC_REGISTER_ACCEL_INT2_THS_A = 0x36
__LSM303DLHC_REGISTER_ACCEL_INT2_DURATION_A = 0x37
__LSM303DLHC_REGISTER_ACCEL_CLICK_CFG_A = 0x38
__LSM303DLHC_REGISTER_ACCEL_CLICK_SRC_A = 0x39
__LSM303DLHC_REGISTER_ACCEL_CLICK_THS_A = 0x3A
__LSM303DLHC_REGISTER_ACCEL_TIME_LIMIT_A = 0x3B
__LSM303DLHC_REGISTER_ACCEL_TIME_LATENCY_A = 0x3C
__LSM303DLHC_REGISTER_ACCEL_TIME_WINDOW_A = 0x3D
__LSM303DLHC_REGISTER_MAG_CRA_REG_M = 0x00
__LSM303DLHC_REGISTER_MAG_CRB_REG_M = 0x01
__LSM303DLHC_REGISTER_MAG_MR_REG_M = 0x02
__LSM303DLHC_REGISTER_MAG_OUT_X_H_M = 0x03
__LSM303DLHC_REGISTER_MAG_OUT_X_L_M = 0x04
__LSM303DLHC_REGISTER_MAG_OUT_Z_H_M = 0x05
__LSM303DLHC_REGISTER_MAG_OUT_Z_L_M = 0x06
__LSM303DLHC_REGISTER_MAG_OUT_Y_H_M = 0x07
__LSM303DLHC_REGISTER_MAG_OUT_Y_L_M = 0x08
__LSM303DLHC_REGISTER_MAG_SR_REG_Mg = 0x09
__LSM303DLHC_REGISTER_MAG_IRA_REG_M = 0x0A
__LSM303DLHC_REGISTER_MAG_IRB_REG_M = 0x0B
__LSM303DLHC_REGISTER_MAG_IRC_REG_M = 0x0C
__LSM303DLHC_REGISTER_MAG_TEMP_OUT_H_M = 0x31
__LSM303DLHC_REGISTER_MAG_TEMP_OUT_L_M = 0x32
# Constructor
def __init__(self, address_accel=0x19, address_mag=0x1E, debug=False):
self.i2c_accel = Adafruit_I2C(address_accel)
self.i2c_mag = Adafruit_I2C(address_mag)
self.address_accel = address_accel
self.address_mag = address_mag
self.debug = debug
# Enable the accelerometer
# 10Hz measurement, normal mode, XYZ enabled
self.i2c_accel.write8(self.__LSM303DLHC_REGISTER_ACCEL_CTRL_REG1_A, 0x27)
# continuous update, little endian, +-4G, high resolution disable, 4 wire serial
self.i2c_accel.write8(self.__LSM303DLHC_REGISTER_ACCEL_CTRL_REG4_A, 0x10)
# Enable the magnetometer
# continuous conversion mode
self.i2c_mag.write8(self.__LSM303DLHC_REGISTER_MAG_MR_REG_M, 0x00)
# sensor input field range +-1.9 gauss
self.i2c_mag.write8(self.__LSM303DLHC_REGISTER_MAG_CRB_REG_M, 0x40)
def readAccelerations(self):
"Reads the accelerometer from the sensor"
xlo = self.i2c_accel.readU8(self.__LSM303DLHC_REGISTER_ACCEL_OUT_X_L_A)
if (self.debug):
print "DBG: accel X lo: 0x%04X (%d)" % (xlo & 0xFFFF, xlo)
xhi = self.i2c_accel.readU8(self.__LSM303DLHC_REGISTER_ACCEL_OUT_X_H_A)
if (self.debug):
print "DBG: accel X hi: 0x%04X (%d)" % (xhi & 0xFFFF, xhi)
ylo = self.i2c_accel.readU8(self.__LSM303DLHC_REGISTER_ACCEL_OUT_Y_L_A)
if (self.debug):
print "DBG: accel Y lo: 0x%04X (%d)" % (ylo & 0xFFFF, ylo)
yhi = self.i2c_accel.readU8(self.__LSM303DLHC_REGISTER_ACCEL_OUT_Y_H_A)
if (self.debug):
print "DBG: accel Y hi: 0x%04X (%d)" % (yhi & 0xFFFF, yhi)
zlo = self.i2c_accel.readU8(self.__LSM303DLHC_REGISTER_ACCEL_OUT_Z_L_A)
if (self.debug):
print "DBG: accel Z lo: 0x%04X (%d)" % (zlo & 0xFFFF, zlo)
zhi = self.i2c_accel.readU8(self.__LSM303DLHC_REGISTER_ACCEL_OUT_Z_H_A)
if (self.debug):
print "DBG: accel Z hi: 0x%04X (%d)" % (zhi & 0xFFFF, zhi)
accelData = Obj3D()
accelData.x = ((xhi << 8) + xlo)
accelData.y = ((yhi << 8) + ylo)
accelData.z = ((zhi << 8) + zlo)
return accelData
def readMagnetics(self):
"Reads the magmetometer from the sensor"
xlo = self.i2c_mag.readU8(self.__LSM303DLHC_REGISTER_MAG_OUT_X_L_M)
if (self.debug):
print "DBG: mag X lo: 0x%04X (%d)" % (xlo & 0xFFFF, xlo)
xhi = self.i2c_mag.readU8(self.__LSM303DLHC_REGISTER_MAG_OUT_X_H_M)
if (self.debug):
print "DBG: mag X hi: 0x%04X (%d)" % (xhi & 0xFFFF, xhi)
ylo = self.i2c_mag.readU8(self.__LSM303DLHC_REGISTER_MAG_OUT_Y_L_M)
if (self.debug):
print "DBG: mag Y lo: 0x%04X (%d)" % (ylo & 0xFFFF, ylo)
yhi = self.i2c_mag.readU8(self.__LSM303DLHC_REGISTER_MAG_OUT_Y_H_M)
if (self.debug):
print "DBG: mag Y hi: 0x%04X (%d)" % (yhi & 0xFFFF, yhi)
zlo = self.i2c_mag.readU8(self.__LSM303DLHC_REGISTER_MAG_OUT_Z_L_M)
if (self.debug):
print "DBG: mag Z lo: 0x%04X (%d)" % (zlo & 0xFFFF, zlo)
zhi = self.i2c_mag.readU8(self.__LSM303DLHC_REGISTER_MAG_OUT_Z_H_M)
if (self.debug):
print "DBG: mag Z hi: 0x%04X (%d)" % (zhi & 0xFFFF, zhi)
magData = Obj3D()
magData.x = ((xhi << 8) + xlo)
magData.y = ((yhi << 8) + ylo)
magData.z = ((zhi << 8) + zlo)
return magData
def setMagGain(self, gain):
self.i2c_mag.write8(self.__LSM303DLHC_REGISTER_MAG_CRB_REG_M, gain)
return 0
class Obj3D :
x = None
y = None
z = None