“(SKU:RB-02S037)ADXL345 三軸加速度計”的版本間的差異

來自ALSROBOT WiKi
跳轉至: 導航搜索
?相關推薦
?例子程序
第40行: 第40行:
 
==例子程序==
 
==例子程序==
 
<pre style="color:blue">
 
<pre style="color:blue">
?
 
 
#include <Wire.h>
 
#include <Wire.h>
?
+
#define ADXLAddress (0x53)     //ADXL345的I2C地址(ADDR接地)
?
#define DEVICE (0x53)   //ADXL345 device address
+
int xAcc,  yAcc,  zAcc;      // 存放加速度值
?
#define TO_READ (6)        //num of bytes we are going to read each time (two bytes for each axis)
+
int buff[6];                 //存放寄存器高低位值,X、Y、Z軸共6個
?
+
// 加速度傳感器誤差修正的偏移量
?
byte buff[TO_READ] ;   //6 bytes buffer for saving data read from the device
+
int a_offx = 0;
?
char str[512];                      //string buffer to transform data before sending it to the serial port
+
int a_offy = 0;
?
   
+
int a_offz = 0;
?
void setup()
+
void writeRegister(int deviceAddress, byte address, byte val)
 +
  {
 +
  Wire.beginTransmission(deviceAddress);
 +
  Wire.write(address);     
 +
  Wire.write(val);       
 +
  Wire.endTransmission();
 +
}
 +
void readRegister(int deviceAddress, byte address)  
 
{
 
{
?
   Wire.begin();       // join i2c bus (address optional for master)
+
   Wire.beginTransmission(deviceAddress);
?
   Serial.begin(9600); // start serial for output
+
  Wire.write(address);       
?
+
   Wire.endTransmission();  
?
   //Turning on the ADXL345
+
   Wire.beginTransmission(deviceAddress);
?
   writeTo(DEVICE, 0x2D, 0);    
+
   Wire.requestFrom(deviceAddress, 6);  
?
   writeTo(DEVICE, 0x2D, 16);
+
   int i = 0;
?
   writeTo(DEVICE, 0x2D, 8);
+
  while(Wire.available())   
 +
  {  buff[i++] = Wire.read(); }
 +
   Wire.endTransmission();  
 
}
 
}
?
+
void initAcc()  
?
void loop()
+
 
{
 
{
?
   int regAddress = 0x32;    //first axis-acceleration-data register on the ADXL345
+
   //配置ADXL345,ADXL345采用默認的+-2g量程,10位分辨率
?
  int x, y, z;
+
writeRegister (ADXLAddress, 0x2C, 0x09);//設置輸出數(shù)據(jù)速率50Hz,帶寬25Hz。
?
+
//默認值為0x0A,對應輸出數(shù)據(jù)速率100Hz,帶寬50Hz
?
  readFrom(DEVICE, regAddress, TO_READ, buff); //read the acceleration data from the ADXL345
+
writeRegister (ADXLAddress, 0x2D, 0x08); //設置ADXL345為測量模式。
?
+
  }
?
   //each axis reading comes in 10 bit resolution, ie 2 bytes. Least Significat Byte first!!
+
void getAccData()
?
   //thus we are converting both bytes in to one int
+
{
?
  x = (((int)buff[1]) << 8) | buff[0];   
+
   readRegister(ADXLAddress, 0x32);  
?
   y = (((int)buff[3])<< 8) | buff[2];
+
   xAcc = ((buff[1] << 8) | buff[0] )+ a_offx;   
?
   z = (((int)buff[5]) << 8) | buff[4];
+
   yAcc = ((buff[3] << 8) | buff[2] )+ a_offy;
?
+
   zAcc = ((buff[5] << 8) | buff[4]) + a_offz;
?
  //we send the x y z values as a string to the serial port
+
}
?
  sprintf(str, "%d %d %d", x, y, z)
+
void setup()
?
   Serial.print(str);
+
{
?
   Serial.write(10);
+
   Serial.begin(9600);
?
+
   Wire.begin();
?
   //It appears that delay is needed in order not to clog the port
+
   initAcc();
 
   delay(50);
 
   delay(50);
 
}
 
}
?
+
void loop()
?
//---------------- Functions
+
{
?
//Writes val to address register on device
+
    getAccData();
?
void writeTo(int device, byte address, byte val) {
+
    Serial.print("xAcc=");
?
  Wire.beginTransmission(device); //start transmission to device
+
    Serial.print(xAcc);
?
  Wire.write(address);       // send register address
+
    Serial.print(" yAcc=");
?
  Wire.write(val);       // send value to write
+
    Serial.print(yAcc);
?
  Wire.endTransmission(); //end transmission
+
     Serial.print(" zAcc=");
?
}
+
     Serial.println(zAcc);
?
   
+
  delay(200);
?
//reads num bytes starting from address register on device in to buff array
+
?
void readFrom(int device, byte address, int num, byte buff[]) {
+
?
  Wire.beginTransmission(device); //start transmission to device
+
?
  Wire.write(address);       //sends address to read from
+
?
  Wire.endTransmission(); //end transmission
+
?
+
?
     Wire.beginTransmission(device); //start transmission to device
+
?
  Wire.requestFrom(device, num);    // request 6 bytes from device
+
?
   
+
?
  int i = 0;
+
?
  while(Wire.available())    //device may send less than requested (abnormal)
+
?
  {
+
?
     buff[i] = Wire.read(); // receive a byte
+
?
    i++;
+
?
  }
+
?
  Wire.endTransmission(); //end transmission
+
 
}
 
}
?
 
 
</pre>
 
