M5Stack Grayに搭載されている9軸センサのうち、加速度データをもとに音を鳴らすサンプルです。
目的
イニシャルDのように、コップの水をこぼさない運転を目指すため、似たようなアプリを欲していました。加速度を測り、一定値以上の加速度になったら、水がこぼれるような表示を目指します。で、車のダッシュボードにつけて、フロントガラスの反射で見えたらいいなと思います。
環境
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では、とてもやりにくいですね。そもそも、運転中では、音表現だけの方が安全でした。やるならせいぜい、フルスクリーンベタ塗りで。
コード
// 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でつないだ方がよさそう。
①振動でバッテリーが外れやすい?
②スピーカーの消費電力が結構大きい
③バッテリーの劣化が進んでる?(2年ぐらい放置)
④寒くて(氷点下)バッテリーが死んでる?
メモ
このようなアプリを何年も考えていましたが、やってませんでした。スマホアプリでは開発の準備がめんどくさそうだし、iPod touchでjavascriptで加速度を表示したこともありますが、iPhoneにしたのが2017年末と遅く、放置ネタでした。いまではブラウザのセキュリティーが厳しくなり、javascriptで加速度を表示することさえ面倒になってしまいましたし、そもそも、スマホのブラウザでは、ログを取ることが困難そうです。