3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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では、とてもやりにくいですね。そもそも、運転中では、音表現だけの方が安全でした。やるならせいぜい、フルスクリーンベタ塗りで。

コード

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でつないだ方がよさそう。
①振動でバッテリーが外れやすい?
②スピーカーの消費電力が結構大きい
③バッテリーの劣化が進んでる?(2年ぐらい放置)
④寒くて(氷点下)バッテリーが死んでる?

メモ

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

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?