# Double I2C ADXL345 Code back up : ## adxl345: ```python= # ADXL345 Python library for Raspberry Pi # # author: Jonathan Williamson # license: BSD, see LICENSE.txt included in this package # # This is a Raspberry Pi Python implementation to help you get started with # the Adafruit Triple Axis ADXL345 breakout board: # http://shop.pimoroni.com/products/adafruit-triple-axis-accelerometer import struct import smbus from time import sleep import Adafruit_GPIO.I2C as I2C # select the correct i2c bus for this revision of Raspberry Pi revision = ([l[12:-1] for l in open('/proc/cpuinfo','r').readlines() if l[:8]=="Revision"]+['0000'])[0] bus = smbus.SMBus(1) # ADXL345 constants EARTH_GRAVITY_MS2 = 9.80665 SCALE_MULTIPLIER = 0.004 ADXL345_REG_DATAX0 = 0x32 # X-axis data 0 (6 bytes for X/Y/Z) DATA_FORMAT = 0x31 BW_RATE = 0x2C POWER_CTL = 0x2D BW_RATE_1600HZ = 0x0F BW_RATE_800HZ = 0x0E BW_RATE_400HZ = 0x0D BW_RATE_200HZ = 0x0C BW_RATE_100HZ = 0x0B BW_RATE_50HZ = 0x0A BW_RATE_25HZ = 0x09 RANGE_2G = 0x00 RANGE_4G = 0x01 RANGE_8G = 0x02 RANGE_16G = 0x03 MEASURE = 0x08 AXES_DATA = 0x32 ADXL345_REG_DEVID = 0x00 # Device ID ADXL345_REG_POWER_CTL = 0x2D class ADXL345: address = None def __init__(self,i2c=None,address=0x53,**kwargs): if i2c is None: import Adafruit_GPIO.I2C as I2C i2c = I2C self.address = address self.setBandwidthRate(BW_RATE_100HZ) self.setRange(RANGE_16G) self.enableMeasurement() self._device = i2c.get_i2c_device(address, **kwargs) if self._device.readU8(ADXL345_REG_DEVID) == 0xE5: self._device.write8(ADXL345_REG_POWER_CTL, 0x08) def enableMeasurement(self): bus.write_byte_data(self.address, POWER_CTL, MEASURE) def setBandwidthRate(self, rate_flag): bus.write_byte_data(self.address, BW_RATE, rate_flag) # set the measurement range for 10-bit readings def setRange(self, range_flag): value = bus.read_byte_data(self.address, DATA_FORMAT) value &= ~0x0F; value |= range_flag; value |= 0x08; bus.write_byte_data(self.address, DATA_FORMAT, value) # returns the current reading from the sensor for each axis # # parameter gforce: # False (default): result is returned in m/s^2 # True : result is returned in gs def getAxes(self, gforce = False): bytes = bus.read_i2c_block_data(self.address, AXES_DATA, 6) x = bytes[0] | (bytes[1] << 8) if(x & (1 << 16 - 1)): x = x - (1<<16) y = bytes[2] | (bytes[3] << 8) if(y & (1 << 16 - 1)): y = y - (1<<16) z = bytes[4] | (bytes[5] << 8) if(z & (1 << 16 - 1)): z = z - (1<<16) x = x * SCALE_MULTIPLIER y = y * SCALE_MULTIPLIER z = z * SCALE_MULTIPLIER if gforce == False: x = x * EARTH_GRAVITY_MS2 y = y * EARTH_GRAVITY_MS2 z = z * EARTH_GRAVITY_MS2 x = round(x, 4) y = round(y, 4) z = round(z, 4) return {"x": x, "y": y, "z": z} def read(self): raw = self._device.readList(ADXL345_REG_DATAX0, 6) return struct.unpack('<hhh', raw) if __name__ == "__main__": # if run directly we'll just create an instance of the class and output # the current readings adxl345 = ADXL345() axes= adxl345.getAxes(True) x, y, z= adxl345.read() print ("ADXL345 on address 0x%x:" % (adxl345.address)) print (" x = %.3fG" % ( axes['x'] )) print (" y = %.3fG" % ( axes['y'] )) print (" z = %.3fG" % ( axes['z'] )) print('X={0}, Y={1}, Z={2}'.format(x, y, z)) ``` ## exmple: ```python= from adxl345 import ADXL345 import time while 1: adxl345 = ADXL345() adxl345.address = 0x53 x_1,y_1,z_1 = adxl345.read() axes = adxl345.getAxes(True) adxl345_1 = ADXL345() adxl345_1.address = 0x04 x_2,y_2,z_2=adxl345_1.read() axes_1 = adxl345_1.getAxes(True) print ("ADXL345 on address 0x%x:" % (adxl345.address)) """ print (" x = %.3fG" % ( axes['x'] )) print (" y = %.3fG" % ( axes['y'] )) print (" z = %.3fG" % ( axes['z'] )) """ print('X={0}, Y={1}, Z={2}'.format(x_1, y_1, z_1)) time.sleep(0.2) print ("ADXL345_1 on address 0x%x:" % (adxl345_1.address)) """ print (" x = %.3fG" % ( axes_1['x'] )) print (" y = %.3fG" % ( axes_1['y'] )) print (" z = %.3fG" % ( axes_1['z'] )) """ print('X={0}, Y={1}, Z={2}'.format(x_2, y_2, z_2)) time.sleep(0.2) ```