加速度センサーを使ってみる その1(MPU6050、ESP32、デュアルコア)
はじめに
今回は加速度センサーのMPU6050を使ってみました。いつも使っているスターターキットに入っていたものです。GY-521と印字されていますが、MPU6050と変わりません。
▼GY-521はこちら。チップがMPU6050です。安いですね。
ちなみに、なぜか温度も取得できるみたいです。あまり正確でなかったような...
加速度センサーで何がしたいのかというと、倒立振子を使ったロボットを作りたいなと考えています。そのためにnRF52840の加速度センサーを使いたいのですが、その前にMPU6050を使っていたのでまとめておこうという次第です。
▼加速度センサーの仕様とプログラムについては、こちらの記事が非常に詳しいです。一読することをお勧めします。
加速度ジャイロセンサMPU-6050をSTM32Nucleoボードで使ってみる | 即戦力モノづくり!エンジニアへの道標 (depfields.com)
回路を組む
マイコンはESP32を使いました。I2C通信用のピンは、ピンレイアウトでSDA、SCLとされている21番、22番を使っています。
▼秋月電子通商で買ったESP32はこちら
ESP32-DevKitC-VE ESP32-WROVER-E開発ボード 8MB: マイコン関連 秋月電子通商-電子部品・ネット通販 (akizukidenshi.com)
▼Amazonでも販売されています。
なおESP32の場合は、プログラム次第で他のピンでもI2C通信をすることができます。
▼arduino-esp32のWire.hを見ると、beginにはいくつかあります。例えば、Wire.begin(sda_pin,scl_pin)のように使うことができます。
https://github.com/espressif/arduino-esp32/blob/master/libraries/Wire/src/Wire.h
▼回路図はこちら
▼さらにサーボモーターを加えると、配線はこんな感じ
プログラムを実行してみる
サンプルプログラムを試してみる
▼たしかスターターキットのサンプルプログラムです。加速度と角速度の6軸について取得できます。
MPU6050のアドレスを0x68に設定しています。アドレス指定用のAD0ピンの状態によっては、0x69の可能性もあるので注意してください。
デュアルコアを使ったプログラムを作成する
加速度や角度を取得する関数をいろいろ作成しました。
角度を求めるにあたって、余計なdelayが入ったりすると値がずれていくことがありました。そこで、今回はESP32のもう一つのコアで処理を行っています。ESP32はデュアルコアであり、簡単に言うと二つのプログラムを同時に実行できるというイメージです。もう一つのコアで計算した加速度や角度をloop文で使うようにしてみました。
注意点として、Wire.h関連のプログラムはすべてもう一つのコア内で処理する必要があります。setup内でもWire.h関連の処理を行うと、ESP32がリセットし続けてしまう状態になります。
▼こちらの記事で指摘されています。
https://www.mgo-tec.com/blog-entry-problem-i2c-0628-arduino-esp32.html
▼デュアルコアのプログラムについて、最小限のものはこちら
https://qiita.com/Ninagawa123/items/5c3a9d40996836bd825f
▼全部まとめたプログラムはこちら
▼実際のシリアルモニタの表示
加速度を取得する
▼加速度だけ取得できるようにまとめたプログラムはこちら。単位は「G」です。ジェットコースターでおなじみですね。
▼実行結果はこちら。机に静止した状態で置いていました。
静止状態で1Gの重力がかかっていることが分かります。この重力加速度を取り除く場合もあるようですね。
▼重力加速度に関する記事がありました。ハイパスフィルターを使うそうです。
【加速度センサー入門】~第10回 重力加速度を取り除いてみよう~ - 半導体事業 - マクニカ (macnica.co.jp)
角度を求める
▼プログラムはこちらの記事を参考にしています。補正についても説明されているので、ぜひ一読ください。
注意点として、角度を求める場合はセンサーの値を補正するキャリブレーションが起動後に行われます。起動してから数秒間は、加速度センサーが静止した状態になるようにしてください。途中で動かしてしまうと、どんどん値がずれてしまいます。
▼サーボモーターのプログラムを追加して、角度の変化に合わせて回るようにした様子。反応が早いですね。
最後に
今回はMPU6050の基本的な使い方についてまとめました。実は結構前から使っていて、加速度センサーで取得したデータをPythonでグラフ化したり、3D空間にプロットしたりするのも試しています。また記事にまとめようと思っています。
角度を求めるときにキャリブレーションが入ってしまうのは、もっといいやり方が無いかなと思っているところです。