ArduinoでMPU6050から加速度と角速度を取得する|配線・ライブラリ・コードを徹底解説
MPU6050は、加速度と角速度を同時に測定できる6軸IMU(慣性計測ユニット)です。傾きや動きの解析、ロボットの姿勢制御など、幅広い用途で使われる定番センサーです。本記事では、I2C配線の基本を解説します。さらに、生データの読み取り方、ライブラリを使った実装、傾き角度の計算、リハビリ・動作解析への応用のヒントまで、順を追って紹介します。
01MPU6050とは|加速度と角速度を同時に測れるセンサー
6軸IMUとは何か
MPU6050は、3軸の加速度センサーと3軸のジャイロセンサーを1つに統合したICです。ジャイロセンサーは角速度センサーとも呼ばれます。これらを合わせて「6軸IMU(慣性計測ユニット)」と呼びます。加速度センサーは、X・Y・Z方向にかかる力を測定します。ジャイロセンサーは、X・Y・Z軸まわりの回転の速さを測定します。この2種類のデータを組み合わせれば、物体の傾きや動きを詳しく捉えられます。
I2C通信で複数のセンサーを同時に使える
MPU6050は、I2Cという通信方式でArduinoとやり取りします。I2Cには利点があります。SDA・SCLというたった2本の信号線で通信できるのです。さらに、1本のI2Cバスに複数のセンサーを接続することもできます。可変抵抗やCdSセルのようなアナログセンサーとは、配線の考え方が異なります。この点には注意してください。
理学療法士のOさんは、簡易的な関節可動域の計測にMPU6050を試してみた。CdSセルや可変抵抗のようなアナログセンサーとは勝手が違った。I2Cという通信方式に、最初は戸惑ったという。しかし、配線自体は4本のみとシンプルだった。基本のコードが動いてしまえば、あとは加速度と角速度という2種類の情報を活用する応用段階に進めます。
02基礎知識|測定レンジと単位
加速度のレンジと分解能
MPU6050の加速度センサーには機能があります。測定できる範囲(レンジ)を切り替えられるのです。選べるのは±2g、±4g、±8g、±16gの4種類です。初期設定は±2gです。この設定の場合、変換方法は決まっています。センサーが出力する生の値(16ビット)を16384で割ると、重力加速度を1とした単位(g)に変換できます。
角速度のレンジと分解能
ジャイロセンサー側にも、同様にレンジの設定があります。選べるのは4種類です。±250、±500、±1000、±2000°/s(1秒あたりの回転角度)です。初期設定は±250°/sです。この設定の場合、生の値を131で割ります。すると、1秒あたりの回転角度(°/s)に変換できます。
| 測定項目 | 初期設定のレンジ | 変換に使う数値 |
|---|---|---|
| 加速度 | ±2g | 生の値 ÷ 16384.0 = g単位の値 |
| 角速度 | ±250°/s | 生の値 ÷ 131.0 = °/s単位の値 |
※レンジの設定を変更した場合は、変換に使う数値もそれに応じて変わります。
03配線方法:Arduino UnoとMPU6050

