#include // ピンアサイン int CS=10; int LED_OUT=7; //ADXL345 レジスタアドレス #define BW_RATE 0x2C //Data rate and power mode control #define POWER_CTL 0x2D //Power Control Register #define INT_SOURCE 0x30 //Source of interrupts #define DATA_FORMAT 0x31 //Data format control #define DATAX0 0x32 //X-Axis Data 0 // ADXL345データ更新割り込み #define DATA_READY 0x80 char values[10]; int x,y,z; double xg, yg, zg; void setup(){ SPI.begin(); SPI.setDataMode(SPI_MODE3); Serial.begin(9600); pinMode(CS, OUTPUT); pinMode(LED_OUT, OUTPUT); digitalWrite(CS, HIGH); digitalWrite(LED_OUT, LOW); // ADXL345初期化 writeRegister(DATA_FORMAT, 0x03); // +-16g 10bit writeRegister(BW_RATE, 0x19); // サンプリングレート50Hz、省電力モード writeRegister(POWER_CTL, 0x08); //Measurement mode readRegister(INT_SOURCE, 1, values); // 念のため割り込み発生レジスタを読み込んでおく } void loop() { // 値が更新されたらサンプリングする readRegister(INT_SOURCE, 1, values); if(values[0] & DATA_READY) { readRegister(DATAX0, 6, values); 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開始時にCSをLOWにする digitalWrite(CS, LOW); // レジスタアドレス送信 SPI.transfer(registerAddress); // レジスタに設定する値送信 SPI.transfer(value); // SPI終了時にCSをHIGHにする digitalWrite(CS, HIGH); } void readRegister(char registerAddress, int numBytes, char * values){ // 複数バイト読み出し char address = 0x80 | registerAddress; if(numBytes > 1)address = address | 0x40; // SPI開始時にCSをLOWにする digitalWrite(CS, LOW); // 読み出し先レジスタのアドレスを送信 SPI.transfer(address); // 値の読み出し for(int i=0; i