散歩のおともに ウエアラブルグラスを自作する5 作り方詳細(2)

M5StickcPlusにし、バッテリー問題を若干回避。事前に十分な充電が必要。以下の仕様で1時間は確実に持つ。LCDの明るさにより駆動時間が大きく変わるので、時間などで明るさを使い分けたりするなどして、もう少し造りこむ予定。

 

主な機能(予定含む)

1.加速度センサー(MPU6886)で体の揺れを表示 現状

2.実装中 IFTTTを用い、携帯電話のLINE通知をBlynkでM5Stickへ表示

  M5StickcPlusのボタンで簡易に返信

  Googleドライブに加速度データを上げる

3.さらにできれば、GoogleMAPのナビ案内を前方に表示したい

4.将来的には(もっとも行いたいのは)、携帯電話の画面を分割、スクロールなどして

  画面の動きがカクカクしてもいいので、ひょうじさせたい

 

私のスキルでは、なんとか、2まではできそうな予感

 

3.4はどなたかアドバイスいただきたい

 

1.は、加速度センサー3軸の値を合成し、M5StickCPlusのLCD画面に表示

 一定、加速度以上が続くと(4.8秒の中で)、マリオコインがもらえる(音がする)

 

2.は以下で検討中。

テキストデータを送る方法

qiita.com

IFTTTでLINEの情報を送る仕組みイメージ

protopedia.net

 

1.のプログラム

#include <M5StickCPlus.h>

#define SAMPLE_PERIOD 20    // サンプリング間隔(ms)
#define SAMPLE_SIZE 240     // サンプリング間隔(20) x 画面幅(240) = 4.8s
#define BUTTON_A 37

bool isPause = false;

void setup() {
  M5.begin();
  M5.Lcd.setRotation(1);
  M5.IMU.Init();
  M5.IMU.SetAccelFsr(M5.IMU.AFS_4G);
  pinMode(BUTTON_A, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(BUTTON_A), handleInterrupt, FALLING);

  //M5.Beep.setBeep(4000, 100); // ビープ音設定(初期値)

  //LCD Rotation settings
  M5.Lcd.setRotation(3);
  M5.Lcd.writecommand(TFT_MADCTL);
  M5.Lcd.writedata(TFT_MAD_MV | TFT_MAD_BGR);

  //Text Settings
  M5.Lcd.setTextDatum(4);
  M5.Lcd.setTextColor(TFT_WHITE,TFT_BLACK);
  M5.Lcd.setTextSize(4);
}

float ax[SAMPLE_SIZE];
float ay[SAMPLE_SIZE];
float az[SAMPLE_SIZE];
float accrms[SAMPLE_SIZE];
float accrmsMax; //記憶用

#define X0 5  // 横軸の描画開始座標
#define Y0 70  // 横軸の描画開始座標

// 水平静止で重力加速度1000mGが常にかかることを考慮する
#define MINacc -1000  // 縦軸の最小値 mG
#define MAXacc 3000  // 縦軸の最大値 mG

void handleInterrupt() {
  isPause = !isPause;
}

void loop() {

  if (!isPause) {
    M5.Lcd.fillScreen(BLACK); // 画面クリア
    //M5.update();    // ボタンの状態更新
    M5.Beep.update(); // tone関数で鳴らした音が指定時間経過していたら止める

    for (int i = 0; i < SAMPLE_SIZE; i++) {
      if (isPause) break;
      
      M5.IMU.getAccelData(&ax[i],&ay[i],&az[i]);  // IMUから加速度を取得
  
      ax[i] *= 1000;  // mGに変換
      ay[i] *= 1000;  // mGに変換
      az[i] *= 1000;  // mGに変換
      accrms[i] = sqrt(ax[i]*ax[i] + ay[i]*ay[i] + az[i]*az[i]);
      
      int y1 = map((int)(accrms[i]), MINacc, MAXacc, M5.Lcd.height(), 0);
      M5.Lcd.drawCircle(i+X0, y1/2+Y0, 1, YELLOW);
      delay(SAMPLE_PERIOD);

      M5.Lcd.drawString("TEST", 80, 40);

      if(accrmsMax < accrms[i]) {
        accrmsMax = accrms[i];
      }
    }
      if (accrmsMax > MAXacc) {
        // マリオ コイン
        M5.Beep.tone( 988, 12);//Si2
        delay(100);
        M5.Beep.tone(1319, 12);//Mi3
        delay(250);
        accrmsMax = 0; //4.8秒ごとに最大値リセット
      }
  }
}