M5Stack Grayの加速度センサ①音を鳴らす

M5Stack Grayに搭載されている9軸センサのうち、加速度データをもとに音を鳴らすサンプルです。

#目的
　イニシャルＤのように、コップの水をこぼさない運転を目指すため、似たようなアプリを欲していました。加速度を測り、一定値以上の加速度になったら、水がこぼれるような表示を目指します。で、車のダッシュボードにつけて、フロントガラスの反射で見えたらいいなと思います。

#環境
Windows 8
Arduino 1.8.13 64bit
M5Stack Gray(2018.3)(MPU9250)

#準備
①M5StackのUSBドライバをインストール
②Arduinoの環境設定の追加のボードマネージャのURLを追加
https://dl.espressif.com/dl/package_esp32_index.json
③Arduinoのボードマネージャからesp32(1.0.4)をインストール
④ArduinoのライブラリマネージャからM5Stack(0.3.1)をインストール

#参考
スケッチ例＞M5Stack＞Basics＞IMU
スケッチ例＞M5Stack＞Basics＞speaker

#概要
M5Stackは水平に固定し、X軸の加速度だけを見る。
値が大きいときほど、周波数が高くなり、大きな音になる。
つまり、音が鳴らないように、運転すればいい。
急発進急ブレーキは、未実装。
水のこぼれる表現も未実装です。M5Stackでは、とてもやりにくいですね。そもそも、運転中では、音表現だけの方が安全でした。やるならせいぜい、フルスクリーンベタ塗りで。

#コード
```cpp:initialD.ino
// define must ahead #include <M5Stack.h>
//#define M5STACK_MPU6886
#define M5STACK_MPU9250
// #define M5STACK_MPU6050
// #define M5STACK_200Q

#include <M5Stack.h>

float accX = 0.0F;
float accY = 0.0F;
float accZ = 0.0F;

int width, height;
int counter;
float a = 1;
int x, y, _x, _y;

void setup() {
  M5.begin();
  M5.Power.begin();
  M5.IMU.Init();

  M5.Lcd.setTextSize(2);
  width = M5.Lcd.width();
  height = M5.Lcd.height();
  clear();

  //xTaskCreatePinnedToCore(draw, "Draw", 4096, NULL, 1, NULL, 0);
  //xTaskCreatePinnedToCore(sound, "Sound", 4096, NULL, 1, NULL, 1);
}

void loop() {
  M5.Lcd.setTextColor(WHITE, BLACK);

  M5.IMU.getAccelData(&accX, &accY, &accZ);
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.printf(" %5.2f", accX);

  _x = x;
  _y = y;
  x = counter % width;
  y = accX * 200 + height / 2;//-0.5G~+0.5G ___ -100~+100
  if (x==0) _x = x;
  M5.Lcd.drawLine(_x, _y, x, y, WHITE); //左右

  int vol = int(abs(accX) * 10 * a); //default 0.5G Volume5 (0<Volume<10)
  M5.Lcd.setCursor(0, 99);
  M5.Lcd.printf("volume=%d",vol);
  M5.Speaker.setVolume(vol);
  int tone = 220 + abs(accX)*100;
  M5.Speaker.tone(tone, 200);

  //Power OFF
  M5.Lcd.setCursor(0, height - 20);
  M5.Lcd.print("Power Off");
  if (M5.BtnA.wasPressed()) {
    M5.Power.powerOFF();
  }
  M5.update();
  //Volume - +
  M5.Lcd.setCursor(width / 2-20, height - 20);
  M5.Lcd.print("Vol-    Vol+");
  if (M5.BtnB.wasPressed()) {
    a*=0.8;
  }
  if (M5.BtnC.wasPressed()) {
    a*=1.2;
  }

  delay(200);
  counter++;
  if (counter % width == 0) {
    clear();
  }
}

void clear() {
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.drawFastHLine(0, height / 2 - 80, width, DARKGREY);
  M5.Lcd.drawFastHLine(0, height / 2 - 60, width, DARKGREY);
  M5.Lcd.drawFastHLine(0, height / 2 - 40, width, DARKGREY);
  M5.Lcd.drawFastHLine(0, height / 2 - 20, width, DARKGREY);
  M5.Lcd.drawFastHLine(0, height / 2     , width, LIGHTGREY);
  M5.Lcd.drawFastHLine(0, height / 2 + 20, width, DARKGREY);
  M5.Lcd.drawFastHLine(0, height / 2 + 40, width, DARKGREY);
  M5.Lcd.drawFastHLine(0, height / 2 + 60, width, DARKGREY);
  M5.Lcd.drawFastHLine(0, height / 2 + 80, width, DARKGREY);
}
```

#できてないこと
グラフィックをコップにする
音を滑らかに変化させる
BGMを鳴らす
SDにログを取る

#動作について
音量的には問題ない。
0.5Gまでのグラフで問題ない。（0.4Gでは乗りごこちが悪く、0.3G以下に抑えた方がいいという情報が元）
車に載せてバッテリー動作させたが、よく落ちた。USBでつないだ方がよさそう。
①振動でバッテリーが外れやすい？
②スピーカーの消費電力が結構大きい
③バッテリーの劣化が進んでる？（２年ぐらい放置）
④寒くて（氷点下）バッテリーが死んでる？

#メモ
　このようなアプリを何年も考えていましたが、やってませんでした。スマホアプリでは開発の準備がめんどくさそうだし、iPod touchでjavascriptで加速度を表示したこともありますが、iPhoneにしたのが2017年末と遅く、放置ネタでした。いまではブラウザのセキュリティーが厳しくなり、javascriptで加速度を表示することさえ面倒になってしまいましたし、そもそも、スマホのブラウザでは、ログを取ることが困難そうです。