diff --git a/lis3dh.py b/lis3dh.py new file mode 100644 index 0000000..f5ab202 --- /dev/null +++ b/lis3dh.py @@ -0,0 +1,76 @@ +"""Library for interacting with LIS3DH triple-axis accelerometer.""" + +from importlib.resources import read_text +from tabnanny import check +import smbus2 +from time import sleep + +# Register addresses +_CTRL_REG1 = bytes([0x20]) +_CTRL_REG2 = bytes([0x21]) +_CTRL_REG3 = bytes([0x22]) +_CTRL_REG4 = bytes([0x23]) +_CTRL_REG5 = bytes([0x24]) +_CTRL_REG6 = bytes([0x25]) +_REF_REG = bytes([0x26]) +_STATUS_REG = bytes([0x27]) +_OUT_X_L = bytes([0x28]) +_OUT_X_H = bytes([0x29]) +_OUT_Y_L = bytes([0x2A]) +_OUT_Y_H = bytes([0x2B]) +_OUT_Z_L = bytes([0x2C]) +_OUT_Z_H = bytes([0x2D]) +_INT1_CFG = bytes([0x30]) +_INT1_SRC = bytes([0x31]) +_INT1_THS = bytes([0x32]) +_INT1_DURATION = bytes([0x33]) +_INT2_CFG = bytes([0x34]) +_INT2_SRC = bytes([0x35]) +_INT2_THS = bytes([0x36]) +_INT2_DURATION = bytes([0x37]) +_CLICK_CFG = bytes([0x38]) +# Config flags +SAMPLERATE_1HZ = bytes([0x17]) +SAMPLERATE_10HZ = bytes([0x27]) +SAMPLERATE_25HZ = bytes([0x37]) +HP_DISABLE = bytes([0x00]) +CTRL_REG3_V = bytes([0x40]) +CTRL_REG4_V = bytes([0x00]) # sensitivity set to 2g +CTRL_REG5_V = bytes([0x08]) +INT1_THS_V = bytes([0x16]) # free-fall threshold at 350 mg +INT1_DURATION_V = bytes([0x03]) +INT1_CFG_V = bytes([0x95]) +EMPTY = bytes([0x00]) + +class lis3dh: + def __init__(self, i2cBus, i2cAddress=0x18, samplerate=SAMPLERATE_1HZ): + sleep(0.005) + self.i2c = i2cBus + self.addr = i2cAddress + self.samplerate = samplerate + i2cBus.pec = True # enable smbus2 Packet Error Checking + + #First try; configure beginning from 0x20 with MSB = 1 to increment + config1 = smbus2.i2c_msg.write(self.addr, [0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00]) + config2 = smbus2.i2c_msg.write(self.addr, [0xB2,0x00,0x00]) #Configure 0x32 with MSB = 1 to increment + config3 = smbus2.i2c_msg.write(self.addr, [0x30,0x00]) #Configure 0x30 + config4 = smbus2.i2c_msg.write(self.addr, [0x24,0x00]) #Configure 0x24 again + self.i2c.i2c_rdwr(config1, config2, config3, config4) + + def readAll(self) -> list: + check_status = smbus2.i2c_msg.write(self.addr, [0x27]) + read_axis = smbus2.i2c_msg.read(self.addr, 1) + prepare_x = smbus2.i2c_msg.write(self.addr, [0x28]) + prepare_y = smbus2.i2c_msg.write(self.addr, [0x2A]) + prepare_z = smbus2.i2c_msg.write(self.addr, [0x2C]) + read_status = smbus2.i2c_msg.read(self.addr, 1) + status = self.i2c.i2c_rdwr(check_status, read_status) + while status.buf[0] != 0b1111: + sleep(0.00001) + x = self.i2c.i2c_rdwr(prepare_x, read_axis) + y = self.i2c.i2c_rdwr(prepare_y, read_axis) + z = self.i2c.i2c_rdwr(prepare_z, read_axis) + X = int.from_bytes(x.buf[0]) + Y = int.from_bytes(y.buf[0]) + Z = int.from_bytes(z.buf[0]) + return [X,Y,Z] \ No newline at end of file diff --git a/main.py b/main.py index cc8d835..4a2a346 100644 --- a/main.py +++ b/main.py @@ -1 +1,11 @@ -print("Raspberry Pi Zero W, up and running!") \ No newline at end of file +import lis3dh.py + +print("Raspberry Pi Zero W, up and running!") + +accel = lis3dh() + +print("LIS3DH initiated successfully!") + +while True: + [X,Y,Z] = accel.readAll() + print("X: ",X,"\tY: ",Y,"\t Z: ",Z,"\n") \ No newline at end of file