基本の4本配線
MPU6050モジュール(GY-521など)には主要なピンがあります。VCC・GND・SCL・SDAという4つです。Arduino Unoの場合、SDAはA4に、SCLはA5につなぎます。VCCとGNDは、それぞれArduinoの5VとGNDにつなぎます。
電源電圧について
MPU6050のチップ自体は3.3V駆動です。ただし、多くの市販モジュールには電圧レギュレータが搭載されています。そのため、Arduinoの5Vを直接つないでも問題なく動作します。基板にレギュレータ用の部品が見当たらない場合もあるでしょう。そのときは、念のため3.3V側に接続してください。
04基本のコード|Wireライブラリで生データを読み取る
スリープモードの解除が最初の一歩
MPU6050には特徴があります。電源投入直後は省電力のスリープモードに入っているのです。Arduino公式のWireライブラリを使いましょう。電源管理用のレジスタ(0x6B番地)に0を書き込みます。これでスリープを解除できます。これを忘れると、値がまったく取得できません。
読み取るデータの内訳
スリープを解除したら、次のステップに進みます。加速度データが格納されている0x3B番地から、14バイトをまとめて読み取ります。内訳は決まっています。加速度3軸(6バイト)、温度(2バイト)、角速度3軸(6バイト)です。追加のライブラリを使わずに、Wireライブラリだけで完結する書き方です。
// MPU6050からライブラリなしで生データを読み取るコード
#include <Wire.h>
const int MPU = 0x68; // MPU6050のI2Cアドレス(AD0がLOWの場合)
void setup() {
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B); // 電源管理レジスタ
Wire.write(0); // スリープを解除
Wire.endTransmission(true);
Serial.begin(9600);
}
void loop() {
Wire.beginTransmission(MPU);
Wire.write(0x3B); // 加速度データの先頭アドレス
Wire.endTransmission(false);
Wire.requestFrom(MPU, 14, true); // 14バイトまとめて読み取る
float accX = (Wire.read() << 8 | Wire.read()) / 16384.0;
float accY = (Wire.read() << 8 | Wire.read()) / 16384.0;
float accZ = (Wire.read() << 8 | Wire.read()) / 16384.0;
Wire.read(); Wire.read(); // 温度データは今回使わないのでスキップ
float gyroX = (Wire.read() << 8 | Wire.read()) / 131.0;
float gyroY = (Wire.read() << 8 | Wire.read()) / 131.0;
float gyroZ = (Wire.read() << 8 | Wire.read()) / 131.0;
Serial.print("Acc(g): ");
Serial.print(accX); Serial.print(", ");
Serial.print(accY); Serial.print(", ");
Serial.println(accZ);
Serial.print("Gyro(deg/s): ");
Serial.print(gyroX); Serial.print(", ");
Serial.print(gyroY); Serial.print(", ");
Serial.println(gyroZ);
delay(200);
}
この方式の利点と欠点
この方式には利点があります。ライブラリのインストールが不要な分、動作原理を理解しやすいのです。一方で、欠点もあります。コードはやや長くなります。基本文法については、下記の記事も参考にしてください。
05ライブラリを使ってもっと簡単に扱う
Adafruit_MPU6050ライブラリの利点
生データを直接扱う方法は、仕組みを学ぶには最適です。しかし、実際のプロジェクトでは事情が異なります。ライブラリを使ったほうが効率的な場合が多いのです。代表的な選択肢の1つが、Adafruit社が提供するAdafruit_MPU6050ライブラリです。導入方法はシンプルです。Arduino IDEのライブラリマネージャーから、Adafruit MPU6050とAdafruit Unified Sensorの2つをインストールするだけです。
ライブラリを使ったコード例
// Adafruit_MPU6050ライブラリを使ったコード
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
Adafruit_MPU6050 mpu;
void setup() {
Serial.begin(9600);
if (!mpu.begin()) {
Serial.println("MPU6050が見つかりません");
while (1) {
delay(10);
}
}
mpu.setAccelerometerRange(MPU6050_RANGE_2_G);
mpu.setGyroRange(MPU6050_RANGE_250_DEG);
}
void loop() {
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp); // 加速度・角速度・温度をまとめて取得
Serial.print("Acc(m/s^2): ");
Serial.print(a.acceleration.x); Serial.print(", ");
Serial.print(a.acceleration.y); Serial.print(", ");
Serial.println(a.acceleration.z);
Serial.print("Gyro(rad/s): ");
Serial.print(g.gyro.x); Serial.print(", ");
Serial.print(g.gyro.y); Serial.print(", ");
Serial.println(g.gyro.z);
delay(200);
}
単位の違いに注意
ライブラリを使う場合、単位変換をあらかじめ済ませた値を取得できます。ただし、注意点があります。単位がg(重力加速度比)やm/s²ではなく、ライブラリによって異なる場合があるのです。使用前にドキュメントで単位を確認する習慣をつけましょう。ライブラリの入れ方については、下記の記事も参考にしてください。
06計測データの活用|傾き角度とリハビリでの応用

