MPU6050 と LED マトリクスで作る「円形水平器」

この記事で学習できること

  • MPU6050 は 3 軸加速度センサーと 3 軸ジャイロセンサーを搭載した高性能モジュールで、Arduino で傾きや姿勢を検出する際によく使われます。 そこで、この記事では、MPU6050 の傾き情報を LED マトリクスに表示し、円形の水平器(バブルレベル)のように動作させる方法を解説します。なお、円形の水平器(バブルレベル)は下図のような外観です。
円形水平器の外観
— 円形水平器の外観 —

このプロジェクトでは、以下を学ぶことができます。

  • MPU6050 の角度取得方法
  • LED マトリクスの座標制御
  • Arduino でのリアルタイム表示
  • 傾き方向の可視化

MPU6050 の仕組みとLED マトリクスの仕組み

  • MPU6050 は、加速度(X, Y, Z)、ジャイロ(角速度)を測定します。Arduino ではライブラリを使うことで、測定値を簡単に取得できます。
  • LED マトリクスは 8×8 の LED を行列制御で点灯させます。 またMAX7219 を使うことで、Arduino から簡単に制御できます。

LED-Matrixの表示方法をどうするか?

  • GY-521(MPU6050)で計測したX軸とY軸の垂直方向の角度をある範囲でドットに表示させ。X軸とY軸ともに垂直になった時に中心部の水平5列目、垂直5列目のLEDが点灯するようにします。円形水準器(サークルレベル)で水平を合わせるときに気泡が中心になるように水準器を乗せた機器の高さを合わせますが、そのようなイメージになるのではと考えています。
LEDの点灯の座標
— LEDの点灯の座標 —

ArduinoにMPU6050とLED-Matrixを接続します

LEDマトリックスとArduinoの配線図
— LEDマトリックスとArduinoの配線図 —

使用する部品

Arduino UNO1 個
GY-521 (MPU6050)1 個
MAX7219 搭載 8×8 LED マトリクス1 個
ジャンパーワイヤー9 本

配線方法

Arduino UNOGY-521 (MPU6050)
SDA SDA
SCL SCL
GNDGND
5VVCC
Arduino UNOMAX7219 搭載 8×8 LED マトリクス
D12DIN
D11CS
D10CLK
5VVCC
GNDGND

プログラムの概要

このプロジェクトの流れは次の通りです。

  • MPU6050 から角度(ピッチ・ロール)を取得
  • 角度を LED マトリクスの座標(0〜7)に変換
  • 傾いた方向の LED を点灯
  • ループでリアルタイム更新

MPU6050の測定結果をLED-Matrixに表示させるスケッチの作成

  •  円形水準器(サークルレベル)の気泡の動きに相当する範囲は、7 x 7のLEDです。LED1ドット間を2.5度で作成します。
#include <Wire.h>
#include <MPU6050.h>
#include <LedControl.h>
#include <math.h>

MPU6050 mpu;
LedControl lc = LedControl(12, 10, 11, 1); // DIN=12, CLK=10, CS=11, デバイス数=1

// 前回の交点位置
int prevX = 4; // 列(0~7)
int prevY = 4; // 行(0~7)

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

  lc.shutdown(0, false);
  lc.setIntensity(0, 8);
  lc.clearDisplay(0);

  Serial.println("MPU6050 & LED Matrix Initialized");
}

void loop() {
  // MPU6050から加速度・ジャイロデータ取得
  int16_t ax, ay, az;
  int16_t gx, gy, gz;
  mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

  // 加速度をfloatに変換
  float fax = ax / 16384.0;
  float fay = ay / 16384.0;
  float faz = az / 16384.0;

  // 角度計算(ラジアン→度)
  float xAngle = atan2(fax, faz) * 180.0 / M_PI;
  float yAngle = atan2(fay, faz) * 180.0 / M_PI;

  // シリアルモニタに表示
  Serial.print("xAngle: ");
  Serial.print(xAngle);
  Serial.print(" deg, yAngle: ");
  Serial.println(yAngle);

  // xAngleの表示位置(1行目、2~8列)
  int xPos = 4 + (int)(xAngle / 2.5); // 5列目を基準(index 4)
  if (xPos < 1) xPos = 1;
  if (xPos > 7) xPos = 7;

  // yAngleの表示位置(1列目、2~8行)
  int yPos = 4 - (int)(yAngle / 2.5); // 5行目を基準(index 4)
  if (yPos < 1) yPos = 1;
  if (yPos > 7) yPos = 7;

  // 前回の交点LEDを消灯
  lc.setLed(0, prevY, prevX, false);
  lc.setLed(0, 0, prevX, false);
  lc.setLed(0, prevY, 0, false);   

  // 新しい交点LEDを点灯
  lc.setLed(0, yPos, xPos, true);
  lc.setLed(0, 0, xPos, true);
  lc.setLed(0, yPos, 0, true);

  // 前回位置更新
  prevX = xPos;
  prevY = yPos;

  delay(100);
}

コードのポイント解説

MPU6050から加速度・角速度データ取得にはgetMotion6()関数を使います

  mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

取得した角度(下記ではxAngle)を2.5度単位に変えて、5列目を中心として表示させます

  int xPos = 4 + (int)(xAngle / 2.5); // 5列目を基準(index 4)

実際の動作

センサーを傾けると、LED マトリクス上の点が傾いた方向へ移動します。 その結果、円形の水平器のように傾きの方向が直感的に分かります。

— LEDマトリックスがMPU6050の傾きに従って点灯 —

応用例

この仕組みは以下のプロジェクトにも応用できます。

  • ロボットの姿勢制御
  • ドローンの傾き検出
  • ゲームコントローラー
  • 車体の水平検出
  • 加速度を使った UI 制御

よくあるトラブルと対処法

1) LED が点灯しない

  • MAX7219 の配線ミス
  • DIN/CS/CLK のピン番号違い

2) MPU6050 の値が不安定

  • 電源ノイズ
  • 配線が緩んでいる
  • キャリブレーション不足

3) LED の位置がずれる

  • map() の範囲設定が不適切
  • 角度の符号が逆になっている

まとめ

MPU6050 と LED マトリクスを組み合わせることで、傾きを視覚的に表示する円形水平器を簡単に作ることができます。

  • 角度取得
  • 座標変換
  • LED 表示

という 3 つの要素を組み合わせることで、Arduino の理解が深ります。


御質問、誤植の指摘、記事の改善点の気づきなどありましたら「問い合わせ 」のページからお願いします。