この記事は
IoTLT Advent Calendar 2017 19日目の記事です。
この前の記事は@masashiokawaさんのエンタープライズIoT事例です。
最近はGoogle Homeにハマっております、nokkiiです。
業務ではIoTの研究、新規事業開発と大規模サーバミドルウェア開発、採用活動などをやっています。最近社内でハードウェア開発を始めたのでmbedを始めとしたARM環境とドライバ、量産経験者を募集していたりもします。ご興味ある方はお声掛けください。
今回はGoogle Homeで作ったスマートホームを自慢したい男たちのハードウェア詳解と言う形でやりたいと思います。
最近APIを生やした家電
トースター
昔作った「好きな焼き色を選んで焼けるトースター」をGoogleHomeから制御できるようにしました
動画では「パンを(時間)にトーストして」と命令を送ると炊飯器の予約のように時間を逆算して、タイマーを掛ける動作をしています。GoogleHomeに「朝ごはんはトーストにして」とお願いすると翌朝7:30にパンを焼いてくれます。課題としてはトースターにパンを刺しておかないといけないので、衛生面に不安がありますが2日くらいなら大丈夫でしょう(多分)。
電気暖炉
Dimplexの電気暖炉にESP32でHTTP APIを生やして制御できるようにしました。このシリーズは炎のゆらめきを水蒸気で表現していて、加湿機能だけ使うこともできます。芯まで冷える季節になったら直接当たれますが、消費電力の割に部屋は温まらないのでいまは加湿器モードにしています。
トースターのハードウェア解説
トースターはTOSHIBA FlashAirで操作しています。
元々のトースターの回路はすごくピタゴラ的に作られています。レバーを下ろすとヒーターが入り、ヒーターの電圧降下とダイオードによってタイマICにDC9Vが入ります。タイマICはタイマーが切れるまでの間電磁石を動かし、自己保持回路の役割をします。なかなかおもしろい仕組みではないでしょうか。 これをFlashAirで制御できるように改造します。楽にするためUSB電源を分解して入れ、3.3Vの三端子レギュレータでFlashAirの電源を作ってやります。FlashAirでリレーをドライブするためにトランジスタを入れ、電磁石をON/OFFします。 回路図には書き忘れてしまいましたが、ヒーターもFlashAirからON/OFFできるようにしており、レバーを下げた時点で電磁石はb接点, ヒーターはa接点で接続されているので初期化処理なしに「レバーを下げているけど、ヒーターは入っていないステート」を実現しています。あとはFlashAirの標準のHTTP APIでON/OFFすることができるのでFlashAir側のAPIはノンプログラミングで実現することができます。具体的なAPIなど、
/command.cgi?op=190&CTRL=0x03&DATA=0x1c
電磁石もOFF
/command.cgi?op=190&CTRL=0x03&DATA=0x1e
ヒーターもON
/command.cgi?op=190&CTRL=0x03&DATA=0x1f
電磁石だけON
configにデジタルIO出力を設定した後、このようにCTRLにWriteするIOピン番号の16進値、DATAにOFFにするマスク値を書くと標準でデジタルIOが動作する。このようにFlashAirを使うと、家電のAPI化がわりと簡単に実現できます。
プログラム
使いようはないと思いますが、焼き色を選んで焼けるトースターのコードは公開されています。サーバが必要だったのをFlashAirのみでの制御に移行しているところなので、とっ散らかっていますが...。
https://github.com/nokkii/good_tooster
電気暖炉のハードウェア解説
電気暖炉にはステートを進めるボタンと電源を切るボタンがあるのでそこのON/OFFを制御します。リレーの制御回路的にはFlashAirと全く変わらないので、間違えてFlashAirと書いてしまいました。ESP32はノンプログラミングとは行かないまでもArduino気分でプログラミングでき、Webサーバのサンプルプログラムも公開されているので5分位のプログラミングで実装することができました。
プログラム
ESP32のサンプルプログラムと殆ど変わりませんが、これも公開しています。改造して遊んでみてください。
https://gist.github.com/nokkii/72c173793d763d66e988c20b230447a6
API
/heat 本体のステートを進めるボタン(加湿→弱→強)
/off 本体のOFFボタン押下
展望として、このマイコン自体にステートを記憶させて双方向に状態を取得できるようにするとグローバルの受け皿になっているエンドポイントのRaspberryPiが持っている暖炉のステートとずれにくくて良さそうです。
明日は@cw-hiramaさんです。よろしくお願いします。