Arduino-3軸加速度センサ「ADXL345」の使い方

  • URLをコピーしました!

当記事では、Arduinoで3軸加速度センサ「ADXL345」を使う方法を詳しく解説します。

3軸加速度センサ「ADXL345」はI2C/SPIで制御するため、ArduinoのWireライブラリ、SPIライブラリを使ったプログラムで、それぞれ動作させます。

なお、その他のArduino関数・ライブラリについては、以下の記事をご覧ください。

目次

3軸加速度センサ「ADXL345」の基本スペック

「ADXL345」はI2C/SPI制御で、加速度を測定できるセンサです。

当記事では、基板にモジュール化された秋月電子通商の「3軸加速度センサモジュール ADXL345(SPI/IIC)」を使用して、サンプルプログラムを解説していきます。

基本スペックADXL345
電源電圧DC2.0~3.6V
I/O電圧DC1.7V~Vs
通信方式I2C/SPI
測定範囲最大±16g
データビット数最大13bit
消費電流測定モード:23uA(Typ.)
スタンバイモード:0.1uA(Typ.)
※Vs=2.5V

ADXL345のより詳細なスペックを確認したい場合は、以下のリンク先にあるデータシートをご覧ください。

3軸加速度センサ「ADXL345」のコマンド

名称説明アドレス
DEVIDデバイスID0x00
Reserved予約(アクセス不可)0x01 to 0x1C
THRESH_TAPタップしきい値0x1D
OFSXX軸オフセット0x1E
OFSYY軸オフセット0x1F
OFSZZ軸オフセット0x20
DURタップ期間0x21
Latentタップ待ち時間0x22
Windowタップウィンドウ0x23
THRESH_ACTアクティブしきい値0x24
THRESH_INACT非アクティブしきい値0x25
TIME_INACT非アクティブ時間0x26
ACT_INACT_CTL軸イネーブルコントロール
(アクティブ/非アクティブ検出)
0x27
THRESH_FF自由落下しきい値0x28
TIME_FF自由落下時間0x29
TAP_AXESシングルタップ/ダブルタップ・軸コントロール0x2A
ACT_TAP_STATUSシングルタップ/ダブルタップ・ソース0x2B
BW_RATEデータレート/電力モードコントロール0x2C
POWER_CTL省電力機能コントロール0x2D
INT_ENABLE割り込みイネーブルコントロール0x2E
INT_MAP割り込みマッピングコントロール0x2F
INT_SOURCE割り込みソース0x30
DATA_FORMATデータ・フォーマット・コントロール0x31
DATAX0X軸データ00x32
DATAX1X軸データ10x33
DATAY0Y軸データ00x34
DATAY1Y軸データ10x35
DATAZ0Z軸データ00x36
DATAZ1Z軸データ10x37
FIFO_CTLFIFOコントロール0x38
FIFO_STATUSFIFOステータス0x39

ADXL345のより詳細なコマンド内容を確認したい場合は、以下のリンク先にあるデータシートをご覧ください。

サンプルプログラム(サンプルスケッチ)

加速度測定のサンプルプログラムをI2CとSPIでの方法にわけて紹介します。

なお、サンプルプログラム(サンプルスケッチ)で、ブレッドボードを使います。ブレッドボードの詳しい使い方は、以下の記事をご覧ください。

I2Cでの加速度測定

Arduino Uno 3軸加速度センサ ADXL345 I2C 加速度測定 配線図
用意するもの
  1. 3軸加速度センサモジュール ADXL345(SPI/IIC)
  2. I2Cバス用双方向電圧レベル変換モジュール(PCA9306)
  3. Arduino Uno
  4. USBケーブル
  5. ブレッドボード
  6. ジャンパ線
  7. PC(プログラム書き込み・シリアルモニタ表示)
#include <Wire.h>

//アドレス指定
#define ADXL345_ADDR 0x53
#define DATA_FORMAT 0x31
#define POWER_CTL 0x2D
#define DATAX0 0x32
#define FULL_RES_16G 0x0B
#define BIT10_16G 0x03
#define MEASURE 0x08

