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); }
実行結果
最近、paper workがおおすぎて、半田づけの腕が落ちたかもしれない。
もともとそんなに上手じゃないのでかなりぐちゃぐちゃですね。
近日、周波数特性を自動で計測できるMatlabコードを作るかもしれません。
参考サイト
参考サイトの皆様、ありがとうございます。
www.petitmonte.com