FC2ブログ

Raspberry Pi で電力計を作る(2)

前回に引き続き、Raspberry Piで電力計の制作です。

前回は購入したINA226モジュールの組み立てを行い、I2Cのアドレスの設定を行いました。

今回はRaspberry Piに接続して動作テストをしてみます。

まず、準備として、Raspberry PiでI2Cが使用できるように、設定を行います。
まず、/etc/modulesに以下の1行を追加します。

i2c-dev


更に、/etc/modprobe.d/raspi-blacklist.confの1行を以下のようにコメントアウトします。

#blacklist i2c-bcm2708


これでRaspberry Piを再起動すれば、I2Cが有効になります。

続いて、I2Cの操作を簡単に行えるためのツールとしてI2C toolsをインストールします。

sudo apt-get install i2c-tools


これでi2cgetなどのコマンドでIN226のレジスタにアクセスできるようになります。

Raspberry PiのGPIOピンアサインはこちら

I2C関連はPIN3にSDAが、PIN5にSCLがそれぞれアサインされています。これらは内部でプルアップされているそうなのでその配線は不要です。

今回は、Raspberry PiからINA226の電源用および電流・電圧測定テスト用にPIN1から3.3Vを取り出し、INA226に供給するとともに、100Ωの抵抗でグランドに落とす回路の電流値(=33mA)をIN226で測定してみます。

P4060007s.jpg

2014.11.14追記:
繋ぎ方がわからないというコメントを頂きましたので、この実験の接続方法を下に張っておきます。
in226cir2.png
(画像をクリックすると大きな画像が表示されます)
:追記終わり

測定のためのプログラムをperlで書いてみました。


#!/usr/bin/perl

use strict;
use warnings;
use Time::HiRes qw(setitimer ITIMER_REAL);

my ($I2Caddr, $odir, $verb, $arg, $itv);
my (@Vbuf, @Abuf, @Pbuf, $win);
$I2Caddr = '0x40';
$odir = ".";
$verb = 0;
$itv = 1;
$win = 5;
while ($arg = shift) {
if ($arg eq '-a') {
$I2Caddr = shift;
} elsif ($arg eq '-d') {
$odir = shift;
} elsif ($arg eq '-v') {
$verb = 1;
} elsif ($arg eq '-i') {
$itv = shift;
} elsif ($arg eq '-w') {
$win = shift;
}
}

$SIG{ALRM} = sub {
my ($now, $V, $A, $P, $P2, $ofile);
my ($ss, $mi, $h, $D, $M, $Y);
$now = time();

$V = `sudo i2cget -y 1 $I2Caddr 0x02 w`;
$A = `sudo i2cget -y 1 $I2Caddr 0x04 w`;
$P = `sudo i2cget -y 1 $I2Caddr 0x03 w`;

$V =~ s/^0x//; chomp $V;
$A =~ s/^0x//; chomp $A;
$P =~ s/^0x//; chomp $P;

$V = unpack('s',pack('H*', $V)) * 1.25 / 1000.0;
$A = unpack('s',pack('H*', $A)) /1000.0;
$P = unpack('s',pack('H*', $P)) * 0.025;

if (scalar @Vbuf < $win) {
push(@Vbuf, $V);
push(@Abuf, $A);
push(@Pbuf, $P);
return;
} else {
splice(@Vbuf,0,1);
splice(@Abuf,0,1);
splice(@Pbuf,0,1);
push(@Vbuf, $V);
push(@Abuf, $A);
push(@Pbuf, $P);
}

$V = median(@Vbuf);
$A = median(@Abuf);
$P = median(@Pbuf);
$P2 = $V * $A;

($ss, $mi, $h, $D, $M, $Y) = localtime($now);
$Y += 1900;
$M += 1;
$ofile = $odir."/".sprintf("%d%02d%02d.csv",$Y,$M,$D);
if (open(FP, ">>$ofile")) {
printf FP ("%d-%02d-%02d %02d:%02d:%02d, %.2f, %.3f, %.3f, %.3f\n",
$Y,$M,$D, $h,$mi,$ss, $V, $A, $P, $P2);
close(FP);
}
printf("%d-%02d-%02d %02d:%02d:%02d, %.2f, %.3f, %.3f, %.3f\n",
$Y,$M,$D, $h,$mi,$ss, $V, $A, $P, $P2) if ($verb);
};

`sudo i2cset -y 1 $I2Caddr 0x05 0x000a w`;
setitimer(ITIMER_REAL, 1, $itv);

