先のグラボレビュー記事ではPCの電力を細かく、継続的に測定、記録する必要がありました。
そこで現在ブレーカーの電流測定をしている様に、またRaspberry Piで電力ロガーをしつらえる事に。基本的には同じものを作っただけですが、使用したA/Dコンバーターが変わったため計算式を変えたのと、結果をファイルへに随時値を書き込む形に変えてあります。
そこを自分メモとして記しておきます。
使用したA/Dコンバータは家に余っていたMCP3002。Raspberry Piとクランプセンサで家の消費電力を測ろう(測定部) | 徒労日記にて使ったMCP3208と異なり、解像度が12bitから10bitに、チャンネルが8chから2chに減った8pinDIPパッケージのICです。
100V ACケーブルから電流を読み取る3.平均値整流型電流変換回路は前回と変わらないので元記事をご参照下さい。
こんな感じでPC裏に投げ捨てるように設置。ちゃんと御役目は果たしてくれました。
以下が今回の”rec_epower.rb”のソースです
require "pi_piper" require 'fileutils' RESOLUTION_AT_10BIT = 0b1111111111.to_f.freeze #Power Factor pf = 1.02 #Vref:MCP3002 Refarence voltage ( pin 1 : Vdd share) v_ref = 3.3 #Register rl = 1000 #Coupling constant kt = 0.98 #coil turn turn = 3000 PiPiper::Spi.begin do |spi| loop do upper, lower = spi.write [0b01101000, 0b00000000] value = ( upper * 256 + lower ) & 0x3FF eo = ( ( value / RESOLUTION_AT_10BIT ) * v_ref ).round(4) io = ( eo / ( rl.to_f / turn.to_f * 0.9.to_f * kt ) ).round(4) pow = ( 100 * io * pf ).round(1) puts "#{Time.now.strftime("%H:%M:%S")},#{pow}," fname = "/dev/shm/powerlog_" + "#{Time.now.strftime("%m%d%H")}" + "h.csv" File.open("#{fname}","a") do |file| file.puts "#{Time.now.strftime("%H:%M:%S")},#{pow}" end sleep 1 end end
変更点として、入力の最大値を示すRESOLUTION_AT_10BITが10桁になっている他、SPIにて書き込むデータが8bit x 2の16bitになっています。0b01101000で0chの値を読み取り、0b01111000で1ch。
pf=1.02なのは製品のパワーチェッカに値を似せた結果。
valueはupperに256をかけて8bit上位にシフトさせてからlowerと合算。マスクとして下位10bitだけの値にするため、0x3ffをANDしています。
値が出たらputsで標準出力に出力する他、RAMDISK領域(/dev/shm)にpowerlog_○月○日○時h.csvというファイルを作って1秒ごとにどんどん追記していきます。File.openメソッドで”a”を指定したのでファイルが有れば追記、なければ新規に作成。ファイル名に時間を含んでいるため、1時間ごとに新しいファイルが作成されます。
あとはこれをターミナルを閉じても裏で取り続けてくれるように
sudo nohup ruby rec_epower.rb &
で実行。切るときはps auxでrubyのプロセスを見つけてkill -9で切ります。
出来上がった.csvを今回は手動でGoogle Driveに入れてGoogleスプレッドシートでグラフにしました。Rubyでは直接Googleスプレッドシートにも書き込めるらしいのでは時間があればやってみたかったなぁ。