Using Raspberry Pi 0 and the Bosch 220 Accelerometer by Ty Harness Mar. 2017
BMA220 Acceleration logger using the Raspberry Pi 0.

http://pi4j.com/
http://wiringpi.com/
https://thepihut.com/products/triple-axis-accelerometer-bma220-tiny


//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;
        
    }  
  
  
}