I2C パワーコントロールモジュール


照度計を作っていて、節電のために深夜帯を停止する方法がないか考えました。

初期の32Bit SOCにはあまりPower Save機能はありませんでした。BCMの最後の頃のチップには機能がありましたが、クロックなどの操作も必要で取り扱いが難しそうです。

MIPS 4Kにはwaitインストラクションがありますが蟹さんにはありません。またwaitは効果が限定的です。

以前555でリレーを制御して、ルーターの電源を遅延させる回路を作ったのですが、マイコンで同じようにリレーを制御して、電源をコントロールする方法を思いつきました。

ホストからはI2Cでコマンドを受け付け、指定された時間だけ電源をオフにする回路を作ってみることにしました。

照度計のプログラムからADCのコードを抜き、Timerのコードを追加しました。

RTCのように1秒毎の割り込みのためセカンダリークロックに32.768kHzの水晶を使うことにしました。ちょうど捨ててしまったビデオのリモコンに付いていたので、それを使いました。

自分が中学生のころの汎用トランジスターは2SC945でした。

3.3Vのレギュレータは何かのI2CモジュールからはがしたSOT-23な部品を裏面に貼り付けてあります。パッケージには662Kと書かれてありTOREXのXC6202と思われます。

リレーの接点は2つありますが、オンの状態の利用が多い場合はデフォルトで接続されている方を使い、オフの方が多い場合は接続されてない方を使うのが良いです。

たまたま持ち合わせがあったタカチのSW-50に入れました。

auの蟹さんのアダプタは2種類あり、ケーブルが平ったいものと丸いものがあります。穴をあける楽なので丸いものを使いました。

3つデータを送って60分間電源をオフにするようにmrubyのコードを書いてみました。

リレーの駆動に20mAくらいかかりますが、蟹さんは200mA以上食っていたはずなので、十分効果があります。

一時間おきにデータを収集するIoTモジュールなどでも有効な方法ではないでしょうか。

どうにか動くようになりましたが、PICのI2C Slaveと蟹さんがすこぶる相性が悪いです。:(

蓋を閉じようと思ったら、ジャックの部品とリレーがあたり閉まらなかったので、リレーを少しずらして、どうにか閉まるようになりました。出たとこ勝負で作るので、ケース加工は苦手です。^ ^;

LUNAをやってた頃にある事情で定期的にLUNAの電源を入れる必要があり、秋月のクロックのキットと、リレーで似たような事をやっていた事を思い出しました。

テストしていたところ、起動に失敗してハングすることがありました。Ethernetの対向のポートのログを見ると一度落ちたような形跡があります。

May 14 04:19:21  kernel: ue0: link state changed to UP
May 14 04:19:25  kernel: ue0: link state changed to DOWN
May 14 04:19:27  kernel: ue0: link state changed to UP
May 14 04:21:45  kernel: ue0: link state changed to DOWN
May 14 04:21:47  kernel: ue0: link state changed to UP

うーむ

再現性を確認するために10分おきにしていたところ2回飛ばしたことが確認された。おそらく上記の問題とは別だと思われる。

May 20 02:46:51  dnsmasq-dhcp[98]: DHCPACK(ue0) 
May 20 03:03:35  dnsmasq-dhcp[98]: DHCPOFFER(ue0) 
May 20 03:03:35  dnsmasq-dhcp[98]: DHCPREQUEST(ue0) 
May 20 03:03:35  dnsmasq-dhcp[98]: DHCPACK(ue0) 
May 20 03:16:52  dnsmasq-dhcp[98]: DHCPOFFER(ue0) 
May 20 03:16:52  dnsmasq-dhcp[98]: DHCPREQUEST(ue0) 

46分に起動しているのに50分をやらずに57分に停止命令して58分に停止して、3分に起動して10分は正常処理したようだな。

この時間のネットワークトラフィックは減っていた。

同時間帯に照度計の登録には問題は見られない。

ThingSpeakはどきどき3時くらいにメンテしているようなので、その影響の可能背もあり得るかもしれない。