Raspberry Pi による電力計サーバ

投稿者: | 2019年11月23日

概要

Raspberry Pi(以下、RPi)を使って、家全体の消費電力を表示するサーバを製作した。 単相200Vのブレーカにクランプメータを接続して電流を計測し、100Vコンセントから 電圧を計測して、両者の積和から電力を算出し、Rubyで書いたCGIで表示する。 PCはもちろん、iPadやiPhoneから閲覧可能。 電流と電圧のレベルは、オペアンプで0-3.6Vにレベル変換し、ADコンバータMCP3204で デジタル化した値をSPI通信によりRPiへ転送する。RPiまで来てしまえば、今回のように CGIで表示しても良いし、定期的にcronで計測して1日、1年の変動データを取得する ことも可能。 配電ブレーカの電流からiPhoneの画面表示まで、データが駆け上がって行く様を体感できる一品。

回路図

電流計測部

電流センサCTL-10-CLSを2個使う。 こちらの参考文献 を参考にさせていただきました。有り難うございます。

ブレーカー容量の50Arms流れた時のセンサ出力電圧が、3.6Vppに収まるように抵抗値を選択。 これは後段のオペアンプLM358が0-5Vの片電源動作時に出力可能な電圧範囲(0-3.6V)に収めるため。

このままでは0±1.8Vであり、ADコンバータが負電圧を読めないため、 別途、生成した基準電圧1.8Vと、電流センサ出力を加算回路で合計し、 ADコンバータが読み込める正電圧0-3.6Vにレベル変換する。 加算回路の抵抗値が独特だが、後述する特殊な事情によるものである。 括弧付き緑色数字が実機の回路の抵抗値だが、今から再製作するとしたら、 黄色数字の抵抗を用いる。

基準電圧1.8Vは、分圧抵抗とボルテージフォロワで作っている。 分圧抵抗だけではインピーダンスが高く、振られてしまう。 レギュレータでは電流が吸い込めないので不可。

(実は当初、電流センサの抵抗を100Ωで製作していたが、試験中にレンジ不足に気づいた。 ピークで70App流れたときに14Vppとなってしまう。抵抗値を1/4にする(22Ωに)必要があるが、 対策として100Ω並列で50Ωにしただけでは足らないので、 加算回路の分圧比を2.2倍(=2.2k/1k=3.3k/1.5k)として重み付けにより1/2.2倍かけた。)

電圧計測部

前述の参考文献では、トランスを用いて減圧している。ここでは上図のようにコンセントプラグ に抵抗器を仕込んで分圧によって電圧レベルを合わせた。この方法は楽だが、回路全体のGNDが 単相100VのN極に接地される。他に接地点は無いためショートの心配はないが、 L極とGNDが接触しないよう注意を要する。

また、基準電圧1.8Vから10kΩを2つ通って3.3kΩに電流が流れ込むため、 0.255VのDC成分が乗ってしまう。 後でRPiで電力算出する際に、DC成分を取り除く処理を行うため、問題とはならない。

電流計測部と同様、正電圧にレベル変換する。

AD変換部

MCP3204というADコンバータを使用した。昔PICでお世話になったMICROCHIP社製のチップであり、 PICとの接続を想定して開発されたものだろうが、SPI通信が可能なので、汎用性が高い。 ArmadilloというLinux搭載ボードにMCP3204を接続し、 SPI通信をする方法とサンプルプログラム が公開されており、RPiでもほぼそのまま流用できた。ただしraspi-blacklist.confのspi-bcm2708をコメントアウトし、/dev/spidev0.0を有効化する必要がある(詳細は他サイト参照)。

main()を改修して、ch0から読み取った値から瞬間電流値を、ch2から電圧値をそれぞれ取得し、掛け算して瞬間電力を算出する。1秒間ほど積算すれば安定した平均電力が求められる。

半田ごてなど、消費電力が既知の物(テスターで抵抗値を測れば分かる)でテスト回路を組み、動作確認をすると良い。どうしても少し値がズレるため、修正係数をここで測っておき、プログラムに反映する。出来たら、色んな電子機器の消費電力を測ってみて、しばらく楽しむ。

RPiによるデータ処理

RPiのアプリケーション層まで電力データが上がって来たので、後はCGIから実行してWebから見えるようにしたり、ファイルに保存するなり、自由である。

2013/06/16 作成 (元ページ