OGIMOノート

7歳の娘と、5歳の息子(脳性麻痺)を持った父親エンジニアの備忘録。自作の電子工作おもちゃ/リハビリ器具/ロボット関係の製作記録、勉強記録を残していきます

M5Stack+Blynkを使って、お父さん帰宅連絡「今から帰る~」を簡易化してみた

f:id:motokiinfinity8:20190413222345j:plain

はじめに

先日作成した『おとんスケジューラ』をキッチン横に導入して、少しずつお父さんのスケジュールが家族と共有できる様になってきました。そこで、その続きとして、お父さんが退社後の帰宅連絡「今から帰るよ~」を簡易化する手段を検討し始めました。

普段の平日、仕事を終えて会社を出る際にLINE等で妻に「今から帰るよ~」を送っていたのですが、メッセージを送付する事を忘れる事が多いんですよね。また、ちょうど妻が子供にご飯を介助している時などはスマホを手放してる事も多く、タイムリーに伝わらない事が多発してました。LINEメッセージを日々送れば済む話なのですが、LINEを開いてメッセージを送るって操作も意外と忘れがち。
特に私の場合、仕事後は結構考え事をしたり明日のアクションを整理しながら帰るので、ついつい連絡メッセージを送る事を忘れてしまうのです。

たかが一言の連絡! されど一言の連絡!

こういう日々のすれ違いが積み重なると色々とトラブルになりかねないので、ここを少し対策してみよう!
  
という事で、忘れんぼうな自分をサポートするため、
「『今から帰る』連絡を簡単にするツール」を作ってみました。



完成品
完成したモノはこちら
f:id:motokiinfinity8:20190413222345j:plain


  
スマホアプリの1ボタンを押すと自宅リビングに設置した液晶ロボットに音声お知らせスマホGPSを連動させて最寄駅に着いたら自動で通知もできる!
・言い出しにくい「今日ごはんいらない」も1ボタンで通知可(笑)

通知先の液晶付ロボットは以前にM5Stackを使って開発した
『お湯張り押しボタンロボット+おとんスケジューラ表示』
を機能拡張する事にしました。

ogimotokin.hatenablog.com
ogimotokin.hatenablog.com


新しく製作する場合でも、M5Stackを購入するだけで作成できるので、とても便利です。

システム全体図

自宅外から自宅のM5Stackへ情報通知するにはいくつか手段があります。
前回の『おとんスケジューラ』では、AWS Lambdaを経由して情報通知しました。最初は前回同様のシステム案を考えていましたが、Web上で調査してみたところ、もっと簡単にスマホ~M5Stack間を連結できるアプリとして『Blink』を見つけたので、今回はこれを使ってみようと思います!

f:id:motokiinfinity8:20190420003404j:plain

結果として、Blynkを使って正解でした!
わずか2時間程度の試行錯誤で、あっさりとスマホからボタン通知が出来たので、本当に驚きました!すごいよ、これ!!

何がすごいかというと……
 ・M5Stack側ソースはほとんどサンプルコードを埋め込んだのみ (Blynkサーバーとの認証のみ)
 ・スマホ側は、Blynkアプリを使ってドラッグ&ドロップ作業程度で通知ボタンを作成できる

という簡単操作で、宅外からのスマホによる遠隔操作を実現できるので、これは本当にすごい!!


スマホ制御は難しそうに見えますが、これは世の中に簡単にマイコンスマホ連結できるツールがあります。(Blynk というアプリを使いましたが、すごく便利!)
  

Blynk導入

Blynkの使用にあたって、基本的に下記サイトに従って試してみました。
www.mgo-tec.com

ざっくりした手順としては
 ①スマホにBlynk アプリをインストール
 ②Blynkアプリにてアカウントの登録
 ③Blynkアプリにてプロジェクト作成
 ④Blynkから自分のメールアドレスに送ってきたメールを
  元にAuthコード入手 & Arduino用ライブラリ入手
 ⑤BlynkライブラリをAruduino開発環境に入れる
 ⑥M5Stack用Arduinoコードを作成する。その際に④で入手したAuthコードを記載する

という流れ。
そして、⑥後にサンプルコードをコンパイル、と思いきや、、、エラー発生しました。。。

C:\***\Arduino\libraries\M5Stack\src/utility/M5Timer.h:34:35: note: previous declaration as 'typedef class std::function<void()> timer_callback'
 typedef std::function<void(void)> timer_callback;

むむむ、とgoogle先生に聞いたところ、どうやらtimer_callbackがかぶっている模様。

M5Stack and Blynk | M5Stack Community

上記サイトを参考にArduino/libraries/M5Stack/src/utility/M5Timer.h 関数を修正してみました

//typedef std::function<void(void)> timer_callback;
typedef void (*timer_callback)(void);
typedef void (*timer_callback_p)(void *);

これで無事に使用できる様になりました。良かった~

M5Stack側コード

以下がBlynkサーバーから通知情報を受信するコード。
簡易化のため、我が家ロボット固有のサーボ動作ソフトや、お父さんのスケジュール通知ソフト(from AWS Lambda)は省略しています。
ちなみに、AWS Lambdaからの通知処理も並列して実行可能です。素晴らしい。

コードのイメージとしては、
 ・仮想ピンV0 : スマホの「今から帰るボタン」を押された通知
 ・仮想ピンV1: スマホGPSが自宅に近づいた事を検知する通知
 ・仮想ピンV2: スマホの「今日ごはんいらないボタン」を押された通知
