MSA3S02は、X・Y・Zの3方向の加速度を測定できるデジタル3軸加速度センサーです。
ArduinoやESP32などのマイコンとはI²Cで通信でき、基板の傾きや動き、振動などを検出できます。
加速度センサーというとMPU6050などがよく知られていますが、MSA3S02については日本語の情報やArduino向けサンプルがまだ多くありません。
この記事では、MSA3S02の特徴やI²C通信、X・Y・Z軸、加速度の単位「g」の意味から、Arduino・ESP32で実際に3軸加速度を取得する方法まで解説します。
記事後半では、MSA3S02を搭載した「KUMITATE-SENSOR」を使った実例も紹介します。
MSA3S02とは?
MSA3S02は、X・Y・Zの3軸を測定できる低g向けのデジタル加速度センサーです。
非常に小さな2mm × 2mm × 0.95mmのLGA-12パッケージに収められており、I²Cを使ってマイコンから測定値を取得できます。
主な特徴は次のとおりです。
- X・Y・Zの3軸加速度を測定
- I²C通信に対応
- 12bit分解能
- ±2g / ±4g / ±8g / ±16gの測定レンジを選択可能
- 1Hz~1000Hzの出力データレート
- モーションイベント検出
- 割り込み出力
- 低消費電力
- 小型LGA-12パッケージ
電源電圧は1.62~3.6Vなので、ESP32などの3.3V系マイコンと組み合わせることができます。
MSA3S02の主な仕様
代表的な仕様をまとめると次のようになります。
| 項目 | MSA3S02 |
|---|---|
| センサー | 3軸加速度 |
| 測定軸 | X / Y / Z |
| インターフェース | I²C |
| 分解能 | 12bit |
| 測定レンジ | ±2g / ±4g / ±8g / ±16g |
| 出力データレート | 1~1000Hz |
| 電源電圧 | 1.62~3.6V |
| 動作温度 | -40~+85℃ |
| パッケージ | LGA-12 |
| パッケージサイズ | 2 × 2 × 0.95mm |
| その他 | モーションイベント検出、割り込み出力 |
用途としては、傾き検出、画面方向検出、ジェスチャー検出、振動監視などが挙げられています。
3軸加速度センサーとは?
MSA3S02は「3軸加速度センサー」です。
3軸とは、
- X軸
- Y軸
- Z軸
の3方向です。
例えばセンサー基板を机の上に置いた場合、左右方向、前後方向、基板に対して垂直な方向の加速度をそれぞれ測定できます。
そのため単純に「動いたかどうか」だけでなく、どの方向にどれくらいの加速度が加わったのかを調べることができます。
加速度の「g」とは?
加速度センサーでは測定値を「g」で表すことがあります。
ここでいうgはグラムではなく、地球の重力加速度を基準にした単位です。
およそ、
1g ≒ 9.8m/s²
です。
つまりセンサーが静止していても、地球上では重力の影響を受けています。
この性質を利用すると、加速度センサーを「動きを検出するセンサー」としてだけでなく、基板の傾きを調べるセンサーとしても利用できます。
静止しているのに約1gが表示されるのはなぜ?
加速度センサーを初めて使うと、
「基板を動かしていないのに値が0にならない」
ことがあります。
これは故障ではありません。
センサーは重力の影響を測定しているためです。
例えば基板を水平に置き、Z軸が重力方向と一致している場合、
X ≒ 0g
Y ≒ 0g
Z ≒ ±1g
のような値になります。
基板を90度回転させれば、約1gが現れる軸も変化します。
これを利用すると基板がどちらを向いているのかを判定できます。
±2g・±4g・±8g・±16gとは?
MSA3S02では測定レンジを変更できます。
選択できるのは、
- ±2g
- ±4g
- ±8g
- ±16g
です。
例えば±2gでは、-2gから+2gまでの範囲を測定します。
一方、±16gなら-16gから+16gまで測定できます。
では常に±16gにしておけばよいかというと、そうではありません。
測定可能な範囲を広くすると、同じデジタル出力に対する1LSBあたりの加速度も大きくなります。
小さな傾きやゆっくりした動きを細かく測定したい場合には±2g、大きな衝撃などを測定したい場合には、より広いレンジを使用するというように用途に応じて選択します。
MSA3S02はI²Cで通信する
MSA3S02はI²Cインターフェースを搭載しています。
基本的な接続は、
| 信号 | 内容 |
|---|---|
| VDD | 電源 |
| GND | GND |
| SDA | I²Cデータ |
| SCL | I²Cクロック |
となります。
I²CではSDAとSCLを複数のセンサーで共有できます。
そのため、MSA3S02だけでなく温湿度センサーや照度センサーなどを同じI²Cバスへ接続することもできます。
I²C通信の基本についてはこちらの記事で詳しく解説しています。
MSA3S02のI²Cアドレス
今回使用したMSA3S02では、
0x62
でI²C通信を行います。
ArduinoやESP32から通信できない場合は、まずI²Cスキャナを使ってデバイスが認識されているか確認すると原因を切り分けやすくなります。
I²Cスキャナで、
0x62
が検出されれば、少なくともマイコンからI²Cデバイスとして応答を確認できます。
I²Cスキャナについてはこちらの記事で解説します。
MSA3S02の加速度データを読み取る
MSA3S02からX・Y・Z軸の加速度を取得するには、I²C経由で加速度データが格納されているレジスタを読み取ります。
今回使用したMSA3S02では、各軸のデータを次のレジスタから取得します。
| 軸 | レジスタ |
|---|---|
| X | 0x02 / 0x03 |
| Y | 0x04 / 0x05 |
| Z | 0x06 / 0x07 |
1軸につき2バイトを読み取り、そこから12bitの加速度データを取り出します。
つまりX・Y・Zをすべて取得する場合は、合計6バイトのデータを扱うことになります。
12bitデータとは?
MSA3S02の加速度出力は12bitです。
12bitで表現できる組み合わせは、
2¹² = 4096
通りです。
ただし加速度には、
- +方向
- -方向
があるため、単純な0~4095の値として扱うわけではありません。
負の値を表現するために「2の補数」が使用されます。
例えばArduinoやESP32側では、読み取ったデータを12bitの符号付き値として扱えるよう変換する必要があります。
Arduino・ESP32でMSA3S02を読み取る
ここから実際にMSA3S02のX・Y・Z軸を読み取ります。
今回はArduinoのWireライブラリを使用して、I²Cレジスタへ直接アクセスします。
専用ライブラリを使わず、
どのレジスタから、どのように加速度データを取得しているのか
が分かるようにしています。
MSA3S02のサンプルプログラム
以下はMSA3S02からX・Y・Z軸を読み取る基本的な例です。
#include <Wire.h>
#define MSA3S02_ADDR 0x62
// 使用するマイコンに合わせて変更してください
#define SDA_PIN 8
#define SCL_PIN 9
uint8_t readRegister(uint8_t reg)
{
Wire.beginTransmission(MSA3S02_ADDR);
Wire.write(reg);
Wire.endTransmission(false);
Wire.requestFrom(MSA3S02_ADDR, 1);
if (Wire.available()) {
return Wire.read();
}
return 0;
}
void writeRegister(uint8_t reg, uint8_t value)
{
Wire.beginTransmission(MSA3S02_ADDR);
Wire.write(reg);
Wire.write(value);
Wire.endTransmission();
}
int16_t readAxis(uint8_t reg)
{
uint8_t lsb = readRegister(reg);
uint8_t msb = readRegister(reg + 1);
int16_t value =
((int16_t)msb << 8) | lsb;
// 12bitデータとして取り出す
value >>= 4;
// 12bitの符号拡張
if (value & 0x0800) {
value |= 0xF000;
}
return value;
}
void setup()
{
Serial.begin(115200);
Wire.begin(SDA_PIN, SCL_PIN);
delay(100);
Serial.println("MSA3S02 start");
// 使用する動作モード・レンジに応じて
// 必要なレジスタを設定します。
}
void loop()
{
int16_t x = readAxis(0x02);
int16_t y = readAxis(0x04);
int16_t z = readAxis(0x06);
Serial.print("X: ");
Serial.print(x);
Serial.print(" Y: ");
Serial.print(y);
Serial.print(" Z: ");
Serial.println(z);
delay(500);
}
SDAとSCLのGPIO番号は使用するマイコンボードに合わせて変更してください。
また、実際に「g」単位へ変換する場合には、設定している測定レンジに対応した感度を使ってRAW値を換算します。
RAW値をgへ変換する
例えば±2gレンジを使用する場合、センサーのRAW値を対応する感度で割ることで加速度をg単位へ変換できます。
考え方としては、
加速度[g] = RAW値 ÷ 感度[LSB/g]
です。
ここで重要なのが、測定レンジを変更すると感度も変わることです。
そのため、
「プログラムでは±2g用の換算をしているのに、センサー本体は±8gに設定されている」
といった状態では正しい値になりません。
レジスタ設定と換算式を一致させる必要があります。
X・Y・Z軸を実際に確認してみる
加速度センサーを理解するには、数値を見るだけでなく実際に基板を動かしてみるのがおすすめです。
まず基板を水平な机の上に置きます。
次に、
- 左右へ傾ける
- 前後へ傾ける
- 基板を裏返す
という操作を行い、X・Y・Zの値がどのように変化するか確認します。
特に基板を裏返すと、重力方向に対応している軸の符号が、
+1g → -1g
のように反転します。
これを見ると「加速度センサーが方向を検出できる理由」が分かりやすくなります。
MSA3S02で何が作れる?
MSA3S02は3方向の加速度を測定できるので、単純な動きの検出だけでなくさまざまな用途に利用できます。
例えば、
- 基板の傾き検出
- デバイスの向き判定
- 振動監視
- 動作検出
- ジェスチャー入力
- 転倒検出
- IoT機器の状態監視
などです。
ESP32のWi-Fi機能と組み合わせれば、加速度や振動のデータをネットワーク経由で記録することもできます。
MSA3S02を実際に試すならKUMITATE-SENSOR
MSA3S02は2mm角の非常に小さなLGAパッケージなので、IC単体を購入してブレッドボードで簡単に試すような部品ではありません。
そこで、MSA3S02を実際にArduinoやESP32から動かしてみたい場合は、センサーを実装済みの基板を使用すると簡単です。
KUMITATE-SENSORには、今回紹介したMSA3S02を含む3種類のI²Cセンサーを搭載しています。
| センサー | 測定内容 |
|---|---|
| SHT40 | 温度・湿度 |
| BH1750 | 照度 |
| MSA3S02 | 3軸加速度 |
3種類ともI²Cで制御できるため、同じSDA・SCLを共有しながら、
温度・湿度・照度・3軸加速度
を1枚の基板から取得できます。
KUMITATE-C3だけでなく、3.3V系I²Cに対応した各種マイコンから利用できます。
サンプルプログラムとREADMEもGitHubで公開しています。
GitHubでKUMITATE-SENSORのサンプルを見る
SHT40・BH1750もI²Cで接続できる
KUMITATE-SENSORでは、MSA3S02以外にもSHT40とBH1750を同じI²Cバスへ接続しています。
SHT40では温度と湿度、
BH1750では照度、
MSA3S02では3軸加速度を取得します。
それぞれI²Cアドレスが異なるため、SDAとSCLを共有しながら個別に通信できます。
SHT40についてはこちらの記事で解説しています。
SHT40とは?Arduino・ESP32で温度・湿度を測定する方法
BH1750についてはこちらです。
BH1750とは?Arduino・ESP32で照度(lux)を測定する方法
まとめ
MSA3S02は、X・Y・Zの3方向の加速度を測定できる小型のデジタル3軸加速度センサーです。
ArduinoやESP32などからI²Cでアクセスできるため、傾きや動き、振動などを検出する用途に利用できます。
MSA3S02を使用するときに覚えておきたいポイントは次のとおりです。
- X・Y・Zの3軸加速度を測定できる
- I²C通信に対応
- 12bit分解能
- ±2g / ±4g / ±8g / ±16gのレンジを選択できる
- 出力データレートは1~1000Hz
- 静止状態でも重力によって約1gが測定される
- 加速度データはレジスタから読み取る
- 12bitの符号付きデータとして処理する
- レンジに応じた感度を使ってRAW値をgへ変換する
MSA3S02は日本語の情報がまだ少ないセンサーですが、I²Cレジスタを直接読みながら3軸加速度センサーの仕組みを学ぶ題材としても利用できます。
KUMITATE-SENSORではSHT40・BH1750・MSA3S02を同じI²Cバス上で使用しているので、MSA3S02単体を動かした後は、複数のI²Cセンサーを同時に制御する実験にも発展させることができます。

