//Bosch BMA220 -- Raspberry Pi //3.3V -- 3.3V pin1 //GND -- GND pin 9 //SDA -- SDA pin 2 GPIO 8 //SCK -- SCK pin 5 GPIO 9 //INT -- (Haven't wired it up as yet) //Raspberry Pi Raspbian OS - Oracle Java is installed by default. //java -version //javac - version //Install Pi4j : http://pi4j.com/ //GH's WiringPi is automatically installed: http://wiringpi.com/reference/i2c-library/ //i2cdetect -y 1 //https://www.dfrobot.com/product-1085.html //BMA220 board by DFRobot - Slave Address 0x0A //https://thepihut.com/products/triple-axis-accelerometer-bma220-tiny //To compile and run //pi4j -c Pi4jBMA220.java //pi4j -r Pi4jBMA220 //Heavily copied from the I2CExample.java from pi4j examples. //It's not robust coding just and example to get you going with I2C and the Bosch BMA220 Accelerometer. //Have fun, Ty Harness March 2017 import java.io.IOException; import com.pi4j.io.i2c.I2CBus; import com.pi4j.io.i2c.I2CDevice; import com.pi4j.io.i2c.I2CFactory; import com.pi4j.io.i2c.I2CFactory.UnsupportedBusNumberException; import com.pi4j.platform.PlatformAlreadyAssignedException; public class Pi4jBMA220 { private static final int BMA220_ADDR = 0x0A; private static final int Chip_REG = 0x0; //8 bit read only private static final int REV_REG = 0x2; //8 bit read only default 0x00 private static final int X_REG = 0x4; //6 bit read only private static final int Y_REG = 0x6; //6 bit read only private static final int Z_REG = 0x8; //6 bit read only private static final int _A_REG = 0xA; //high_hy[1:0] high_dur[5:0] default 0x7F private static final int _C_REG = 0xC; //low_th[3:0] high_th[3:0] default private static final int _E_REG = 0xE; //low_hy[1:0] low_dur[5:0] default private static final int _10_REG = 0x10; // private static final int _12_REG = 0x12; // private static final int _14_REG = 0x14; // private static final int _16_REG = 0x16; // private static final int _18_REG = 0x18; // private static final int _1A_REG = 0x1A; // private static final int _1C_REG = 0x1C; //reset interrupt write only private static final int _1E_REG = 0x1E; // private static final int FILTER_REG = 0x20; //bit 0, bit 1, bit 2 private static final int RANGE_REG = 0x22; //bit 0 and bit 1 //private static final int _24_REG = 0x24; //reserved //private static final int _26_REG = 0x26; //reserved //private static final int _28_REG = 0x28; //reserved //private static final int _2A_REG = 0x2A; //reserved //private static final int _2C_REG = 0x2C; //reserved //private static final int _23_REG = 0x2E; //3 bits //private static final int _30_REG = 0x30; //Suspend //private static final int _32_REG = 0x32; //Soft Reset public static void main(String[] args) throws InterruptedException, PlatformAlreadyAssignedException, IOException, UnsupportedBusNumberException{ int RangeMode = 0; int Xdata; int Ydata; int Zdata; System.out.println("BMA220 Triaxial Accelerometer Pi4j Java Test Program (T Harness March 2017) "); try { I2CBus i2c = I2CFactory.getInstance(I2CBus.BUS_1); I2CDevice mDevice = i2c.getDevice(BMA220_ADDR); //reset interrupt settings //mDevice.write(_1C_REG, (byte) 0x00); //poke only System.out.println("I2C Register: Default Data "); int ChipID = mDevice.read(Chip_REG); System.out.println("_00_REG_ChipID: " + Integer.toHexString(ChipID) ); //Acceleration data Xdata = mDevice.read(X_REG); //peek System.out.println("_04_REG Xdata: " + Xdata + " " + Integer.toBinaryString(Xdata) + ", " + (Xdata >> 2) + ", " + realData(Xdata,RangeMode) + " [m/s^2] " ); Ydata = mDevice.read(Y_REG); //peek System.out.println("_06_REG Ydata: " + Ydata + " " + Integer.toBinaryString(Ydata) + ", " + (Ydata >> 2) + ", " + realData(Ydata,RangeMode) + " [m/s^2] " ); Zdata = mDevice.read(Z_REG); //peek System.out.println("_08_REG Zdata: " + Zdata + " " + Integer.toBinaryString(Zdata) + ", " + (Zdata >> 2) + ", " + realData(Zdata,RangeMode) + " [m/s^2] " ); System.out.println("_0A_REG Default: " + Integer.toHexString(mDevice.read(_A_REG))); System.out.println("_0C_REG Default: " + Integer.toHexString(mDevice.read(_C_REG))); System.out.println("_0E_REG Default: " + Integer.toHexString(mDevice.read(_E_REG))); System.out.println("_10_REG Default: " + Integer.toHexString(mDevice.read(_10_REG))); System.out.println("_12_REG Default: " + Integer.toHexString(mDevice.read(_12_REG))); System.out.println("_14_REG Default: " + Integer.toHexString(mDevice.read(_14_REG))); System.out.println("_16_REG Default: " + Integer.toHexString(mDevice.read(_16_REG))); System.out.println("_18_REG default: " + Integer.toHexString(mDevice.read(_18_REG))); System.out.println("_1A_REG Default: " + Integer.toHexString(mDevice.read(_1A_REG))); System.out.println("_1C_REG Default: " + Integer.toHexString(mDevice.read(_1C_REG))); System.out.println("_1E_REG Default: " + Integer.toHexString(mDevice.read(_1E_REG))); System.out.println("_20_FILTER_REG Default: "+ Integer.toBinaryString(mDevice.read(FILTER_REG))); System.out.println("_22_Range REG Default: " + Integer.toBinaryString(mDevice.read(RANGE_REG))); mDevice.write(FILTER_REG, setFilter(0)); System.out.println( "_20_FILTER_REG written: "+ Integer.toBinaryString( mDevice.read(FILTER_REG))); mDevice.write(RANGE_REG, setRange(RangeMode)); System.out.println( "_22_Range REG Written : " + Integer.toBinaryString(mDevice.read(RANGE_REG))); //main loop try{ for (;;) { Thread.sleep(500); //get the acceleration data Xdata = mDevice.read(X_REG); //peek Ydata = mDevice.read(Y_REG); //peek Zdata = mDevice.read(Z_REG); //peek System.out.println( "Acceleration XYZ[m/s^2] " + realData(Xdata,RangeMode) + ", " + realData(Ydata,RangeMode) + ", " + realData(Zdata,RangeMode) ); } }catch (InterruptedException e1){ System.out.println("error in the main loop " + e1); } } catch (IOException e) { System.out.println("error " + e); } } private static double realData(int data, int mode){ double x; double slope = 0.0625;// 1.94/31; sensitivity +/- 2g range double nfactor = 1; double d; int dat; if (mode == 1) slope = 0.125; // sensitivity +/- 4g range if (mode == 2) slope = 0.25; // sensitivity +/- 8g range if (mode == 3) slope = 0.5; // sensitivity +/- 16g range data = data >> 2; if (data > 31){ //MSB represents a negative number dat = ~data + 1; //2s compliment make it negative dat = dat & 0b011111;//bit mask anded to make positive nfactor = -1; }else { dat = data; } d = (double) dat; x = d*slope*9.81*nfactor; return x; } private static byte setFilter(int mode){ //Reg 0x20 default 0x00 //Filter Config bit 2 bit 1 bit 0, //bit6, bit5, bit4,bit 3 //serial high bw bit 7 //mode 0 default 0x00 byte F = 0x00; //1kHz if (mode == 1)F = 0x01;// 500Hz if (mode == 2)F = 0x02;// 250Hz if (mode == 3)F = 0x03;// 125Hz if (mode == 4)F = 0x04;// 64Hz if (mode == 5)F = 0x05;// 32Hz return F; } private static byte setRange(int mode){ //Reg 0x22 default 0x00 //Range bit 0, bit 1 //sbist (off,x,y,z) bit 2 and 3 self test //sbist sign bit 4 selftest byte R = 0x00; //+/- 2g if (mode == 1)R = 0x01;// +/- 4g if (mode == 2)R = 0x02;// +/- 8g if (mode == 3)R = 0x03;// +/- 16g return R; } }