while (1) {
sleep 999999;
}

sub median {
my (@data) = @_;

@data = sort {$b <=> $a} @data;
return $data[scalar @data / 2];
}

指定したディレクトリに年月日.csvというファイルを作り、1秒ごとに測定値を追記していきます。
追記:電流や電圧が0に近い時に値がマイナスになることがあり、値がおかしくなるバグがありましたので修正しました。また、測定値を平滑化させるためにmedian filterを追加しました。

IN226での測定値はレジスタに保存されていますので、i2cgetコマンドでその内容を読めば測定値が得られます。ただ、最初はキャリブレーション値(シャント抵抗に関する値)が0になっているので、そのままでは電流や電力値が0になってしまいます。その係数を書き込むところが

sudo i2cset -y 1 $I2Caddr 0x05 0x000a w


の行です。これをセットすると、電流の値がmA単位で、電力の1/25の値がmW単位でそれぞれレジスタに書かれるようになります。プログラムではこれらをA, W単位に直してファイルに書き込んでいます。IN226で計算される電力は25mW単位でしか分解能が無いので、電圧×電流で計算した値もファイルに書き込んでいます。

実際に動かしてみますと…


2014-04-06 03:50:24, 3.30, 0.033, 0.125, 0.109
2014-04-06 03:50:25, 3.30, 0.034, 0.075, 0.112
2014-04-06 03:50:26, 3.30, 0.033, 0.125, 0.109
2014-04-06 03:50:27, 3.30, 0.034, 0.125, 0.112
2014-04-06 03:50:28, 3.30, 0.033, 0.125, 0.109
2014-04-06 03:50:29, 3.30, 0.033, 0.125, 0.109
2014-04-06 03:50:30, 3.30, 0.033, 0.125, 0.109
2014-04-06 03:50:31, 3.30, 0.031, 0.125, 0.102
2014-04-06 03:50:32, 3.30, 0.034, 0.125, 0.112
2014-04-06 03:50:33, 3.30, 0.033, 0.125, 0.109
2014-04-06 03:50:34, 3.30, 0.031, 0.125, 0.102
2014-04-06 03:50:35, 3.30, 0.034, 0.125, 0.112
2014-04-06 03:50:36, 3.30, 0.031, 0.125, 0.102
2014-04-06 03:50:37, 3.30, 0.031, 0.125, 0.102
2014-04-06 03:50:38, 3.30, 0.033, 0.125, 0.109
2014-04-06 03:50:39, 3.30, 0.033, 0.125, 0.109
2014-04-06 03:50:40, 3.30, 0.031, 0.125, 0.102
2014-04-06 03:50:41, 3.30, 0.033, 0.125, 0.109


電圧は3.3Vと測定されていますし、電流値もほぼ33mAとなっています。電力の値も合っています。これにてテスト成功と言うところです。(この測定値はプログラム修正前のものです)

次回はいよいよ太陽光パネルの発電量を測定してみます。

つづく
スポンサーサイト
line
line

comment

管理者にだけ表示を許可する

配線方法

このINA226とラズベリーパイとの配線がイマイチよく分からないです。あと、ISENSE-と+はどこにつなげれば良いのでしょうか?

Re: 配線方法

この実験の接続方法を本文中に追記しておきました

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

Re: この記事に関して

管理者のみ閲覧可のコメント頂きましたが、返信できませんので公開でコメントさせて頂きます。
INA226で1/10秒や1/100秒でのサンプリングレートで取得したいとの事ですが、この記事に書いている方法ではダメだと思います。
i2c-devを使用してCでプログラムを書く必要があると思います。
http://www.ishikawa-lab.com/RasPi_wattmeter.html
での記事が参考になるかも知れません。上記ページではINA226ではなくADS1115というI2CのA/D変換チップを使っていますが、I2C接続ですので基本的なところは同じだと思います。continuousモードで860Hzでサンプリングしたものを適当に平均して出力しているようです。
line
line

line
プロフィール

夜行虫

Author:夜行虫
夜行虫とは天体撮影等、夜に出歩くのが多いことから名づけました。夜光虫の誤変換ではありません。海に潜ったり温泉浸かったりも趣味です。

line
最近の記事
line
最近のコメント
line
最近のトラックバック
line
月別アーカイブ
line
カテゴリー
line
ブログ内検索
line
RSSフィード
line
リンク
line
ブロとも申請フォーム

この人とブロともになる

line
sub_line