になります。

#include <M5Stack.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <Avatar.h>
#include "time.h"
#include <BlynkSimpleEsp32.h>

#define BLYNK_PRINT Serial
const char* auth   = "xxxxxxxxxxxxxxxxxxxx"; //Blynkから送られてきたメール内にある Auth コード
const char* ssid     = "xxxxxxxxxxxxx";
const char* password = "xxxxxxxxxxxxxxx";

//M5 Avatar
using namespace m5avatar;
Avatar avatar;

// Audio speaker
#include "AudioFileSourceSD.h"
#include "AudioFileSourceID3.h"
#include "AudioOutputI2S.h"
#include "AudioGeneratorWAV.h"
AudioGeneratorWAV *wav;
AudioFileSourceSD *file;
AudioOutputI2S *out;
AudioFileSourceID3 *id3;

void setup(){
  M5.begin();
  Serial.begin(115200);
  delay(10);

  // Blink起動
  Blynk.begin(auth, ssid, password );

  // アバター設定
  delay(500);
  M5.update();
  M5.Lcd.clear();
  avatar.init();
}

void loop(){
    // Blynk更新
    Blynk.run();

    M5.update();
}

// BLYNKサーバーから帰宅通知(v0)を受けた場合
BLYNK_WRITE(V0){
  int val = param[0].asInt();
  if(val == 1){
    display_information("return_home"); 
  delay(3000);
  view_change = 1;
  }
}

// BLYNKサーバーからGPSトリガ通知(v1)を受けた場合
BLYNK_WRITE(V1){
  int val = param[0].asInt();
  if(val == 1){
    display_information("return_home");
  delay(3000);
  view_change = 1;
  }
}

// BLYNKサーバーからごはん不要通知(v2)を受けた場合
BLYNK_WRITE(V2){
  int val = param[0].asInt();

  if(val == 1){
    display_information("cancel_dinner");

  delay(3000);
  view_change = 1;
  }
}

void display_information(String str){
  M5.Lcd.drawJpgFile(SD, "/avatar2.jpg");
  Serial.println("お父さん予定音");
  //お父さん情報音再生①(ピンポンパン)
  file = new AudioFileSourceSD("/pinpon.wav");
  wav = new AudioGeneratorWAV(); 
  wav->begin(file, out);
  while(wav->isRunning()){
         if (!wav->loop()) wav->stop();
  }

  //お父さん帰宅音再生
  M5.Lcd.drawJpgFile(SD, String("/" + str + ".jpg").c_str());
  file = new AudioFileSourceSD(String("/" + str + ".wav").c_str()); 
  wav = new AudioGeneratorWAV(); 
  wav->begin(file, out);
  while(wav->isRunning()){
         if (!wav->loop()) wav->stop();
  }
}


かわいいイラストは前回の『おとんスケジューラ』と同様に、
表示画像についてはパワポで作成してJPEG形式で保存&縮小して使用しています。

f:id:motokiinfinity8:20190420002146j:plainf:id:motokiinfinity8:20190420002150j:plain

Blynk側アプリ設定

Blynk側は大きく3つのウィジェットを使いました。
ちなみに、Blynkのウィジェットは2000Point分は無料で使えます。そこから使ったウィジェット分だけ差し引かれてしまい、2000Point以上使いたい場合のみ課金するという仕組みです。一度使ったウィジェットも使わなくなった場合は再度ポイントに還元できるので、お試し導入もしやすく敷居低く始める事ができるのもメリットですね。

①今から帰るボタン
 これは「Styled Button」ウィジェットを使いました。仮想ピンをV0に設定して、「0: まだ帰れない」と「1: もうすぐ帰る」をボタン押すたびに交互にスイッチする仕様としました。

f:id:motokiinfinity8:20190420004521j:plain
f:id:motokiinfinity8:20190420004528j:plain



GPS通知ボタン
 これはGPS Trigger」ウィジェットを使いました。仮想ピンをV1に設定して、「自宅近辺の設定エリア内にスマホGPSが入った場合」に1を通知するスイッチです。(写真上は、大阪の中心場所を自宅と仮定して設定しています)

f:id:motokiinfinity8:20190420004546j:plain
f:id:motokiinfinity8:20190420004550j:plain




③ごはんいらないボタン
 これは①同様に「Style Button」ウィジェットをつかっています。仮想ピンはV2に設定する事で、①とは異なるアクション(音声呼び出し)を実現しています。

最後に

今回は、M5Stack に Blynkアプリを使う事で、自宅内のM5Stackデバイスを自宅外から遠隔操作する手段を実現しました。
同様の手段は、Obnizというデバイスでも実現できますが、液晶&スピーカを活かした遠隔制御をすぐに作れるという観点で『M5Stack+Blynkアプリ』はとても良い組み合わせだと思います。

このBlynkアプリの仕組みを応用すれば、自宅外のM5Stack等のマイコンバイスと、自宅内のM5Stackデバイスを遠隔同期や遠隔制御する事も可能そうです。(既に簡易実験済)
マイコン同士の宅外連携が出来れば応用の幅が一気に広がるので、どんなアプリケーションの応用ができるのか、実際に作りながら試していきたいと思います。既に応用事例に取り組んでいますので、また次回に記載したいと思います。