Raspberry Pi and BMA250 acceleration sensor java example

The BMA250E is an advanced, ultra-small, triaxial, low-g acceleration sensor with digital interfaces, aiming for low-power consumer electronics applications. Featuring 10 bit digital resolution, the BMA250E allows low-noise measurement of accelerations in 3 perpendicular axes.

A typical module

technical Information

Parameter Technical data
Digital resolution 10 bit
Resolution
(in ±2g range)
3.9 mg
Measurement ranges
(programmable)
±2 g, ±4 g, ±8 g, ±16 g
Sensitivity (calibrated) ±2 g: 256 LSB/g
±4 g: 128 LSB/g
±8 g: 64 LSB/g
±16 g: 32 LSB/g
Zero-g offset (typ., over life-time) ±80 mg
Noise density (typ.) 400 μg/√Hz
Bandwidths (programmable) 1000 Hz … 8 Hz
Digital inputs/outputs SPI & I²C, 2x digital interrupt pins
Supply voltage (VDD) 1.62 V … 3.6 V
I/0 supply voltage (VDDIO) 1.2 V … 3.6 V
Temperature range -40 … +85°C
Current consumption
– full operation
– low-power mode
130 μA (@ 2 kHz data rate)
6.5 μA (@ 40 Hz data rate)
LGA package 2 x 2 x 0.95 mm³
Interrupts – Data-ready (e. g. for processor synchronization)
– Any-motion (slope) detection (e. g. for wake-up)
– Tap sensing (e. g. for tap-sensitive UI control)
– Orientation change recognition (e. g. for portrait/landscape switching)
– Flat detection (e. g. for position sensitive switching)
– Low-g / high-g detection (e. g. for shock and free-fall detection)
– No-motion (e.g. for power saving)

 

Connection

Raspberry PI Module
3.3v Vcc
Gnd Gnd
SDA SDA
SCL SCL

 

Code

This time we explore the world of Java on the Raspberry Pi

First you need to install PI4j – http://pi4j.com/install.html . I’ll sum it up as its easy to install from a terminal

The simplest method to install Pi4J on your RaspberryPi is to execute the following command directly on your RaspberryPi.
curl -s get.pi4j.com | sudo bash

Now for the java code – this is courtesy of a controleverything example, I had to change the I2C address for my module

// Distributed with a free-will license.
// Use it any way you want, profit or free, provided it fits in the licenses of its associated works.
// BMA250
// This code is designed to work with the BMA250_I2CS I2C Mini Module available from ControlEverything.com.
// https://www.controleverything.com/content/Accelorometer?sku=BMA250_I2CS#tabs-0-product_tabset-2
 
import com.pi4j.io.i2c.I2CBus;
import com.pi4j.io.i2c.I2CDevice;
import com.pi4j.io.i2c.I2CFactory;
import java.io.IOException;
 
public class BMA250
{
	public static void main(String args[]) throws Exception
	{
		// Create I2C bus
		I2CBus bus = I2CFactory.getInstance(I2CBus.BUS_1);
		// Get I2C device, BMA250 I2C address is 0x19(25)
		I2CDevice device = bus.getDevice(0x19);
 
		// Select range selection register
		// Set range +/- 2g
		device.write(0x0F, (byte)0x03);
		// Select bandwidth register
		// Bandwidth = 7.81 Hz
		device.write(0x10, (byte)0x08);
		Thread.sleep(500);
 
		// Read 6 bytes of data from address 0x02(02)
		// xAccl lsb, xAccl msb, yAccl lsb, yAccl msb, zAccl lsb, zAccl msb
		byte[] data = new byte[6];
		device.read(0x02, data, 0, 6);
 
		// Convert the data to 10-bits
		int xAccl = (((data[1] & 0xFF) * 256) + (data[0] & 0xC0)) / 64;
		if(xAccl > 511)
		{
			xAccl -= 1024;
		}
 
		int yAccl = (((data[3] & 0xFF) * 256) + (data[2] & 0xC0)) / 64;
		if(yAccl > 511)
		{
			yAccl -= 1024;
		}
 
		int zAccl = (((data[5] & 0xFF) * 256) + (data[4] & 0xC0)) / 64;
		if(zAccl > 511)
		{
			zAccl -= 1024;
		}
 
		// Output data to screen
		System.out.printf("Acceleration in X-Axis : %d %n", xAccl);
		System.out.printf("Acceleration in Y-Axis : %d %n", yAccl);
		System.out.printf("Acceleration in Z-Axis : %d %n", zAccl);
	}
}

 

Now you have to compile and run the program like this

$> sudo pi4j BMA250.java

Testing

You should see the following

Link

CJMCU-250E BMA250E low g three axis accelerometer sensor module MEMS