はじめに
先日作成した『おとんスケジューラ』をキッチン横に導入して、少しずつお父さんのスケジュールが家族と共有できる様になってきました。そこで、その続きとして、お父さんが退社後の帰宅連絡「今から帰るよ~」を簡易化する手段を検討し始めました。
普段の平日、仕事を終えて会社を出る際にLINE等で妻に「今から帰るよ~」を送っていたのですが、メッセージを送付する事を忘れる事が多いんですよね。また、ちょうど妻が子供にご飯を介助している時などはスマホを手放してる事も多く、タイムリーに伝わらない事が多発してました。LINEメッセージを日々送れば済む話なのですが、LINEを開いてメッセージを送るって操作も意外と忘れがち。
特に私の場合、仕事後は結構考え事をしたり明日のアクションを整理しながら帰るので、ついつい連絡メッセージを送る事を忘れてしまうのです。
たかが一言の連絡! されど一言の連絡!
こういう日々のすれ違いが積み重なると色々とトラブルになりかねないので、ここを少し対策してみよう!
という事で、忘れんぼうな自分をサポートするため、
「『今から帰る』連絡を簡単にするツール」を作ってみました。
完成品
完成したモノはこちら
仕事帰りに忘れがちな「今から帰る」連絡を簡単にするツールを作った
— おぎ-モトキ (@ogimotoki) 2019年4月13日
スマホアプリの1ボタンで、自宅リビングに設置した #M5stack ロボットに音声お知らせ。
スマホGPSと連動して最寄駅に着いたら自動で通知もできる!
言い出しにくい
「今日ごはんいらない」
も通知可(笑)#家族のためのモノづくり pic.twitter.com/MZeIkE9Miu
・スマホアプリの1ボタンを押すと自宅リビングに設置した液晶ロボットに音声お知らせ・スマホGPSを連動させて最寄駅に着いたら自動で通知もできる!
・言い出しにくい「今日ごはんいらない」も1ボタンで通知可(笑)
通知先の液晶付ロボットは以前にM5Stackを使って開発した
『お湯張り押しボタンロボット+おとんスケジューラ表示』
を機能拡張する事にしました。
ogimotokin.hatenablog.com
ogimotokin.hatenablog.com
新しく製作する場合でも、M5Stackを購入するだけで作成できるので、とても便利です。
システム全体図
自宅外から自宅のM5Stackへ情報通知するにはいくつか手段があります。
前回の『おとんスケジューラ』では、AWS Lambdaを経由して情報通知しました。最初は前回同様のシステム案を考えていましたが、Web上で調査してみたところ、もっと簡単にスマホ~M5Stack間を連結できるアプリとして『Blink』を見つけたので、今回はこれを使ってみようと思います!
結果として、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形式で保存&縮小して使用しています。
Blynk側アプリ設定
Blynk側は大きく3つのウィジェットを使いました。
ちなみに、Blynkのウィジェットは2000Point分は無料で使えます。そこから使ったウィジェット分だけ差し引かれてしまい、2000Point以上使いたい場合のみ課金するという仕組みです。一度使ったウィジェットも使わなくなった場合は再度ポイントに還元できるので、お試し導入もしやすく敷居低く始める事ができるのもメリットですね。
①今から帰るボタン
これは「Styled Button」のウィジェットを使いました。仮想ピンをV0に設定して、「0: まだ帰れない」と「1: もうすぐ帰る」をボタン押すたびに交互にスイッチする仕様としました。
②GPS通知ボタン
これは「GPS Trigger」のウィジェットを使いました。仮想ピンをV1に設定して、「自宅近辺の設定エリア内にスマホGPSが入った場合」に1を通知するスイッチです。(写真上は、大阪の中心場所を自宅と仮定して設定しています)
③ごはんいらないボタン
これは①同様に「Style Button」のウィジェットをつかっています。仮想ピンはV2に設定する事で、①とは異なるアクション(音声呼び出し)を実現しています。
最後に
今回は、M5Stack に Blynkアプリを使う事で、自宅内のM5Stackデバイスを自宅外から遠隔操作する手段を実現しました。
同様の手段は、Obnizというデバイスでも実現できますが、液晶&スピーカを活かした遠隔制御をすぐに作れるという観点で『M5Stack+Blynkアプリ』はとても良い組み合わせだと思います。
このBlynkアプリの仕組みを応用すれば、自宅外のM5Stack等のマイコンデバイスと、自宅内のM5Stackデバイスを遠隔同期や遠隔制御する事も可能そうです。(既に簡易実験済)
マイコン同士の宅外連携が出来れば応用の幅が一気に広がるので、どんなアプリケーションの応用ができるのか、実際に作りながら試していきたいと思います。既に応用事例に取り組んでいますので、また次回に記載したいと思います。