void setup() {
  Serial.begin(9600);//シリアル通信を9600bpsで初期化
  Wire.begin();//I2Cを初期化
 
  Wire.beginTransmission(ADXL345_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(DATA_FORMAT);//データ・フォーマット・コントロール
  Wire.write(FULL_RES_16G);//「最大分解能モード」、「±16g」
  //Wire.write(BIT10_16G);//「10bit固定分解能モード」、「±16g」
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了
 
  Wire.beginTransmission(ADXL345_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(POWER_CTL);//省電力機能コントロール
  Wire.write(MEASURE);//測定モード
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了
}
 
void loop() {
  unsigned int dac[6];
  unsigned int i, x, y, z;
  float X_Axis, Y_Axis, Z_Axis;

  Wire.beginTransmission(ADXL345_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(DATAX0);//出力データバイトを「X軸データ0」のアドレスに指定
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了
  
  Wire.requestFrom(ADXL345_ADDR, 6);//I2Cデバイス「ADXL345」に6Byteのデータ要求
  for (i=0; i<6; i++){
    while (Wire.available() == 0 ){}
    dac[i] = Wire.read();//dacにI2Cデバイス「ADXL345」のデータ読み込み
  }

  x = (dac[1] << 8) | dac[0];//2Byte目のデータを8bit左にシフト、OR演算子で1Byte目のデータを結合して、xに代入
  X_Axis = float(x) * 0.0392266;//加速度の計算、X_Axisに代入 ※0.0392266=(4/1000*9.80665)
  y = (dac[3] << 8) | dac[2];//2Byte目のデータを8bit左にシフト、OR演算子で1Byte目のデータを結合して、xに代入
  Y_Axis = float(y) * 0.0392266;//加速度の計算、Y_Axisに代入
  z = (dac[5] << 8) | dac[4];//2Byte目のデータを8bit左にシフト、OR演算子で1Byte目のデータを結合して、xに代入
  Z_Axis = float(z) * 0.0392266;//加速度の計算、Z_Axisに代入
  
  Serial.print("X-Axis:");//文字列「X-Axis:」をシリアルモニタに送信
  Serial.print(X_Axis);//「X_Axis」をシリアルモニタに送信
  Serial.print("m/s^2 ");//文字列「m/s^2」をシリアルモニタに送信
  Serial.print("Y-Axis:");//文字列「Y-Axis:」をシリアルモニタに送信
  Serial.print(Y_Axis);//「Y_Axis」をシリアルモニタに送信
  Serial.print("m/s^2 ");//文字列「m/s^2」をシリアルモニタに送信
  Serial.print("Z-Axis:");//文字列「Z-Axis:」をシリアルモニタに送信
  Serial.print(Z_Axis);//「Z_Axis」をシリアルモニタに送信
  Serial.println("m/s^2");//文字列「m/s^2」をシリアルモニタに送信、改行
   
  delay(1000);//1000msec待機(1秒待機)
}
シリアルモニタ例

X-Axis:0.08m/s^2 Y-Axis:0.20m/s^2 Z-Axis:9.38m/s^2
X-Axis:0.24m/s^2 Y-Axis:0.20m/s^2 Z-Axis:9.45m/s^2
X-Axis:0.16m/s^2 Y-Axis:0.24m/s^2 Z-Axis:9.49m/s^2
X-Axis:0.08m/s^2 Y-Axis:0.31m/s^2 Z-Axis:9.49m/s^2
X-Axis:0.20m/s^2 Y-Axis:0.24m/s^2 Z-Axis:9.45m/s^2
X-Axis:0.12m/s^2 Y-Axis:0.27m/s^2 Z-Axis:9.41m/s^2
X-Axis:0.16m/s^2 Y-Axis:0.24m/s^2 Z-Axis:9.45m/s^2
X-Axis:0.16m/s^2 Y-Axis:0.24m/s^2 Z-Axis:9.45m/s^2
X-Axis:0.16m/s^2 Y-Axis:0.27m/s^2 Z-Axis:9.45m/s^2
X-Axis:0.16m/s^2 Y-Axis:0.24m/s^2 Z-Axis:9.45m/s^2

サンプルプログラムでは、セットアップで「最大分解能モード・±16g」、「省電力機能コントロール・測定モード」を行い、ループでX軸、Y軸、Z軸の加速度を測定します。

読み出した加速度の13bitデータは、各軸ごとに加速度の値に換算して、シリアルモニタに表示させます。

SPIでの加速度測定

Arduino Uno 3軸加速度センサ ADXL345 SPI 加速度測定 配線図
用意するもの
  1. 3軸加速度センサモジュール ADXL345(SPI/IIC)
  2. 4ビット双方向ロジックレベル変換モジュール BSS138使用
  3. Arduino Uno
  4. USBケーブル
  5. ブレッドボード
  6. ジャンパ線
  7. PC(プログラム書き込み・シリアルモニタ表示)
#include <SPI.h>

//アドレス指定
#define ADXL345_ADDR 0x53
#define DATA_FORMAT 0x31
#define POWER_CTL 0x2D
#define DATAX0 0x32
#define FULL_RES_16G 0x0B
#define BIT10_16G 0x03
#define MEASURE 0x08
 
void setup() {
  Serial.begin(9600);//シリアル通信を9600bpsで初期化
  SPI.begin();//SPIを初期化、SCK、MOSI、SSの各ピンの動作は出力、SCK、MOSIはLOW、SSはHIGH

  SPI.setDataMode(SPI_MODE3);//SPIモードを「3」に設定・CPOL(クロック位相)=1,CPHA(クロック極性)=0
  SPI.setBitOrder(MSBFIRST);//SPI送受信用のビットオーダーを「MSBFIRST」に設定
 
  digitalWrite(SS, LOW);//SSピンの出力をLOW(0V)に設定
  SPI.transfer(DATA_FORMAT);//データ・フォーマット・コントロール
  SPI.transfer(FULL_RES_16G);//「最大分解能モード」、「±16g」
  //SPI.transfer(BIT10_16G);//「10bit固定分解能モード」、「±16g」
  digitalWrite(SS, HIGH);//SSピンの出力をHIGH(5V)に設定
 
  digitalWrite(SS, LOW);//SSピンの出力をLOW(0V)に設定
  SPI.transfer(POWER_CTL);//省電力機能コントロール
  SPI.transfer(MEASURE);//測定モード
  digitalWrite(SS, HIGH);//SSピンの出力をHIGH(5V)に設定
}
 
void loop() {
  unsigned int dac[6];
  unsigned int i, x, y, z;
  float X_Axis, Y_Axis, Z_Axis;
 
  digitalWrite(SS, LOW);//SSピンの出力をLOW(0V)に設定
  SPI.transfer(DATAX0 | 0x80 | 0x40);//出力データバイトを「X軸データ0」のアドレスに指定、書き込みフラグ・複数バイトフラグを立てる
  for (i=0; i<6; i++){
    dac[i] = SPI.transfer(0x00);//dacにSPIデバイス「ADXL345」のデータ読み込み
  }
  digitalWrite(SS, HIGH);//SSピンの出力をHIGH(5V)に設定
 
  x = (dac[1] << 8) | dac[0];//2Byte目のデータを8bit左にシフト、OR演算子で1Byte目のデータを結合して、xに代入
  X_Axis = float(x) * 0.0392266;//加速度の計算、X_Axisに代入 ※0.0392266=(4/1000*9.80665)
  y = (dac[3] << 8) | dac[2];//2Byte目のデータを8bit左にシフト、OR演算子で1Byte目のデータを結合して、xに代入
  Y_Axis = float(y) * 0.0392266;//加速度の計算、Y_Axisに代入
  z = (dac[5] << 8) | dac[4];//2Byte目のデータを8bit左にシフト、OR演算子で1Byte目のデータを結合して、xに代入
  Z_Axis = float(z) * 0.0392266;//加速度の計算、Z_Axisに代入
  
  Serial.print("X-Axis:");//文字列「X-Axis:」をシリアルモニタに送信
  Serial.print(X_Axis);//「X_Axis」をシリアルモニタに送信
  Serial.print("m/s^2 ");//文字列「m/s^2」をシリアルモニタに送信
  Serial.print("Y-Axis:");//文字列「Y-Axis:」をシリアルモニタに送信
  Serial.print(Y_Axis);//「Y_Axis」をシリアルモニタに送信
  Serial.print("m/s^2 ");//文字列「m/s^2」をシリアルモニタに送信
  Serial.print("Z-Axis:");//文字列「Z-Axis:」をシリアルモニタに送信
  Serial.print(Z_Axis);//「Z_Axis」をシリアルモニタに送信
  Serial.println("m/s^2");//文字列「m/s^2」をシリアルモニタに送信、改行
   
  delay(1000);//1000msec待機(1秒待機)
}
シリアルモニタ例

X-Axis:0.16m/s^2 Y-Axis:0.24m/s^2 Z-Axis:9.45m/s^2
X-Axis:0.16m/s^2 Y-Axis:0.20m/s^2 Z-Axis:9.49m/s^2
X-Axis:0.16m/s^2 Y-Axis:0.24m/s^2 Z-Axis:9.49m/s^2
X-Axis:0.16m/s^2 Y-Axis:0.27m/s^2 Z-Axis:9.45m/s^2
X-Axis:0.16m/s^2 Y-Axis:0.27m/s^2 Z-Axis:9.45m/s^2
X-Axis:0.12m/s^2 Y-Axis:0.27m/s^2 Z-Axis:9.38m/s^2
X-Axis:0.16m/s^2 Y-Axis:0.24m/s^2 Z-Axis:9.49m/s^2
X-Axis:0.16m/s^2 Y-Axis:0.24m/s^2 Z-Axis:9.45m/s^2
X-Axis:0.16m/s^2 Y-Axis:0.24m/s^2 Z-Axis:9.45m/s^2
X-Axis:0.16m/s^2 Y-Axis:0.24m/s^2 Z-Axis:9.49m/s^2


サンプルプログラムでは、I2Cのサンプルプログラムと同様、セットアップで「最大分解能モード・±16g」、「省電力機能コントロール・測定モード」を行い、ループでX軸、Y軸、Z軸の加速度を測定します。

読み出した加速度の13bitデータは、各軸ごとに加速度の値に換算して、シリアルモニタに表示させます。

なお、SPIで使われる各端子の説明は以下にまとめました。サンプルプログラムのSPIライブラリでも端子名が使われています。

SPI 各端子の説明
  • SCK(Serial ClocK) :通信タイミング用のクロック
  • MISO(Master In Slave Out) :スレーブからマスターへのデータ送信
  • MOSI(Master Out Slave In) :マスターからスレーブへのデータ送信
  • SS(Slave Select pin) :制御対象にするデバイス選択

おすすめのArduinoボードはどれ?

当記事『Arduino-3軸加速度センサ「ADXL345」の使い方』では、Arduino Unoを使用したサンプルプログラムを解説してきました。

やはり、たくさんの種類のあるArduinoボードの中でも、最も基本的なエディションのArduino Unoがおすすめなのですが、Arduino Unoと電子部品を組み合わせたキットも存在します。

電子工作初心者にとっては、いちいち電子部品を別途購入する必要がないので非常に有用です。以下の記事で初心者でもわかりやすいように、ランキング形式でおすすめのArduino Unoを紹介しているので、ぜひご覧ください。

また、以下の記事で、安価でWi-Fi/Bluetoothに対応している「ESP32開発ボード」についてもまとめてみました。

このボードは、Arduinoボードではありませんが、Arduino IDEでソフト開発ができるため、電子工作でIoTを実現したい方におすすめです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次