1. 程式人生 > >Arduino學習筆記二三軸加速度感測器ADXL345

Arduino學習筆記二三軸加速度感測器ADXL345

很早就聽說Arduino,早就想玩了。最近搞了快Arduino板子,就是前面介紹的Arduino Leonardo,最近需要用到感測器,從三軸加速度ADXL345開始。

開發環境:
系統:XP
單板:Arduino Leonardo
平臺:Arduino-1.5.2

目標:讀三軸加速度ADXL345的原始資料,並通過串列埠顯示

一、硬體介紹

ADXL345是一款小而薄的超低功耗3 軸加速度計,解析度高(13位),測量範圍達±  16g 。數字輸出資料為16 位二進位制補碼格式,可通過SPI(3線或4線)或I2C數字介面訪問。ADXL345非常適合移動裝置應用。它可以在傾斜檢測應用中測量靜態重力加速度,還可以測量運動或衝擊導致的動態加速度。其高解析度(3.9mg/LSB),能夠測量不到1.0° 的
傾斜角度變化。ADXL345模組原理圖如下:

這裡只用到SCL、SDA、VCC_3.3V、GND分別連線到Arduino的對應介面上。Arduino Leonardo上直接標有SDA、SCL連上即可,其它Arduino根據自己的板子連線。

二、編寫測試程式碼

其實在Arduino上寫程式碼非常簡單,很多庫都幫你做好了,直接呼叫即可,十分方便。但Arduino的版本很多,特別是Arduino-1.0以後,有些庫有所改變,需要看對應版本的參考手冊arduino-1.5.2-windows\arduino-1.5.2\reference下面有詳細說明,我也是結合網上找的程式參考這些修改。程式碼如下

檔案adx1345.ino

#include <Wire.h>

#define Register_ID 0
#define Register_2D 0x2D
#define Register_X0 0x32
#define Register_X1 0x33
#define Register_Y0 0x34
#define Register_Y1 0x35
#define Register_Z0 0x36
#define Register_Z1 0x37

int ADXAddress = 0xA7 >> 1;  // the default 7-bit slave address
int reading = 0;
int val=0;
int X0,X1,X_out;
int Y0,Y1,Y_out;
int Z1,Z0,Z_out;
double Xg,Yg,Zg;

void setup()
{
  Wire.begin();                
  Serial.begin(9600);    
  delay(100);
  // enable to measute g data
  Wire.beginTransmission(ADXAddress);
  Wire.write(Register_2D);
  Wire.write(8);                //measuring enable
  Wire.endTransmission();     // stop transmitting

}

void loop()
{
  //--------------X
  Wire.beginTransmission(ADXAddress); // transmit to device
  Wire.write(Register_X0);
  Wire.write(Register_X1);
  Wire.endTransmission();
  Wire.requestFrom(ADXAddress,2); 
  if(Wire.available()<=2)   
  {
    X0 = Wire.read();
    X1 = Wire.read(); 
    X1=X1<<8;
    X_out=X0+X1;   
  }

  //------------------Y
  Wire.beginTransmission(ADXAddress); // transmit to device
  Wire.write(Register_Y0);
  Wire.write(Register_Y1);
  Wire.endTransmission();
  Wire.requestFrom(ADXAddress,2); 
  if(Wire.available()<=2)   
  {
    Y0 = Wire.read();
    Y1 = Wire.read(); 
    Y1=Y1<<8;
    Y_out=Y0+Y1;
  }
  //------------------Z
  Wire.beginTransmission(ADXAddress); // transmit to device
  Wire.write(Register_Z0);
  Wire.write(Register_Z1);
  Wire.endTransmission();
  Wire.requestFrom(ADXAddress,2); 
  if(Wire.available()<=2)   
  {
    Z0 = Wire.read();
    Z1 = Wire.read(); 
    Z1=Z1<<8;
    Z_out=Z0+Z1;
  }
  /*
  //display the real value
  Xg=X_out/256.0;
  Yg=Y_out/256.0;
  Zg=Z_out/256.0;
  */
  //display the reading value
  Xg=X_out;
  Yg=Y_out;
  Zg=Z_out;
  Serial.print("X= ");
  Serial.print(Xg);
  Serial.print("       ");
  Serial.print("Y= ");
  Serial.print(Yg);
  Serial.print("       ");
  Serial.print("Z= ");
  Serial.print(Zg);
  Serial.println("  ");
  delay(200);
}

需要對著手冊操作,根據手冊上介紹的暫存器設定、讀寫。暫存器FORMAT-OX31使用預設值0x0,設定加速度範圍-2g~2g,根據手冊

我們設定的取樣範圍-2g~2g,根據手冊知道我們的加速度感測器取樣值最大範圍 -282~282,其中存在偏差。10位解析度,取樣範圍-2g~2g,則1024/(2g-(-2g))=256LSB/g,也就是說理想值是256對應2g的加速度,呆會測試時水平放置時,讀到垂直方向的值應該是128,對應重力加速度1g.開始測試,看是不是這樣

3.編譯、測試

Arduino還是很方便操作的,選擇好單板、參考,直接點上面的“對勾”就開始編譯,編譯沒問題,點“->”箭頭狀的,開始上傳程式,直至上傳進度條完成。

接著開啟Tools/Serial Monitor 顯示如下:

這是水平放的,Z方向垂直加速度。不是很平

這是X方向,向X方向舉起

這是向Y方向,其實模組後面有個座標軸,朝座標方向測試。

基本正常,但是這些資料還不能直接拿來用,還要進一步優化,以後會結合卡爾曼濾波等演算法優化。