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方向,其實模組後面有個座標軸,朝座標方向測試。
基本正常,但是這些資料還不能直接拿來用,還要進一步優化,以後會結合卡爾曼濾波等演算法優化。