逆引きIoT‎ > ‎

202. ADXL345

ADXL345とは

ADXL345は小型、薄型、低消費電力の3軸加速度センサーで、最大±gの測定範囲で高分解能(13ビット)の加速度計測が可能です。デジタル出力データは16ビットの「2の補数」フォーマットで、SPI(3または4線)あるいはI2Cのデジタル・インターフェースを介してアクセスできます。

SPI接続

今回は4線接続で説明します。


SPIの設定
下記表の通りなので、Arduinoでは
SPI.setDataMode(SPI_MODE3);
SPI.setBitOrder(MSBFIRST);
を設定します。

レジスタ設定
POWER_CTL
測定モードにしたいのでD3のビットを立てて0x08を設定します。

DATA_FORMAT
FULL_RESを0に設定すると分解能が10ビットモードになります。
Rangeを下記にそって±16gに設定します。重力加速度の測定範囲が上下16gとなります。
すると±16gの範囲を10ビットで表現するので(16*2/10bit)なので1LSBあたり0.03125gとなります。
FULL_RESを1に設定すると分解能は可変となり1LSBの加速度は4mgに調整されます。


データ書き込み時の信号

データ読み込み時の信号
データ信号はR/Wビット、MB(マルチバイトフラグ)、レジスタアドレスの順になっています。
読み込み時はR/Wビットを立てて、データが複数バイト存在する場合はMBを立てます。



Arduinoとの接続



サンプルソース

#include <SPI.h>

//ADXL345 レジスタアドレス
#define BW_RATE     0x2C    //Data rate and power mode control
#define POWER_CTL   0x2D    //Power Control Register
#define DATA_FORMAT 0x31    //Data format control
#define DATAX0      0x32    //X-Axis Data 0
 
char values[10];
int x,y,z;
double xg, yg, zg;
 
void setup() {
  // SPIの初期化
  SPI.begin();
  SPI.setDataMode(SPI_MODE3);
  SPI.setBitOrder(MSBFIRST);
  
  // ログ出力シリアル通信初期化
  Serial.begin(9600);
  
  // SSをHightに
  pinMode(SS, OUTPUT);
  digitalWrite(SS, HIGH);
   
  // ADXL345初期化
  writeRegister(DATA_FORMAT, 0x03); // ±16g 10bit
  writeRegister(POWER_CTL, 0x08);  // 測定モード
}

void loop() {
  // DATAX0レジスタから6バイトを取得
  readRegister(DATAX0, 6, values);
  
  // 2Byteのデータを再構成
  x  = ((int)values[1]<<8)|(int)values[0];
  y  = ((int)values[3]<<8)|(int)values[2];
  z  = ((int)values[5]<<8)|(int)values[4];
   
  // 0.03125 = (16*2)/(2^10)
  xg = x * 0.03125;
  yg = y * 0.03125;
  zg = z * 0.03125;
  
  // ログ出力
  Serial.print(xg);
  Serial.print("\t");
  Serial.print(yg);
  Serial.print("\t");
  Serial.println(zg);
}

void writeRegister(char registerAddress, char value) {
 // SPI開始時にSSをLOWにする
 digitalWrite(SS, LOW);
 // レジスタアドレス送信
 SPI.transfer(registerAddress);
 // レジスタに設定する値送信
 SPI.transfer(value);
 // SPI終了時にCSをHIGHにする
 digitalWrite(SS, HIGH);
}

void readRegister(char registerAddress, int numBytes, char * values) {
 // 書き込みフラグを立てる
 char address = 0x80 | registerAddress;
 // 複数バイトフラグを立てる
 if(numBytes > 1)address = address | 0x40;
 // SPI開始時にSSをLOWにする
 digitalWrite(SS, LOW);
 // 読み出し先レジスタのアドレスを送信
 SPI.transfer(address);
 // 値の読み出し
 for(int i=0; i<numBytes; i++) {
   values[i] = SPI.transfer(0x00);
 }
 // SPI終了時にCSをHIGHにする
 digitalWrite(SS, HIGH);
}


データシート
コメント