加速度センサから角度を計算する

この記事では、Arduinoで加速度センサ(MMA8452Q)を使って角度を計算する方法を解説する。とくにここでは、重力加速度から角度を計算する方法となる。なお、話を簡単にするためにも重力方向のz軸と前後方向のx軸の2軸に絞って考えていく。

加速度センサから角度を計算する方法

センサーにおけるx軸方向の加速度を\(a_x\)、z軸方向の加速度を\(a_z\)とする。

倒立振子のようなモデルで角度を考えてみる。

加速度センサと倒立振子モデル
加速度センサと倒立振子モデル

倒立振子がθだけ傾いた時を考えてみよう。ただし、この角度で静止しているものとする。

倒立振子がθだけ傾いている
倒立振子がθだけ傾いている

物体は静止しているので、重力\(a\)のみの加速度がかかっている。つまりセンサの加速度\(a_x\)と\(a_z\)のベクトルの合成値が重力加速度\(a\)になるはずである。

センサのx軸とz軸の加速度
センサのx軸とz軸の加速度

これを分かりやすいように書き直すと次の図のようになる。

加速度センサのベクトル合成
加速度センサのベクトル合成

つまりθは加速度\(a_x\)と\(a_z\)を使って次の式で表すことができる。

$$tanθ=\frac{a_x}{a_z}$$

角度θを計算したいので逆三角関数のアークタンジェントを使って次のように表すことができる。

$$θ=tan^{-1}\frac{a_x}{a_z}$$

幸いArduino言語(C++)では、atan2関数を使ってアークタンジェントの計算を簡単に行うことができる。

theta= atan2(ax, az)

Arduinoで実践

実際にArduinoを使って加速度センサから角度を計算させるプログラムがこちら。加速度センサはMMA8452Qを使用。使い方の詳細はこちらの記事を参考に。

#include <Arduino.h>
#include <Wire.h>
#include "SparkFun_MMA8452Q.h"

MMA8452Q accel;

void setup() {
  Serial.begin(9600);
  Wire.begin();

  if (accel.begin() == false) {
    Serial.println("Not Connected. Please check connections and read the hookup guide.");
    while (1);
  }
}

void loop() {
  if (accel.available()) {
    float ax = accel.getCalculatedX();
    float az = accel.getCalculatedZ();
    float angle = atan2(ax, az) * 180.0 / PI;

    Serial.print(angle, 3);
    Serial.println();
  }
}

次の記事では、ProcessingでArduinoとシリアル通信をし、角度に合わせて図形を回転させてみたのでよかったら参考に。

記事に関するご質問などがあればTwitterへお返事ください。
この記事で紹介した商品
人気のArduino互換機
Arduinoで人気の周辺パーツ
Arduinoのオススメ参考書

▼ Arduino初心者向きの内容となっています。ほかのArduino書籍と比べて図や説明がとてもていねいで、読みやすかったです。Arduinoで一通りのセンサーが扱えるようになります。

▼ 外国人が書いた本を翻訳したものです。この手の書籍は、目からうろこな発見をすることが多いです。

▼ Arduinoの入門書を既に読んでいる方で、次のステップを目指したい人向きの本です。C言語のプログラミングの内容が中心です。ESP32だけでなく、ふつうのArduinoにも役立つ内容でした。

関連記事