Raspberry Piで家電の消費電力をロギングしたい。そう思ってパーツ買ったのに1年以上放置していました。さすがに家の暖房を入れる季節になってしまったため、重い腰を上げてとりかかろうと思います。
構成の中心はSPI接続したA/Dコンバータとソフトウェア。まずは基礎的な部分から始めます。
Raspberry Piにアナログ入力をする
使った機材はRaspberry Pi Type BにRaspberryHabu+12ビット8ch ADコンバータ MCP3208、最新のRaspbian。あとはブレッドボードに配線材、抵抗が少々。
Download Raspbian for Raspberry Pi
Raspbian Jessie
Based on Debian Jessie
Version: September 2015
Release date: 2015-09-24
Kernel version: 4.1
通常通り起動したRaspbianにてraspi-configを実行し、”Advanced Option”(だったかな?)の中から”SPI”を有効にします。
その後、ラズパイとMPC3208を接続(記事後半の図を参照)し、その先に10kΩの半固定抵抗を接続しました。半固定抵抗は足が3本あるうち両端をそれぞれVCC(3.3v)、GNDに接続(極性は気にせずどちらでもOK)し、真ん中の端子をch0(1pin)につなげます。
下の写真に写っているRaspberryHabuはついでに使っているようなものなので、直接MCP3208をGPIOにつなげても問題ありません。
そしてA/Dコンバータの入力をRaspberry Piで受けるプログラムはPythonで書いた記事が多いなか、Rubyでやってる良記事を参考にさせてもらいました。
各ビットの説明もあってわかり本当やすい。
MCP3208はVREFに入力した電圧=今回は3.3vを100%として、各chの入力を12bit(4096段階)の値に分解する事ができる。そしてRaspberry Piから3byteの設定データをクロック付きで入力すると、3byteの出力データが還ってくると。
GPIOを扱うライブラリにはpi_piper · GitHubが利用されています(Event driven Raspberry Pi GPIO programming in Ruby)。解説にあるとおり、Rubyを淹れてGemでpiperをインストール。
sudo apt-get install ruby ruby1.9.1-dev
sudo gem install pi_piper
しかしエラーを吐いてストップ。
root@raspberrypi:~# sudo gem install pi_piper Fetching: ffi-1.9.10.gem (100%) Building native extensions. This could take a while... ERROR: Error installing pi_piper: ERROR: Failed to build gem native extension. /usr/bin/ruby2.1 extconf.rb mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h extconf failed, exit code 1 Gem files will remain installed in /var/lib/gems/2.1.0/gems/ffi-1.9.10 for inspection. Results logged to /var/lib/gems/2.1.0/extensions/arm-linux/2.1.0/ffi-1.9.10/gem_make.out root@raspberrypi:~# ^C
ヘッダファイルが見つからないとな。”mkmf.rb can’t find header”でググると、どうやらruby2.1-devも必要な様です。無事にpiperのインストールが終わったら、MCP3208の0ch(1pin)に半固定抵抗を接続し、サンプルファイルをsamble.rbとして保存。実行してみました。
root@raspberrypi:~/piper# ruby sample.rb 0.0 % 0.0 % 0.0 % 5.641025641025641 % 10.476190476190476 % 20.757020757020758 % 32.869352869352866 % 49.5970695970696 % 64.24908424908425 % 78.63247863247864 % 87.37484737484738 % 96.06837606837607 % 100.0 % 100.0 %
おお、無事取れてる。なんてシンプル。半固定抵抗をひねっていくと1pinの電位が0V~3.3V(VREF)まで変化するため、それをデータに変換して0%から100%まで表示します。
これでA/D入力の基礎環境は完成。
クランプセンサで100Vを測る
いよいよ本命。ケーブルと流れる電流を切断せずに測定できる超小型クランプ式交流電流センサ(φ10/80Arms)| 株式会社ユー・アール・ディーを使いました。このセンサとMCP3208との間にメーカーが出している3.平均値整流型電流変換回路を入れ、交流の値を正相・平滑化して計測させます。
物理的な配線の様子。手前の白いのがCTL-10-CLSで、100均に売っているACアダプタをタップに挿す為のミニ延長ケーブル(なんて言うんだ・・・)の真ん中を裂き、片側にだけクランプしています。
それを実体配線図で書いたのがこちら。(Fritzingナイス)
MCP3208に対するこの回路の出力電圧EOは
出力電圧 E0=0.9・K・I0・RL/n(VDC)
(0.9:Vrms→VDC変換定数)
との事。この時今回の環境では
- n(巻線回数)=3000
- RL=1kΩ
- K(結合係数)=0.98(特性図より読み取り。RL=1kΩの安定時として)
- VREF=3.3V
なので測定したい電流Ioを求めるには
EO=0.9×0.98xIOx1000/3000
↓
Eo=0.88xIOx0.33
↓
Io=Eo/0.29
となります。
消費電力を明示した機器を手元で探した所、gootのハンダゴテ TQ-95があったのでこれをサンプルにしました。安定時15W、クイックスイッチ使用時(ブースト)は90Wと情報にかかれています。実際に図って、上の式に当てはめて計算してみた結果がこちら。
安定時 | ブースト時 | |
製品表記 | 15 W | 90 W |
計測時の%表示 | 1.19 % | 12.47 % |
計算結果:V(Eo) | 0.03927 V | 0.41151 V |
計算結果:A(Io) | 0.13541 A | 1.419 A |
計算結果:W | 13.54 W | 141.9 W |
安定時はいいとして、ブーストは150W近い・・・突入電流があるんでしょうか。
参照したサイトのソースにこの計算式をあてはめました。そしてワタクシRubyデビュー。
require "pi_piper" RESOLUTION_AT_12BIT = 0b111111111111.to_f.freeze #Power Factor pf = 0.9 #Vref:MCP3208 Refarence voltage ( pin 13) v_ref = 3.3 #Register rl = 1000 #Coupling constant kt = 0.98 #coil turn turn = 3000 PiPiper::Spi.begin do |spi| loop do _, center, last = spi.write [0b00000110, 0b00000000, 0b00000000] center = center & 0b00001111 center = center << 8 value = center + last eo = ( ( value / RESOLUTION_AT_12BIT ) * v_ref ).round(4) io = ( eo / ( rl.to_f / turn.to_f * 0.9.to_f * kt ) ).round(4) pow = ( 100 * io * pf ).round(4) day = Time.now day = day.hour + 9 puts "#{Time.now.strftime("%Y-%m-%d %H:%M:%S")}, #{eo} V,#{io} A,#{pow} W," sleep 1 end end
eoは電源電圧ではなく、クランプセンサの出力電圧。電力を計算するときは決め打ちで100Vとしています。力率(Power Factor)は適当に0.9。位相図ってないしその回路を組み込む予定もないので、永遠の「簡易」電力計になります。
そして実行結果。
root@raspberrypi:~/piper# ruby sample.rb 2015-10-26 21:35:09, 0.0 V,0.0 A,0.0 W, 2015-10-26 21:35:10, 0.0 V,0.0 A,0.0 W, 2015-10-26 21:35:11, 0.0 V,0.0 A,0.0 W, 2015-10-26 21:35:12, 0.0 V,0.0 A,0.0 W, 2015-10-26 21:35:13, 0.1209 V,0.4112 A,37.008 W, ←はんだごて接続 2015-10-26 21:35:14, 0.1152 V,0.3918 A,35.262 W, 2015-10-26 21:35:15, 0.108 V,0.3673 A,33.057 W, 2015-10-26 21:35:16, 0.1032 V,0.351 A,31.59 W, 2015-10-26 21:35:17, 0.0983 V,0.3344 A,30.096 W, 2015-10-26 21:35:18, 0.0943 V,0.3207 A,28.863 W, 2015-10-26 21:35:19, 0.0911 V,0.3099 A,27.891 W, 2015-10-26 21:35:20, 0.0878 V,0.2986 A,26.874 W, 2015-10-26 21:35:21, 0.0854 V,0.2905 A,26.145 W, 2015-10-26 21:35:22, 0.0838 V,0.285 A,25.65 W, 2015-10-26 21:35:23, 0.5979 V,2.0337 A,183.033 W, ←ブーストON 2015-10-26 21:35:24, 0.6399 V,2.1765 A,195.885 W, 2015-10-26 21:35:25, 0.5649 V,1.9214 A,172.926 W, 2015-10-26 21:35:26, 0.5125 V,1.7432 A,156.888 W, 2015-10-26 21:35:27, 0.4747 V,1.6146 A,145.314 W, 2015-10-26 21:35:28, 0.4456 V,1.5156 A,136.404 W, 2015-10-26 21:35:29, 0.4223 V,1.4364 A,129.276 W, 2015-10-26 21:35:30, 0.4037 V,1.3731 A,123.579 W, 2015-10-26 21:35:31, 0.3884 V,1.3211 A,118.899 W,
ブーストONにすると瞬間的かなり上がるものの、1秒毎に落ちていき変化も安定します。電熱器とかもっとシンプルな機器があればわかりやすいかと思うので、もうちょっとサンプルを増やして計算式(主に力率)の妥当性を確かめたいと思います。
今回ので電流→電力の測定の基礎部分は終了。あとはRaspberry PiをWi-Fi化し、家のブレーカーボックスに入れるところまでやろうと思います。その時は数字の羅列じゃなくて、何かしらのグラフサービスに出せるといいかもしれない。