加速度から傾き角度を求める
センサーが静止しているとき、加速度センサーは重力の向きを検出しています。この性質を利用しましょう。三角関数を使うと、センサーの傾き(ロール角・ピッチ角)を計算できます。ただし、加速度センサー単体の計算には弱点があります。振動や急な動きがあると、値が乱れやすいのです。
角速度と組み合わせる発想
そこで登場するのが、ジャイロセンサーの角速度データです。角速度を時間で積分すると、角度の変化量を求められます。ただし、これにも弱点があります。誤差が少しずつ蓄積していく「ドリフト」という現象が起きるのです。実用的なシステムでは工夫が必要です。加速度センサーとジャイロセンサーの両方の長所を組み合わせます。これを「センサーフュージョン」と呼びます。
リハビリ・動作解析での活用
MPU6050には応用先があります。関節の角度変化や、歩行時の体幹の揺れといった動作を、簡易的に可視化する用途に活用できるのです。当サイトでは、圧センサーや筋電センサーを使ったリハビリ応用についても解説しています。あわせて参考にしてください。ただし、注意点もあります。正確な臨床評価に使う場合は、専門家による精度の検証が欠かせません。
MPU6050は安価で入手しやすいです。学習や試作段階での動作解析には、とても役立ちます。一方で、医療機器としての精度は保証されていません。「まず自分の動きを数値やグラフで可視化してみる」という学習目的での活用から始めることをおすすめします。
07よくあるトラブルと対処法

症状別の対処早見表
| 症状 | 主な原因 | 対処法 |
|---|---|---|
| 値がすべて0のまま変化しない | スリープモードの解除忘れ | 0x6Bレジスタに0を書き込む処理を確認する(4章参照) |
| センサーが見つからない(I2Cエラー) | SDA・SCLの配線ミス、または配線の入れ替わり | UnoではSDA=A4、SCL=A5になっているか確認する |
| 値が異常に大きい、または不安定 | 単位変換の割り算を忘れている | 加速度は16384、角速度は131で割っているか確認する(2章参照) |
| ライブラリのコンパイルエラーが出る | 依存ライブラリの入れ忘れ | Adafruit Unified Sensorなど、必要なライブラリを揃える |
| 角度の計算値が徐々にずれていく | ジャイロセンサーのドリフト | センサーフュージョンなど、補正を行う手法を検討する(6章参照) |
原因を素早く切り分けるコツ
Eさんは配線通りにつないだつもりだったが、シリアルモニタに表示される値がすべて0のままだった。配線を何度確認しても間違いは見当たらなかった。そこで、サンプルコードを見直してみた。すると、電源管理レジスタへの書き込み処理を書き忘れていたことに気づいた。1行追加すると、正しい値が表示されるようになった。初期化処理の書き忘れは、I2Cセンサーによくあるつまずきです。
08よくある質問
基本のQ&A
応用のQ&A
関連記事・参考資料
基礎を学べる記事
- YOFUKASI LAB「Arduinoに必要な工具・部品リスト」2026年, https://yofukasi-lab-wp.com/2026/08/22/arduino-tools-parts/
- YOFUKASI LAB「Arduinoで可変抵抗を読む|配線と値の取得」2026年, https://yofukasi-lab-wp.com/2026/08/27/arduino-potentiometer-analogread/
- YOFUKASI LAB「Arduinoライブラリの入れ方・作り方・管理方法まとめ」2026年, https://yofukasi-lab-wp.com/2026/08/22/arduino-library-install-create-manage/
応用・リハビリ関連記事
- YOFUKASI LAB「ArduinoとPythonとセンサーを用いたリハビリテーションへの応用」2026年, https://yofukasi-lab-wp.com/2026/07/11/rehabilitation/
- YOFUKASI LAB「Arduinoを使ったリアルタイムフィードバックシステムの作り方」2026年, https://yofukasi-lab-wp.com/2026/07/25/arduino-feedback/
- YOFUKASI LAB「スマートフォンを使ったTUGテストの測定方法」2026年, https://yofukasi-lab-wp.com/2026/07/25/smartphone-tug/
- YOFUKASI LAB「Arduinoのコンパイルエラー一覧」2026年, https://yofukasi-lab-wp.com/2026/07/30/error/
参考資料(外部・一次情報)
- Arduino Documentation「Wire library」, https://docs.arduino.cc/language-reference/en/functions/communication/wire/
- How To Mechatronics「Arduino and MPU6050 Accelerometer and Gyroscope Tutorial」, https://howtomechatronics.com/tutorials/arduino/arduino-and-mpu6050-accelerometer-and-gyroscope-tutorial/
※本記事は個人の学習・電子工作用途を対象にしています。実際の製品や医療機器へ組み込む場合は、電気安全・製品規格の専門家に別途ご相談ください。
コメント