M5StickC PlusのIMUを取得してみる

Arduino, C++

M5StickC PlusのIMUを取得してみる

概要

M5Stickに触れる機会があり、それを用いて何かしらのものを作れないかという話になったので、
M5Stickの6軸IMUを取得してみることにした。
この処理が実装できると、M5Stickを搭載したモノを移動させたりすることでその動きをプログラム側に反映させることができるため、
M5Stickを埋め込んだ銃の様なものを作成し、プログラム側で的を用意し射的を再現できるのではないかと考えている。

本記事では、IMUのデータを安定して取得するために行なった実装とそれに伴い発生した課題への対処に関して記載する。

環境

  • M5StickC Plus
  • Arduino IDE
  • MacBook Pro M1

※今回の記事ではArduino IDEの導入やM5Stickの設定は省略している。

実装

M5Stick

M5Stickに搭載されているIMUから情報を取得し、その情報をシリアル通信で送信する処理を実装する。
M5Stick上には現在取得している座標の情報がディスプレイ上で表示される様にする。
また、ボタン押下時にはIMUの取得情報をリセットする。

ライブラリ準備

M5UnifiedをArduino IDEのライブラリマネージャーから検索してインストールする。

コード1

setupと変数定義

loop

データを送信する部分

外部システムとの連携用にJSON形式でデータを送信できる様にしておく。

ディスプレイに表示する部分

M5Stickのディスプレイに表示するための実装。

実行1

実際に動作させると、M5Stickの画面には次の様な表示が出る。

実行1

X軸:-4.1
Y軸:116.9

画像の数値で固定されることはなく、常に値が加算され続ける。

キャリブレーション実装

実行1の様にM5Stickを動かしていなくても常に座標情報を更新し続ける現象が発生する。
これは、ドリフト現象というもので、この現象を完全に防ぐことはできないが、
ある程度のドリフトを防ぐためにキャリブレーションとデッドゾーンの設定をする。

次の処理を追加し、setup関数の中に記述する。

コード2

実行2

実行1と同様に動作させると、M5Stickの画面には次の様な表示が出る。

実行2

X軸:1.4
Y軸:7.2

キャリブレーションを行い、デッドゾーンを設定したため、ドリフトはある程度抑えられるようになった。
ただ、ドリフトしている値がそもそもデッドゾーンより大きくなっているので依然としてドリフトが発生している。

Madgwickフィルター実装

Madgwickフィルターとは

Madgwickフィルターとは、ジャイロセンサーのデータを組み合わせて姿勢を推定するフィルターである。
ジャイロセンサーのデータはドリフトが発生しやすいため、加速度センサーのデータを組み合わせて姿勢を推定する。
フィルタを利用することでこのドリフトを抑制してくれる。
詳しくはこちら

コード3
ライブラリの導入

MadgwickAHRSをArduinoIDEのライブラリマネージャーから検索してインストールする。

実行3

実行2と同様に動作させると、M5Stickの画面には次の様な表示が出る。

実行3

X軸:0.1
Y軸:-0.5

実行結果比較表

実行 X軸 Y軸
1 -4.1 116.9
2 1.4 7.2
3 0.1 -0.5

ドリフトが抑えられていることがわかる。
また、フィルターを通してピッチとロールから角度を取得しているため、
利用しているうちに誤差が修正されていき、精度が向上していく(らしい)。

あとがき

実装1では明らかにM5Stickに触っていない状態でも値が更新され続けていた。
この状態では利用に耐えないため、実際に実装するとなった場合には、
キャリブレーションとデッドゾーンの設定をすることは間違いなく必要になることがわかった。

Madgwickフィルターであるが、実際に画面上で見る限りではIMUから取得したデータを利用している場合と差異があまりなかった。
Madgwickフィルターの仕様に関して理解しきれていないのでその様な結果になっている可能性がある。

取得したデータを実際に利用するにはハード側でどの様な動きをする想定なのかを基に利用する必要がある。
従って、値を活用する術も調べていく。

Arduino, C++