Application - BMA250, triaxial acceleration sensor

出自 flip the world
於 2018年8月23日 (四) 11:14 由 Tommy (對話 | 貢獻) 所做的修訂 (已建立頁面,內容為 "== example code == <pre> #include "Wire.h" byte range=0x03; float divi=16; int addr = 0x18; void setup() { Serial.begin(115200); Wire.begin(); Wire.beginTr…")
(差異) ←上個修訂 | 最新修訂 (差異) | 下個修訂→ (差異)
前往: 導覽搜尋

example code

#include "Wire.h"
byte range=0x03;
float divi=16;
int addr = 0x18;
void setup() 
{ 
  Serial.begin(115200); 
  Wire.begin(); 
  Wire.beginTransmission(addr); // address of the accelerometer 

  // Start I2C Transmission
  Wire.beginTransmission(addr);
  // Select range selection register
  Wire.write(0x0F);
  // Set range +/- 2g
  Wire.write(0x03);
  // Stop I2C Transmission
  Wire.endTransmission();

  // Start I2C Transmission
  Wire.beginTransmission(addr);
  // Select bandwidth register
  Wire.write(0x10);
  // Set bandwidth 7.81 Hz
  Wire.write(0x10);
  // Stop I2C Transmission
  Wire.endTransmission();
  
  // low pass filter  
  Wire.beginTransmission(addr);
  Wire.write(0x20); //register address
  Wire.write(0x05); //can be set at"0x05""0x04"......"0x01""0x00", refer to Datashhet on wiki
  Wire.endTransmission();

} 

void AccelerometerInit()
{
   unsigned int data[0];
  // Start I2C Transmission
  Wire.beginTransmission(addr);
  // Select Data Registers (0x02 − 0x07)
  Wire.write(0x02);
  // Stop I2C Transmission
  Wire.endTransmission();
  
  // Request 6 bytes 
  Wire.requestFrom(addr, 6);
  // Read the six bytes 
  // xAccl lsb, xAccl msb, yAccl lsb, yAccl msb, zAccl lsb, zAccl msb

  while(!Wire.available())
    ;

  data[0] = Wire.read();
  data[1] = Wire.read();
  data[2] = Wire.read();
  data[3] = Wire.read();
  data[4] = Wire.read();
  data[5] = Wire.read();

  delay(10);

  // Convert the data to 10 bits
  float xAccl = ((data[1] * 256.0) + (data[0] & 0xC0)) / 64;
  if (xAccl > 511)
  {
    xAccl -= 1024;
  }
  float yAccl = ((data[3] * 256.0) + (data[2] & 0xC0)) / 64;
  if (yAccl > 511)
  {
    yAccl -= 1024;
  }
  float zAccl = ((data[5] * 256.0) + (data[4] & 0xC0)) / 64;
  if (zAccl > 511)
  {
    zAccl -= 1024;
  }

    // Output data to the serial monitor
  Serial.print("X-Axis :");
  Serial.print(xAccl);
  Serial.print("  ");
  Serial.print("Y-Axis :");
  Serial.print(yAccl);
  Serial.print("  ");
  Serial.print("Z-Axis :");
  Serial.println(zAccl);
}
  
void loop() 
{ 
  /*
  switch(range)  //change the data dealing method based on the range u've set
  {
  case 0x00:divi=16;  break;
  case 0x01:divi=8;  break;
  case 0x02:divi=4;  break;
  case 0x03:divi=2;  break;
  default: Serial.println("range setting is Wrong,range:from 0to 3.Please check!");while(1); 
  }
  */
  AccelerometerInit(); 
}