TOP > カテゴリ > ロボット・電子工作・マイコン >

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です。

番号名称内容
13SCKSerial ClocK。データ転送の同期の為のマスターからのクロ ック信号。
12MISOMaster In Slave Out。スレーブからマスターへデータを送る。
11MOSIMaster Out Slave In。マスターからスレーブへデータを送る。
(10)SSSlave 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





関連記事



公開日:2017年06月12日 最終更新日:2017年07月22日
記事NO:02419