Scientific Journey

私の冒険記録。たまに回り道。

Arduino ADXL345 が動いた!!

今回使用するのはADXL345加速度センサです!

日本で秋月にて購入をしましたADXL345を使ってI2Cで加速度を図ってみたいと思います。

配線

配線ですが、秋月で購入の場合は主にADXL345の4個所に配線すればいい感じでした。
しかも、内部抵抗が10KΩはいっているので特にプルアップの回路にしなくても大丈夫です。

まずVSSとVDDをつなげる

ADXL 345 Arduino Uno
GND GND
VDD 3.3V
SCL A5
SDA A4

このような感じになります。

コード

こちらのサイトよりADXL345を同じく動かしている方から拝借させていただきました。
いろいろ試してみましたが、このサイトのコードのみが動いてくれました。

#include <Wire.h>
 
// デバイスアドレス(スレーブ)
uint8_t DEVICE_ADDRESS = 0x1D;  
 
// XYZレジスタ用のテーブル(6byte)
uint8_t RegTbl[6];  
 
void setup() {
  Serial.begin(9600); 
  
  // マスタとしてI2Cバスに接続する
  Wire.begin();       
 
  // DATA_FORMAT(データ形式の制御) 
  Wire.beginTransmission(DEVICE_ADDRESS);  
    // DATA_FORMATのアドレス    
    Wire.write(0x31);
    // 「最大分解能モード」 及び 「±16g」 (0x0B == 1011)
    Wire.write(0x0B);  
    // 「10bit固定分解能モード」 及び 「±16g」にする場合 (0x03 == 0011)
    // Wire.write(0x03);
  Wire.endTransmission();
 
  // POWER_TCL(節電機能の制御) 
  Wire.beginTransmission(DEVICE_ADDRESS);  
    // POWER_CTLのアドレス    
    Wire.write(0x2d);
    // 測定モードにする
    Wire.write(0x08);  
  Wire.endTransmission();
}
 
void loop() {
 
  // XYZの先頭アドレスに移動する
  Wire.beginTransmission(DEVICE_ADDRESS);
    Wire.write(0x32);
  Wire.endTransmission();
  
  // デバイスへ6byteのレジスタデータを要求する
  Wire.requestFrom(DEVICE_ADDRESS, 6);
   
  // 6byteのデータを取得する
  int i;
  for (i=0; i< 6; i++){
    while (Wire.available() == 0 ){}
    RegTbl[i] = Wire.read();
  }
 
  // データを各XYZの値に変換する(LSB単位)
  int16_t x = (((int16_t)RegTbl[1]) << 8) | RegTbl[0];
  int16_t y = (((int16_t)RegTbl[3]) << 8) | RegTbl[2];
  int16_t z = (((int16_t)RegTbl[5]) << 8) | RegTbl[4];  
 
  // 各XYZ軸の加速度(m/s^2)を出力する
  Serial.print("X : ");
  Serial.print( x * 0.0392266 );
  Serial.print(" Y : ");
  Serial.print( y * 0.0392266 );
  Serial.print(" Z : ");
  Serial.print( z * 0.0392266 );
  Serial.println(" m/s^2");
 
  delay(100);
}

実行結果


www.instagram.com

最近、paper workがおおすぎて、半田づけの腕が落ちたかもしれない。
もともとそんなに上手じゃないのでかなりぐちゃぐちゃですね。

近日、周波数特性を自動で計測できるMatlabコードを作るかもしれません。

参考サイト

参考サイトの皆様、ありがとうございます。
www.petitmonte.com