M5Stack Gray で MPU6886 を使用したロガースケッチ

###概要
スイッチサイエンスの M5Stack Gray（9軸IMU搭載） を購入しましたので、MPU6886 ジャイロ加速度計を使用してちょっとしたグラフ表示させるスケッチを作りました。

https://www.switch-science.com/catalog/3648/



***
###動作画面
画面内の最下部に現在表示している情報と縦軸の倍率を表示しています。

3軸ジャイロスコープロギング画面
<img width="400" alt="IMG_4630.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/80d3ee6a-3500-8eae-4390-67d073aac5ab.jpeg">

3軸重力加速度計ロギング画面
<img width="400" alt="IMG_4631.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/14bd03c7-5923-8dd9-702c-1c15dfcb1ef6.jpeg">

姿勢情報ロギング画面
<img width="400" alt="IMG_4632.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/4e968a40-6d15-2f8e-dc6a-b455c0037b87.jpeg">

***
###操作
デフォルト表示は、3軸ジャイロスコープロギング画面[3 axis gyroscope            ]になっています。
M5Stackの3ボタンでそれぞれ表示する項目を切り替えています。

Aボタン（左）:3軸ジャイロスコープロギング画面[3 axis gyroscope            ]
Bボタン（中）:3軸重力加速度計ロギング画面 [3 Axis Gravity Accelerometer] 
Cボタン（右）:姿勢情報ロギング画面       [Posture information         ]

同じボタンを再度押すと、縦軸の倍率が変わります。

3軸ジャイロスコープロギング画面と姿勢情報ロギング画面は倍率は下記の順番で切り替わります。
1.0 , 2.5 , 5.0 , 0.25 , 0.5

3軸重力加速度計ロギング画面の倍率は下記の順番で切り替わります。
1.0 , 2.5 , 5.0 , 10.0 , 15.0

***
###ソースファイル
Gitgubにあげました。
[MPU6886_Loggerスケッチ]

https://github.com/ayanosuke/MPU6886


***
###ソースファイルの説明
M5StackでSerial.print（）デバックを行う際、Serial.begin(115200); を入れるとそこでプログラムが止まって（フリーズ）しまうのででコメントアウトする事で通信できました。（詳細不明）

特に難しいことはやっていないですが、かいつまんで解説します。

ボタン入力部は連続で取り込むとレンジ切り替える感度が高すぎてうまく設定ができないため、以下のプログラムムの様に100ms毎にスキャンしました。

```c++:ボタン入力処理
  if( (millis() - PreviosTime ) >= 100 ){  // 100:100msec 前回から100ms経過したかチェック
    PreviosTime = millis();
    sel = btnchk();
  }
```

波形を右から左に移動させる方法がよくわからなかったので、何も考えずに、M5Stack GrayのX軸は320ドットありますので、配列を確保し表示する値は配列の最後尾[319]番目に代入し前回の波形を削除、配列の内容をずらし、波形を再表示する処理にしています。
波形の振幅が大きいと表示がちらついてしまいます。

```c++:波形表示処理
  Xdot[319] = gyroX * RngTbl[Rng]; //配列の最後尾に最新のデータを代入
  Ydot[319] = gyroY * RngTbl[Rng];
  Zdot[319] = gyroZ * RngTbl[Rng];

  for( x = 0 ; x <=318 ; x++ ){ // 前回のグラフを消去
    M5.Lcd.drawLine( x, XHMax - Xdot[x], x+1, XHMax - Xdot[x+1], BLACK);
    M5.Lcd.drawLine( x, YHMax - Ydot[x], x+1, YHMax - Ydot[x+1], BLACK);
    M5.Lcd.drawLine( x, ZHMax - Zdot[x], x+1, ZHMax - Zdot[x+1], BLACK);
    Xdot[x] = Xdot[x+1];  // 波形をシフト
    Ydot[x] = Ydot[x+1];
    Zdot[x] = Zdot[x+1];
  }
  for( x = 0 ; x <=317 ; x++ ){ // 今回のグラフを表示
    M5.Lcd.drawLine( x, XHMax - Xdot[x], x+1, XHMax - Xdot[x+1], RED);
    M5.Lcd.drawLine( x, YHMax - Ydot[x], x+1, YHMax - Ydot[x+1], WHITE);
    M5.Lcd.drawLine( x, ZHMax - Zdot[x], x+1, ZHMax - Zdot[x+1], YELLOW);
  }
```

M5Stackのボタン取り込みは、M5.update()という文を入れないと、M5.BtnA.isPressed()で取り込めませんでしたので忘れずに。

```c++:ボタン取り込み処理
  M5.update();              // update button state これを入れないとボタン情報読めない

  if (M5.BtnA.isPressed()) {
    NowBtn = 'A';
  }
  if (M5.BtnB.isPressed()) {
    NowBtn = 'B';
  }
  if (M5.BtnC.isPressed()) {
    NowBtn = 'C';
  }
```

***
###動画（ツイッターに投稿したものです）
M5stack gray で加速度XYXをグラフに描かせてみた。上からX軸、Y軸、X軸です。
https://twitter.com/masashi_214/status/1431600117128204290

今度はピッチ、ロール、ヨーを表示。なんか、ヨー(黄色)がおかしい
https://twitter.com/masashi_214/status/1431605982631653385

***
###参考にした記事
【M5Stack】第4回 M5Stack Fire内蔵のIMU（MPU6886）を使って姿勢角算出
スケッチ ライブラリを使用のベースをお借りしています。
https://shizenkarasuzon.hatenablog.com/entry/2020/05/21/013307

３次元ベクトルの回転「ロール・ピッチ・ヨー」
https://watako-lab.com/2019/01/23/roll_pitch_yaw/

[M5Stack】第3回 LCD下部のボタンの状態を取得する
https://shizenkarasuzon.hatenablog.com/entry/2020/05/21/012707