#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);
}