メインブレーカーが落ちる前にドライヤーを止める

この記事は [おうちハック Advent Calendar 2015](http://qiita.com/advent-calendar/2015/ouch-hack) の11日目の記事です。

昨日は [hasegaw](http://qiita.com/hasegaw) さんの [おうちハックで戦った話](http://d.ballade.jp/2015/12/entrance-monitoring.html) でした。
タイトルだけ見ると、ハックすることに悪戦苦闘した話かなーと思ったのですが、まさかの「おうちハックを武器に戦った話」でした。大事に至らず良かったですね。

ちなみにウチのテレビドアホンはボタンが押されたときに画像付きのメールを送信してくれます。
http://panasonic.jp/door/swd701kl/04.html
普通の製品ですが、これもおうちハックでしようか。
オプションをモリモリ増備すればおうちハック感が増していくと思います。

さて、本題の「メインブレーカーが落ちる前にドライヤーを止める」話です。

#きっかけ

今住んでいる家は契約アンペアが30Aで、電気を使い過ぎるとメインブレーカーが落ちてしまいます。
パソコンはUPSで保護しているのですが、食洗機や炊飯器は保護していません。食洗機の最終工程近くで落ると全部やり直しになってしまいます。炊飯器は中断フェーズから再開してくれるのですが、メシマズになるような気がします。しかし、これら消費電力の多い機器をUPSで保護しようとすると非常に高価なUPSが必要で、しかも物理的に大きいので一般の家庭内に設置することは現実的ではありません。

そこで、メインブレーカーが落ちる前に、重要でない機器を積極的に落とすことでメインブレーカーを落とさないというモノを作りました。とりあえず落とすのはドライヤーを対象とします。
ドライヤーを選んだのは、ブレーカーにトドメを刺すのは大抵の場合ドライヤーであることと、ドライヤーが分電盤の近くにあり、電流センサとの配線が比較的楽だからです。

この後、製作の話は字数が多い割には内容が薄いので、時間のない方は下のほうの「使ってみて」まですっ飛ばすことをお勧めします。

#回路

回路のブロック図は以下のとおりです。

![SmtBrkBlkDiag.png](https://qiita-image-store.s3.amazonaws.com/0/104360/efe79d46-6001-d72b-97c2-18c90c20f2be.png)

緑色のハコが今回作るところ、青のハコが既存のものです。赤い線と青い線は高電圧か低電圧かをなんとなく示しています。

##マイコン
マイコンには今話題のESP-WROOM-02(ESP8266)を採用しました。ご存知の方も多いと思いますが、ざっくり紹介すると、「マイコンにWi-Fiが付いてたったの500円」というものです。電流センサとの接続に必要なADCポートも付いています。
通信機能は、将来オーブントースターや電子レンジも落とす対象とする場合の連携I/Fとして重要となってきます。
Wi-Fi付きでこの値段だといろいろ夢が膨らみます。本プロジェクトもESP8266があったからこそ発動できたといっても過言ではありません。（脳内では作りたかったけど、ESP8266登場以前はコスパが悪くて作る気になれなかった。）

ユニバーサル基板で使うにはブレイクアウト基板が必要となります。今回はcerevoさんの製品を採用しました。

![ESP8266](http://img11.shop-pro.jp/PA01146/458/product/91592223.jpg?cmsp_timestamp=20150707110014
)
http://cerevo.shop-pro.jp/?pid=91592223

アマチュア向け電子部品の各社様からいろいろなブレイクアウト基板が出ています。基本的に接続できれば何でもいいのですが、マイクロテクニカさんのブレイクアウト基板はTOUTのピン(ADC端子)が出ていないことに注意が必要です。

##電流センサ
電流センサはクランプタイプのモノを選びました。配線に傷をつけることなく、パチンと嵌めるだけで電流を計測できます。

![電流センサ](http://akizukidenshi.com/img/goods/C/P-08960.jpg)
http://akizukidenshi.com/catalog/g/gP-08960/

スペックを見ると、30Aで0.1V と、ESP8266の0～1VのADCで使うには向いてなさそうに思えますが、負荷抵抗を標準の10Ωから100Ωに上げると、30Aで1Vになります。実際にはルート2倍になるのと、マージンを残したほうがいいので50Ωぐらいの負荷抵抗を付けるといい感じになります。

##リレー
ドライヤーを止めるためのリレーは、昔ながらのメカニカルリレーを採用しました。

![リレー](http://akizukidenshi.com/img/goods/L/P-06696.jpg)
http://akizukidenshi.com/catalog/g/gP-06696/

今時はSSR（ソリッドステートリレー）を使うものですが、これは結構発熱します。実は買ってきてからデータシートを見て気づいたのですが、電圧降下が2Vもあるので、12A使うドライヤーを接続すると24Wの熱が出ます。これはそこそこのサイズのヒートシンクが必要です。TDP24WのCPUに必要なヒートシンクを想像するとサイズ感が分かると思います。
ヒートシンクが必要のない高性能のものもありますが、結構なお値段します。

3日目の [kopanitsa](http://qiita.com/kopanitsa) さんの [オーブントースター](http://qiita.com/kopanitsa/items/d64cbebdbcd77c5fba2b) のように温度制御が目的でオンオフを繰り返す用途でしたらSSRですが、今回のような月イチ程度の頻度なら安いメカニカルリレーで十分です。

リレーを使う際、NO(ノーマルオープン)か NC(ノーマルクローズ)かを選択しなければなりません。これらは、リレーを駆動しないときにスイッチOFFか、スイッチONかという意味です。フェールセーフ的な考えだとノーマルオープンですが、消費電力を考えるとノーマルクローズがよさそうです。フェールセーフの役割はメインブレーカーに任せることにして、消費電力を優先してノーマルクローズにします。

特にブロック図には書きませんでしたが、リレー駆動用にトランジスタを使っています。

##ケース
回路を入れるケースは、3Dプリンタを使おうと思ったのですが、全部イチから作るのは面倒なので壁付け用のコンセントボックスをホームセンターで買ってきました。
コンセントボックスを壁に固定するための板と、内部の基板のマウンタだけ3Dプリンタを使っています。

![コンセントボックス](http://www2.panasonic.biz/es/content/image_dl/midea/thumbnail/WVC7003W.gif)
http://www2.panasonic.biz/es/ai/products/search/detail?dep=&c=search&item_no=WVC7003W&item_cd=WVC7003W&bh_cd=3&b_cd=301&style=

##組み立て
ショートに気を付けながら、適当に組み立てます。いつもの適当さに比べたらだいぶマシな完成度です。
ACアダプタをコンセントボックス内に納められなかったのがちょっと心残りです。

![DSC_0221.JPG](https://qiita-image-store.s3.amazonaws.com/0/104360/498b6cda-7ea5-4866-ca92-706594e8f610.jpeg)

![DSC_0216.JPG](https://qiita-image-store.s3.amazonaws.com/0/104360/c6e48fb4-fa52-fda7-c2be-ad0e61b9fca5.jpeg)

オレンジ／白 の線は分電盤の電流センサにつながっています。古い（カテ5の）LANケーブルの中身を再利用しています。

#ソフトウェア
ソフトウェアは、1ミリ秒毎にADCから電流値を読み取り、交流の1波毎に実効値（二乗平均平方根）を算出しています。そしてその値が既定値を超えたらリレーを駆動してコンセントへの電源供給を止めます。
また、将来の拡張用にWi-Fiで電流値を送信しています。リアルタイム性を重視して、UDPブロードキャストで送っています。（ただ単に複雑なことを避けているとも言う）

作ってから気づいたのですが、交流の電流を測っているので、マイナスの時もあります。ESP8266のピンにマイナス電圧を入力しているわけで、ハード的に壊れそうな気もしますが、とりあえずは大丈夫のようです。電流値がマイナスの時、ADCはゼロを返します。そのため、ゼロが3回続いたら1波終わったと判定しています。
半波整流の機器があると正しい電流値を取得できないわけですが、大電力の機器で半波整流しているものはないと思うので、今回の用途では多分大丈夫です。
まじめにやるなら0.5Vのオフセットを付けて、という回路にするべきでしょう。。。

#苦労した点
今までサラッと書いてきましたが、ADCを読みつつWi-Fi送信するのに苦労しました。1秒間に1000回のADC読み込みと50回のUDP送信をしているわけですが、起動して数秒で送信が止まってしまいます。そしてWi-Fiの接続が切れたステータスになります。シリアルに出すデバッグログは出続けるので、ADC読み込みは生きているようです。
1秒間に1000回のADC読み込みだけなら問題ないですし、1秒間に50回のUDP送信だけでも問題ありません。

ESP8266の開発環境はNodeMCUとArduino IDEと、生SDKなどがあるのですが、全てて同じ現象が出ます。
最終的に、SDKで用意されているsystem_adc_read() を使わず、ハードを直接叩いてADCを読み取る方法にしました。

ハードを叩く方法は以下のサイトを参考にしました。
http://41j.com/blog/2015/01/esp8266-analogue-input/

どうもSDK自身にバグがあるのではないかと疑っています。
海外の掲示板では、Wi-Fi接続後10秒待ってから送信し始めると落ちないとの報告もありますが、まだ試していません。
http://www.esp8266.com/viewtopic.php?f=32&t=3905

#使ってみて
まだ作ったばかりなので、実用的にリレーが発動したことがありませんｗ
ブレーカーが落ちるとUPS（につながった自宅鯖）がメールを出すのですが、そのメールを検索してみたらブレーカーが落ちるのは年に5回程度しかないことに気付きました。
ただ、実験的に30A弱消費した状態からさらにドライヤーを動してみたときに、ブレーカーより先にリレーが反応してくれることは確認しました。

#発展
今後の発展として、先にも書きましたが、台所にあるオーブントースターと電子レンジも落とす対象とすることを考えています。この場合、電流値が乗ったUDPパケットを別のESP8266で拾い、既定値を超えたらリレーを駆動することになります。

ただ、デバッグ用に電流値を表示させていたのが非常に便利で、今は台所で常に表示させています。電流値を見てオーブントースターや電子レンジを使っていいか **人間が判断する運用がうまくいっている** ので、作る気力が減退中です。

ある人が言いました
**「あきらめたらそこで完成ですよ・・・？」**