3軸加速度センサー(ADXL345)の使い方 - SPI版 [Arduino]
XYZの3軸の加速度(m/s2)を取得できる「ADXL345」の使い方です。
最大分解能モード/±16gの実行結果
※プログラム上ではm/s2を「m/s^2」と表記しています。
この記事はADXL345のSPI接続版です。I2C接続版及びスケール係数(0.0392266m/s2)の算出方法などの詳細はこちらです。
使用部品・材料
総額で約1,120円です。(Arduino本体の値段を除く)
部品/材料 | 値段 | 備考 |
---|---|---|
ブレッドボード | ¥270 | 秋月電子の通販コード(P-00315) |
3軸加速度センサモジュール ADXL345 | ¥450 | 秋月電子の通販コード(M-06724) |
I2Cバス用双方向電圧レベル変換モジュール(FXMA2102) 2個 | ¥400 | 秋月電子の通販コード(M-05825) |
配線図
Arduino UNOの動作電圧は5V。ADXL345の動作電圧は2.0-3.6Vですので、電圧レベル変換モジュールを使用して3.3Vで接続しています。
※ロジック変換モジュールのFXMA108は相性が悪く接続できませんでしたので、FXMA2102を2個使用しています。
SPI接続用のピン
マスターはArduino。スレーブはADXL345です。
番号 | 名称 | 内容 |
---|---|---|
13 | SCK | Serial ClocK。データ転送の同期の為のマスターからのクロ ック信号。 |
12 | MISO | Master In Slave Out。スレーブからマスターへデータを送る。 |
11 | MOSI | Master Out Slave In。マスターからスレーブへデータを送る。 |
(10) | SS | Slave Select pin。スレーブ選択ピン。10ピン以外でも使用可能です。 SPI接続でデバイス間の通信をする場合は、このピンをLOWにしている間に行います。通信を終了する場合はHIGHにします。 |
このピン番号と名称はArduinoで使用されているものです。デバイスによって異なる場合があります。
スケッチ(プログラム)
各XYZ軸の加速度(m/s2)をシリアルモニターへ出力します。
#include <SPI.h> // SCK : pin 13 (Serial ClocK) // MISO : pin 12 (Master In Slave Out) // MOSI : pin 11 (Master Out Slave In) // SS : pin 10 (Slave Select pin) // XYZレジスタ用のテーブル(6byte) uint8_t RegTbl[6]; void setup() { // SPIの初期化 // ※自動的に「SCK、MOSI、SSのピンの動作はOUTPUT」となり「SSはHIGH」となる SPI.begin(); // SPI転送モード // クロック位相(CPOL) = 1 クロック極性(CPHA) = 1 SPI.setDataMode(SPI_MODE3); // SPI送受信用のビットオーダー(MSBFIRST) SPI.setBitOrder(MSBFIRST); // DATA_FORMAT(データ形式の制御) digitalWrite(SS, LOW); // DATA_FORMATのアドレス SPI.transfer(0x31); // 「最大分解能モード」 及び 「±16g」 (0x0B == 1011) SPI.transfer(0x0B); // 「10bit固定分解能モード」 及び 「±16g」にする場合 (0x03 == 0011) // SPI.transfer(0x03); digitalWrite(SS, HIGH); // POWER_TCL(節電機能の制御) digitalWrite(SS, LOW); // POWER_CTLのアドレス SPI.transfer(0x2d); // 測定モードにする SPI.transfer(0x08); digitalWrite(SS, HIGH); Serial.begin(9600); } void loop() { // XYZデータの取得 digitalWrite(SS, LOW); // XYZの先頭アドレス(0x32)に移動する // ※複数バイトを読み込む際に必要なマルチバイト・ビットを加算 SPI.transfer(0x32 | 0x40 | 0x80); // 6byteのデータを取得する for (int i = 0; i < 6; i++) { RegTbl[i] = SPI.transfer(0x00); } digitalWrite(SS, HIGH); // データを各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); }
※スケール係数の「0.0392266」はI2C版をご覧ください。
参考リンク
https://github.com/adafruit/Adafruit_ADXL345
スポンサーリンク
掲示板
ArduinoやRaspberry Piなどの電子工作の掲示板を作成しました。質問やわからない事は電子工作 (Arduino・ラズパイ等)でユーザー同士で情報を共有して下さい。
関連記事
公開日:2017年06月12日 最終更新日:2017年07月22日
記事NO:02419