逆引きIoT‎ > ‎

306. ADXL345(I2C)



注意点


ADXL345のデータシート

データシートより

データシートより

CSをVDDに接続するとI2Cモードになる。
また、アドレスは、SDOのPINをHighにすると0x1D, Lowにすると0x53でアクセスできるようになる。

配線図


I2C通信


上記の配線図では、SDOをGNDにつなぎLowにしているので、アクセスのためのアドレスは、0x53になる。

I2Cデバイスにアクセスするには、レジスターのアドレスを指定して、書き込み/読み込みを行う。

レジスターへの書き込み
Wire.beginTransmission(スレーブデバイスのアドレス); // スレーブデバイスのアドレスを指定 
Wire.write(レジスターのアドレス);     // レジスターのアドレスを指定
Wire.write(値);              // 値を書き込み
Wire.endTransmission();      // Transmissionの終了

レジスターからの読み込み
// 読み込みしたいレジスターアドレスを書き込み
Wire.beginTransmission(スレーブデバイスのアドレス); // スレーブデバイスのアドレスを指定して、Transmissionの開始
Wire.write(レジスターのアドレス); // レジスターのアドレスを指定
Wire.endTransmission(); // Transmissionの終了



// 読み込み
Wire.beginTransmission(スレーブデバイスのアドレス); // スレーブデバイスのアドレスを指定して、Transmissionの開始
Wire.requestFrom(スレーブデバイスのアドレス, 読み込むバイト数); // レジスターのアドレスを指定


byte buffer[読み込むバイト数];
int i = 0;
while(Wire.available()) // Wireに値が入ってくる間はループ、値がなくなると-1
{
 buffer[i] = Wire.read(); // 変数 bufferに値を格納
 i++;
}

Wire.endTransmission(); // Transmissionの終了

メソッド化する
void writeI2c(byte register_addr, byte value) {
  Wire.beginTransmission(DEVICE_ADDR);  
  Wire.write(register_addr);         
  Wire.write(value);                 
  Wire.endTransmission();        
}

void readI2c(byte register_addr, int num, byte buffer[]) {
  Wire.beginTransmission(DEVICE_ADDR); 
  Wire.write(register_addr);           
  Wire.endTransmission();         

  Wire.beginTransmission(DEVICE_ADDR); 
  Wire.requestFrom(DEVICE_ADDR, num);   

  int i = 0;
  while(Wire.available())        
  { 
    buffer[i] = Wire.read();   
    i++;
  }
  Wire.endTransmission();         
}


データフォーマット

レジスターアドレス 0x31


レジスタのアドレス 0x31では、DATA_FORMATの設定が可能である。今回は、D1,D0のRangeのみいじる。Rangeは、+-2Gに設定する。

writeI2c(0x31, 0);

POWER_CTL

レジスターアドレス 0x2d
POWER_CTLのMeasureビットを1にして、設定する。

wireI2c(0x2d, 8);

加速度データ

レジスターアドレス 0x32〜0x37



スケッチ


#include <Wire.h>

#define DEVICE_ADDR (0x53) // スレーブデバイスのアドレス
byte axis_buff[6];

void setup()
{
  Serial.begin(9600); // シリアルの開始デバック用
  Wire.begin();       // I2Cの開始
  
  Serial.write("init");
  
  // DATA_FORMAT
  writeI2c(0x31, 0x00);
  // POWER_TCL
  writeI2c(0x2d, 0x08);
}

void loop()
  uint8_t length = 6;
  readI2c(0x32, length, axis_buff); //レジスターアドレス 0x32から6バイト読む
  int x = (((int)axis_buff[1]) << 8) | axis_buff[0];   
  int y = (((int)axis_buff[3]) << 8) | axis_buff[2];
  int z = (((int)axis_buff[5]) << 8) | axis_buff[4];
  Serial.print("x: ");
  Serial.print( x );
  Serial.print(" y: ");
  Serial.print( y );
  Serial.print(" z: ");
  Serial.println( z );
  
  delay(100);
}

// I2Cへの書き込み
void writeI2c(byte register_addr, byte value) {
  Wire.beginTransmission(DEVICE_ADDR);  
  Wire.write(register_addr);         
  Wire.write(value);                 
  Wire.endTransmission();        
}

// I2Cへの読み込み
void readI2c(byte register_addr, int num, byte buffer[]) {
  Wire.beginTransmission(DEVICE_ADDR); 
  Wire.write(register_addr);           
  Wire.endTransmission();         

  Wire.beginTransmission(DEVICE_ADDR); 
  Wire.requestFrom(DEVICE_ADDR, num);   

  int i = 0;
  while(Wire.available())        
  { 
    buffer[i] = Wire.read();   
    i++;
  }
  Wire.endTransmission();         
}


Comments