長期インターン先のオフィスをスマート化しようという動きがあり、そこでエアコンをSlackから操作できたらいいよねという話になりました。
どうやって実装していくかを考えたところ、M5Stackを使うのがよいという結論になりました。
この記事ではスマートオフィス化計画の第一弾と題して、M5Stackでオフィスのエアコンを操作する方法について説明します。
第二弾はこちら
Contents
M5Stackとは
![M5Stack](https://rikei.work/wp-content/uploads/2020/07/写真-2019-11-28-11-04-35-1-1024x768.jpg)
M5StackはESP32(Wi-FiとBluetoothを内蔵するマイコン)、ボタン、ディスプレイなどをプラスチックのケースに詰め込んだモジュールです。
センサモジュールをはじめとしてさまざまなモジュールがあり、拡張性が高いのが特徴です。
M5Stackでエアコン操作する際に使用したもの
ここでは今回使用したものについて説明します。
温度センサ
![M5Stackの温度センサ](https://rikei.work/wp-content/uploads/2020/07/写真-2019-11-28-11-05-42-1024x768.jpg)
M5Stackの特徴である拡張モジュールのひとつです。
サーボモータ
![サーボモータ](https://rikei.work/wp-content/uploads/2020/07/写真-2019-11-28-12-30-02-1-1024x768.jpg)
秋月などで売っているものです。
接続部品(Grove Cable)
画像のような部品でセンサーやモーターをつないでいきます。
自作固定治具
サーボモータのホルダーとセンサのホルダーを3Dプリンターで作りました。
サーボモータの固定治具
サーボモータの固定治具を上の図のように作りました。
ケーブルの分のスペースをあけ忘れ、何度も作り直しました…。
温度センサ用固定治具
温度センサ用の固定治具に関しては、円柱のポジション合わせと大きさ合わせが大変でした。
こちらも何度も作り直しました笑
M5Stackエアコン操作プログラム
ここからはプログラムについて説明していきます。
UI Flowでセンサ情報取得・サーボモータ制御
まずは温度センサーから温度のデータを取るプログラムを書く必要があります。
このときUI FlowというM5Stack独自のWebアプリ的なものを使用しました。
![M5StackのUI Flow](https://rikei.work/wp-content/uploads/2020/06/UI-Flow-1024x353.png)
これを使うと自分でコードを書かずに、直感的にブロックを組み合わせていくだけでプログラムを書くことができます。
このUI Flowでやっていることは、ざっくり言うと次の3点です。
- 温度センサーから温度情報を取得
- MQTTで温度情報をpublish
- トピックをsubscribeしたときorボタンを押したときサーボモーターをまわす
サーボモーターが回る(=エアコンのオンオフをする)タイミングは次の3つのときです。
- 指定した時刻になりsubscribeしたとき
- Slackで指示を出しsubscribeしたとき
- M5Stack本体のボタンを押したとき
苦労した点は、温度情報のデータ形式について理解することです。
json形式で送る必要があったということがまずわからなかったうえに、当時はjsonというものを知らなかったので「マップを作成」やら「key」「value」も使いこなせなかったことが苦戦した原因です。
![M5Stackのmqtt-pub](https://rikei.work/wp-content/uploads/2020/06/mqtt-pub.png)
ほかに困ったこととしては接続が不安定になることがあったことです。
これに関しては今後の改善に期待するしかありません…笑
Node-REDでバックエンド処理
つづいてNode-REDというものを使ってバックエンドのフローを作りました。
![Node-REDとM5Stackの連携](https://rikei.work/wp-content/uploads/2020/06/Node-RED_M5Stack-1024x474.png)
これも先ほどのUI Flowと同じで直感的に使えるものです。
このNode-REDで行ったものは次の4つです。
- 指定時刻になったことを確認
- 温度判定
- 一定温度以下/以上ならエアコンオン/オフ
- Slackに送信
ある指定時刻になったら温度センサーから温度情報を取得し、一定の条件を満たしたらエアコンをつけ、別の指定時刻になったらエアコンを消すというのが基本機能です。
それに加えて手動でオンオフしたときにも対応するようなフローを作りました。
難しかったことは、エアコンがオンなのかオフなのか判定する機能を付ける部分でした。
これをつけないと「一定温度以下」という情報が流れてくるたびに(今回は10秒に1回)サーボモーターがまわってしまい、スイッチが何回も押されてしまいます。
オンオフを判定できると、オンのときは温度情報が流れてきてもスイッチは押さない、といったことができます。
これは最初はどうすればいいのか全然わからず、実装に時間がかかりました。
これを解決するためにはchangeノードというもので元の値を逃がすといったNode-RED特有のクセを理解した作業をしなければならず、ここも苦戦しました。
固定具の自作
つづいてエアコン周辺にサーボモーターを固定する方法を考えました。
市販品に適したものがなさそうだったので、3Dプリンターで固定治具を自作することにしました。
固定治具を作るために、Fusion 360を用いてCADデータを作り、その後3Dプリンタで造形しました。
このとき考慮しなければならなかったのが、3Dプリント時に膨張する可能性があることでした。
例えば、サーボモーターを通す穴の大きさを少し大きめにとっておかないと、全然入らないなんてことがあります。
![治具に入らないサーボモータ](https://rikei.work/wp-content/uploads/2020/07/写真-2019-11-28-17-27-57-1-1024x768.jpg)
ただし固定具なので穴などを大きめに作り過ぎても全然固定できないので、この絶妙なバランスをとることが重要になってきます。
これがなかなか難しく、2~3回はプリント失敗しました…笑
配線
![床下配線](https://rikei.work/wp-content/uploads/2020/07/写真-2019-12-02-10-45-55-1024x768.jpg)
最後に床をはがして配線しました。
完成図
苦難を乗り越えてついに完成させることができました。
![M5Stackでエアコン操作完成図](https://rikei.work/wp-content/uploads/2020/07/写真-2019-12-02-10-50-07-1024x768.jpg)
ボタンを押しても、Slackから指示を飛ばしてもエアコンを操作することができます。
つづき(スマートオフィス化計画第二弾)はこちら
コメントを残す