団員から、投げかけられた課題があったので、それに対処できるようなプロトタイプ第1版を「ちょこっと」こさえてみることにいたしました。最近お気に入りのM5Stackを使ってです。プロトタイプ第1版自体は、とっても簡単に作成完了、なんと楽なことか。たかだか数時間の作業時間。ひと昔前、似たようなシステム作るのに何週間もかけていたような気がするのは悪い夢だったのでしょうか?しかし、プロトタイプ第1版は第1版、作りながらいろいろ改良すべき点も分かってきました。
※「IoT何をいまさら」投稿順Indexはこちら
あまり具体的に書いてもマズイそうなので、ちょっと抽象的に「課題」を書きなおすとこんな感じです。
蓋のある入れ物があって、最後に蓋を開閉した時間、それから、それを使って仕事をやったかどうか確認ボタンを押した時間、を離れたところから知りたい。
とりあえず以下のように考えました。
-
- ウエブブラウザから開閉時間と、確認ボタンをプッシュした時間が見られれば、適当なパソコンなりスマホで「知る」ことができるので、プロトタイプはウエブサーバー型とする
- ネットワークにはWiFiで接続
- 蓋の開閉は、装置が蓋に貼り付けられているとして、加速度センサで検出
- 人間が押す確認ボタンはそのままボタン
- 時間は、日本標準時(JST)
M5Stackを使って、上記を実現したのですが、以下のステップによりました。
M5Stackを使ってWiFiに接続し、その上でWebサーバーを実装するためのコードを実装。Arduino IDEのスケッチ例の中にWebServerというカテゴリもあるし、「M5Stack WiFi」などとすれば大量に参考事例が見つかるので何もトラブラずお楽に実装できると思います。このために、インクルードしたヘッダは以下の3つですが、
-
- WiFi.h
- WebServer.h
- ESPmDNS.h
3つ目のESPmDNS.hがなかなかの優れものでした。ローカルなDNSを構築してくれるので、ネットワーク環境の中でIPアドレスをプチプチ打ち込まなくてもM5Stack上のサーバーを名前で呼べるようになります。
WiFi関係で要改良部分と真っ先に思い至ったのが、WiFiのSSIDとパスワードの設定です(複数台の装置を運用すること考えると、上のローカルなDNS上の名前なども装置個別に設定できると便利かも。)第一版は、ベタに文字列を直接ソースに書き込んでしまいましたが、「実運用」考えると
-
- バイナリインストール済の装置で設定できなければならない
- 1度設定したら、電源切れても忘れないで欲しい
です。セキュリティもあるしね、要検討事項。
ネットワークに繋がっているので、時刻についてはインターネット上のntpサーバーにアクセスして、内部のRTCを初期化しておいてやれば日本標準時をいつでも読み出せます。この辺も「M5Stack ntp」などで日本語の参考情報みつかる筈。何も考えなくても正確な時刻に同期できてしまうので便利、便利。
IMUを使用した加速度センサの値の取得については前回、前々回あたりでやっていたので、その辺のコードを流用することにいたしました。方法としては以下のような感じ。
加速度センサの値はTicker使って、とりあえず500ms毎に読み取ることにしました。ずぼらに3軸のうちZ軸だけを使い、Z軸の値が45度以上傾いたと思われる値になったらイベント発生とし、そのときの時刻1を保存します。
eventなるWebページにアクセスしたら、上記の保存時刻1を表示します。
「やりました」ボタンはボタンAに割り当て、loop()の中で、やはりとりあえず500ms毎にボタンを読み取ることにしました。押されていたら、その時の時刻2を保存しておきます。
buttonなるWebページにアクセスしたら、上記の保存時刻2を表示します。
それに加えて、この手のデバイス、ちゃんと動いているのかどうか、死んでいないことを確かめたい、ということがままあります。よくやるのが、何か
ハートビート信号
なるものを決めておいて、生きているよ~んと、誰か指揮者にあたるノードに送信しておく、というもの。今回プロトでは、以下のようにしました。
timeなるWebページにアクセスしたら、そのときの装置の時刻を即座に返す。
その様子がこちら。時刻が報告されるので、その時間に「生きている」ことが分かります。
続いては、人間の押すボタンイベントの確認。まずは、装置起動後、一度も触らずにいたままであると、以下のようにボタン押されていないことが報告されます。
ボタンAを押してみると、ちゃんと「押された」時刻が報告されるようになりました。
次に加速度センサによる傾きの監視イベント。初期化後、静止状態の場合。
90度傾けてみます。
装置を傾けた時刻(蓋がオープンされている期間のもっとも最近の時刻)が報告されました。
蓋とボタンは、今回、ばらばらに表示していますが、両方合わせて時系列で表示した方が分かり易いかも。また、蓋は開いている間、時刻が更新されつづけるけれども、OPENとCLOSEのみ検出して1個にまとめたい感じもします。この辺も要改良事項ですね。
それに、一番は電池の持ちですかね。何も消費電力を下げるような工夫をしていないので、WiFiを使い、センサを動かしなので、内蔵の電池でどのくらい持つのか怪しいです。何か工夫が必須でしょう。
また、今回は手元のM5Stackでソフトのみでプロト作ってみましたが、より小さいM5Stack Cのようなデバイスを使った方が実用に近い感じのテストができるのではないかしらん。場合によっては内蔵のIMUではなくて、外付けの傾斜スイッチのようなものを使った方が電力消費少なくて良いかも。また、WiFi使わず、BTでスマホに接続という手もありますわな。
いろいろ改良すべき点が目白押し。当分遊べる?