</pre>
  

2015年9月30日 (三) 10:35的版本


02s03702.jpg

目錄

產品概述

ADXL345 數(shù)字三軸加速度計是一款小而薄的超低功耗3軸加速度計,分辨率高達(13位),測量范圍達± 16g。數(shù)字輸出數(shù)據(jù)為16位二進制補碼格式,可通過SPI(3線或4線)或I2C數(shù)字接口訪問。ADXL345非常適合移動設備應用。它可以在傾斜檢測應用中測量靜態(tài)重力加速度,還可以測量運動或沖擊導致的動態(tài)加速度。其高分辨率(3.9mg/LSB),能夠測量不到1.0°的傾斜角度變化。該器件提供多種特殊檢測功能?;顒雍头腔顒訖z測功能通過比較任意軸上的加速度與用戶設置的閾值來檢測有無運動發(fā)生。敲擊檢測功能可以檢測任意方向的單振和雙振動作。自由落體檢測功能可以檢測器件是否正在掉落。這些功能可以獨立映射到兩個中斷輸出引腳中的一個。正在申請專利的集成式存儲器管理系統(tǒng)采用一個32級先進先出(FIFO)緩沖器,可用于存儲數(shù)據(jù),從而將主機處理器負荷降至最低,并降低整體系統(tǒng)功耗。低功耗模式支持基于運動的智能電源管理,從而以極低的功耗進行閾值感測和運動加速度測量。

規(guī)格參數(shù)

  1. 工作電壓:3.3-5v
  2. 超低功耗:測量模式下40uA電流損耗,待機模式下0.1uA@2.5v
  3. 通訊接口:I2C、SPI(3線or4線)
  4. 接口類型:0.1"插針孔

接線方法

ADXL345 Arduino
VCC 3V3
GND GND
CS 3V3
SDO GND
SDA A4
SCL A5


實物接線圖:

Adxl345jiexian.jpg

例子程序

#include <Wire.h>
#define ADXLAddress (0x53)     //ADXL345的I2C地址(ADDR接地)
int xAcc,  yAcc,  zAcc;       // 存放加速度值
int buff[6];                  //存放寄存器高低位值,X、Y、Z軸共6個
// 加速度傳感器誤差修正的偏移量
int a_offx = 0;
int a_offy = 0;
int a_offz = 0;
void writeRegister(int deviceAddress, byte address, byte val)
 {
  Wire.beginTransmission(deviceAddress); 
  Wire.write(address);       
  Wire.write(val);        
  Wire.endTransmission();
} 
void readRegister(int deviceAddress, byte address) 
{
  Wire.beginTransmission(deviceAddress);  
  Wire.write(address);        
  Wire.endTransmission(); 
  Wire.beginTransmission(deviceAddress); 
  Wire.requestFrom(deviceAddress, 6);   
  int i = 0;
  while(Wire.available())    
  {  buff[i++] = Wire.read();  }
  Wire.endTransmission(); 
}
void initAcc() 
{
  //配置ADXL345,ADXL345采用默認的+-2g量程,10位分辨率
writeRegister (ADXLAddress, 0x2C, 0x09);//設置輸出數(shù)據(jù)速率50Hz,帶寬25Hz。
//默認值為0x0A,對應輸出數(shù)據(jù)速率100Hz,帶寬50Hz
writeRegister (ADXLAddress, 0x2D, 0x08);  //設置ADXL345為測量模式。
  } 
void getAccData()
{
  readRegister(ADXLAddress, 0x32);  
  xAcc = ((buff[1] << 8) | buff[0] )+ a_offx;   
  yAcc = ((buff[3] << 8) | buff[2] )+ a_offy;
  zAcc = ((buff[5] << 8) | buff[4]) + a_offz;
}
void setup()
{
  Serial.begin(9600);
  Wire.begin();
  initAcc();
  delay(50);
}
void loop()
{
    getAccData();
    Serial.print("xAcc=");
    Serial.print(xAcc);
    Serial.print("  yAcc=");
    Serial.print(yAcc);
    Serial.print("  zAcc=");
    Serial.println(zAcc);
   delay(200);
}

產品相關推薦

Erweima.png

產品購買地址

Arduino ADXL345 三軸加速度計

周邊產品推薦

Carduino UNO R3 控制器
V5.0傳感器擴展板

相關問題解答

如何使用stm8s103f3單片機控制adxl345三軸加速度傳感器

相關學習資料

視頻: AS-4WD輪式機器人三軸加速度計操控功能演示
視頻:Arduino ADXL345 三軸加速度計
奧松機器人技術論壇