3-Axis Digital Accelerometer is the key part in projects like orientation detection, gesture detection and Motion detection. This 3-Axis Digital Accelerometer(±16g) is based on low power consumption IC ADXL345. It features up to 10,000g high shock survivability and configurable Samples per Second rate. For generous applications that don't require too large measurement range, this is a great choice because it's durable, energy saving and cost-efficient.
Specifications
Working voltage: 3.0 - 5.5V
Test Range: ±16
Sensitivity: 3.9mg / LSB
Standby Current: 0.1μA(Under stand mode Vcc = 2.5 V (typical))
10000 g high shock survivability
ECOPACK®RoHS and “Green” compliant
Suli-compatible Library
!!!Tip
More details about Grove modules please refer to Grove System
Demonstration
With Arduino
Every accelerometer has been individually tested before shipping to you. But in rare cases, you might need to reset the zero-offset by yourself. Here below we show you how to read the raw data and obtain data in the unit of g, AKA g-force, from this accelerometer.
Step1: Plug it onto the I2C port of your Grove - Base Shield.
Step4: Upload the code and open the serial monitor(usually it is on the right up corner). Please refer to the toturial Upload code if you do not know how to upload.
Step5: The result will be showed as the format in below image, shake the grove and you will find the number changing.
The outputs of this sensor consist of two parts: raw data and 3-axis acceleration info converted into the unit of gravity, "g".
With Raspberry Pi
Step1: You should have got a raspberry pi and a grovepi or grovepi+.
Step2: You should have completed configuring the development enviroment, otherwise follow here.
Step3: Connection
Plug the sensor to grovepi socket i2c-x(1~3) by using a grove cable.
Step4: Navigate to the demos' directory:
cd yourpath/GrovePi/Software/Python/
To see the code
nano grovepi_tilt_switch.py # "Ctrl+x" to exit #
import smbusfrom time import sleep# select the correct i2c bus for this revision of Raspberry Pirevision = ([l[12:-1]for l inopen('/proc/cpuinfo','r').readlines()if l[:8]=="Revision"]+['0000'])[0]bus = smbus.SMBus(1ifint(revision, 16) >=4else0)# ADXL345 constantsEARTH_GRAVITY_MS2 =9.80665SCALE_MULTIPLIER =0.004DATA_FORMAT =0x31BW_RATE =0x2CPOWER_CTL =0x2DBW_RATE_1600HZ =0x0FBW_RATE_800HZ =0x0EBW_RATE_400HZ =0x0DBW_RATE_200HZ =0x0CBW_RATE_100HZ =0x0BBW_RATE_50HZ =0x0ABW_RATE_25HZ =0x09RANGE_2G =0x00RANGE_4G =0x01RANGE_8G =0x02RANGE_16G =0x03MEASURE =0x08AXES_DATA =0x32classADXL345: address =Nonedef__init__(self,address=0x53): self.address = address self.setBandwidthRate(BW_RATE_100HZ) self.setRange(RANGE_2G) self.enableMeasurement()defenableMeasurement(self): bus.write_byte_data(self.address, POWER_CTL, MEASURE)defsetBandwidthRate(self,rate_flag): bus.write_byte_data(self.address, BW_RATE, rate_flag)# set the measurement range for 10-bit readingsdefsetRange(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 gsdefgetAxes(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_MULTIPLIERif 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}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)print"ADXL345 on address 0x%x:"% (adxl345.address)print" x = %.3fG"% ( axes['x'] )print" y = %.3fG"% ( axes['y'] )print" z = %.3fG"% ( axes['z'] )
5.Run the demo.
sudo python grove_tilt_switch.py
With Beaglebone Green
To begin editing programs that live on BBG, you can use the Cloud9 IDE. As a simple exercise to become familiar with Cloud9 IDE, creating a simple application to blink one of the 4 user programmable LEDs on the BeagleBone is a good start.
If this is your first time to use Cloud9 IDE, please follow this link.
Step1: Set the Grove - UART socket as a Grove - GPIO Socket, just follow this link.
Step2: Click the "+" in the top-right to create a new file.
Step3: Copy and paste the following code into the new tab.
import smbusimport timebus = smbus.SMBus(1)# ADXL345 device addressADXL345_DEVICE =0x53# ADXL345 constantsEARTH_GRAVITY_MS2 =9.80665SCALE_MULTIPLIER =0.004DATA_FORMAT =0x31BW_RATE =0x2CPOWER_CTL =0x2DBW_RATE_1600HZ =0x0FBW_RATE_800HZ =0x0EBW_RATE_400HZ =0x0DBW_RATE_200HZ =0x0CBW_RATE_100HZ =0x0BBW_RATE_50HZ =0x0ABW_RATE_25HZ =0x09RANGE_2G =0x00RANGE_4G =0x01RANGE_8G =0x02RANGE_16G =0x03MEASURE =0x08AXES_DATA =0x32classADXL345: address =Nonedef__init__(self,address= ADXL345_DEVICE): self.address = address self.setBandwidthRate(BW_RATE_100HZ) self.setRange(RANGE_2G) self.enableMeasurement()defenableMeasurement(self): bus.write_byte_data(self.address, POWER_CTL, MEASURE)defsetBandwidthRate(self,rate_flag): bus.write_byte_data(self.address, BW_RATE, rate_flag)# set the measurement range for 10-bit readingsdefsetRange(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 gsdefgetAxes(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_MULTIPLIERif 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}if__name__=="__main__":# if run directly we'll just create an instance of the class and output# the current readings adxl345 =ADXL345()whileTrue: axes = adxl345.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'] ) time.sleep(2)
Step4: Save the file by clicking the disk icon with with the .py extension..
Step5: Connect Grove - 3-Axis Digital Accelerometer(±16g) to Grove I2C socket on BBG.
Step6: Run the code. You'll sfind that the terminal outputs Gravity info every 2 seconds.