- [Arduino用のUNO R3 最終版スタータキット]にGY-521(MPU6050)とMAX7219 LED-Matrixモジュールが含まれています。GY-521(MPU6050)の使い方を[ArduinoでGY-521: MPU6050 (3軸 加速度・角速度センサ)から加速度と角速度を読み出す仕様を調べました]で学習し、MAX7219 LED-Matrixモジュールの使い方を[ArduinoでLED-Matrixを操作しました]で学習しました。
- GY-521(MPU6050)で傾きを測定して、これをMAX7219 LED-Matrixモジュールに表示して、水準器的な動作をさせてみました。
Table of Contents
水準器とは?
水準器とは、物体や面が水平または垂直になっているかを確認するための測定器具です。主に建築、DIY、機械設置などで使われます。
本体:棒状や円形のケース。
気泡管(バブルチューブ):液体の中に気泡が入った透明な管。
目盛り線:気泡が中央の線に合えば水平(または垂直)であることを示します。
棒状水準器(スピリットレベル):棚や床の水平確認に使用。
円形水準器(サークルレベル):X軸・Y軸方向の水平度を同時に確認できるタイプ。三脚や機械の設置に便利。

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

ArduinoにMPU6050とLED-Matrixを接続します
- [ArduinoでLED-Matrixを操作しました]でArduino UNOにLED-Matrixを接続しました。GY-521(MPU6050)を追加で配線します。

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);
}
AIを使ったスケッチの作成
- [AIを使ってRGB LEDを点灯するスケッチを作成しました]でAIを使ってスケッチを作成しました。今回もAIを使っています。仕様が少し複雑なのか、私の仕様の記述の仕方が下手なの解りませんが、何回か指示を変えても思い通りにならなかった動作があり、その部分はスケッチを修正しました。それでもスケッチの作成時間は約1時間程度です。何か作ろとうと思った時に、使う部品の仕様・操作方法が解っていて、どのような動作をさせたいのか決まっていれば、昔よりは絶対に早く形になると実感しています。
御質問、誤植の指摘、記事の改善点の気づきなどありましたら「問い合わせ 」のページからお願いします。
