memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

電流センサーで電流を計測してみる(その1)

寒くなると電気製品をよく使うのでブレーカーが落ちないかヒヤヒヤしたりします。でも、あとどれくらい余裕があるのかわかりません。で、そんな装置は今なら売ってるだろうと探してみるといろいろありました。例えば、以下です。

電力モニター

電力モニター

1万円か。。。微妙な値段です。

作ったら安いかな?と思って調べるとチャレンジした方がたくさんいるんですね。で、それを真似してみましたよ、という話です。

回路は以下を参考にしました。

Arduinoで電力計:自分の家の電気の利用パターンを知りたい - IoTラボ

ソフトは以下を参考に(というかそのままもらいました)

家庭で消費電力を計測する。Arduino,XBee,クランプ式電流センサ

電流センサーはモノタロウが一番安かったので購入。あとは100オームと4.7kオームの抵抗でした。コンデンサは買ったけど利用していません。

コードは以下の通りです。

//電流センサーから電力等を計算するコードは以下のURLを参照しました。
//http://tyk-systems.com/PowerMeasure/PowerProgram.html

#include <MsTimer2.h>
#include <Bridge.h>
#include <BridgeServer.h>
#include <BridgeClient.h>

BridgeServer server;

int aveN = 10;
int sumN = 100;

float sensV0 = 0;
float sensV1 = 0;
float sensV0ave = 0;
float sensV1ave = 0;
float SumW = 0;
float Read0 = 0;
float Read1 = 0; 

float Coeff = 0.1464; //ArduinoのAnalogInputの値を電流値(A)に変換する係数
//電流計は1mV=30mA設定。電圧計測5.0V=1024

void setup() {
  pinMode(13, OUTPUT);
  
  MsTimer2::set(500, calcEP);
  MsTimer2::start();    

  Bridge.begin();
  server.listenOnLocalhost();
  server.begin();

  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
}

void led13_flash() {
  static int led = HIGH;
  digitalWrite(13, led);
  led = !led;
}

void calcEP() {
  led13_flash();

  sensV0ave = 0;
  sensV1ave = 0;
  for (int j = 0; j < aveN; j++) {
    sensV0 = 0;
    sensV1 = 0;
    for (int i = 0; i < sumN; i++) {
      Read0 = (float) analogRead(A1);
      Read1 = (float) analogRead(A2);
      Read0 = abs(Read0 - 512);
      Read1 = abs(Read1 - 512);
      sensV0 = sensV0 + Read0 * Read0 / sumN;
      sensV1 = sensV1 + Read1 * Read1 / sumN;
    }
    sensV0ave = sensV0ave + Coeff * sqrt(sensV0) / aveN;
    sensV1ave = sensV1ave + Coeff * sqrt(sensV1) / aveN;
  }
  SumW = sensV0ave + sensV1ave; //200Vでは2本の端子の和で総電力量となる。
}

void loop() {
  BridgeClient client = server.accept();

  if (client) {
    String command = client.readString();
    command.trim();
    if (command == "power") {
      client.println("Status: 200");
      client.println("Content-type: text/plain");
      client.println("Access-Control-Allow-Origin: *");
      client.println();
      client.println("<p>sensor1 : ");
      client.println(sensV0ave);
      client.println("(A)</p><p>sensor2 : ");
      client.println(sensV1ave);
      client.println("(A)</p><p>Total : ");
      client.println(SumW);
      client.println("(A)</p>");
    }
    client.stop();
  }
  
  delay(100);
}

Coeffってやつの求め方がよくわからなかったのですが、サイトの説明を何度か読むうちに理解できました。

この電流センサーのサイトに以下の表があります。電流センサーの間に100オームの抵抗を入れましたので、100オームの線をみます。そこで、貫通電流(測る対象)の例えば60Aの出力電圧は。。。2000mVになっていますよね?(交点に赤丸を入れました)。つまり、計測対象の線に60A流れたら100オームの両端には2Vの電圧が発生するということになります。「60A => 2V」 の関係になる。ほぼ線形と考えて、両辺?を2000で割ると「30mA => 1mV」になります。これはあとで使います。

f:id:ke_takahashi:20110413032749j:plain

さらに、電圧の変化をArduinoのAnalogInputで計測するわけです。電圧は5Vで、AnalogInputは0-1023までの1024段階で読み取れますので、5Vを1024で割ると0.00488281になります。つまり、1ステップあたり0.00488281(V)になり、mVにすると4.88281(mV/step)になるわけです。AnalogInputで得た値に、この値をかけてやることでmVがわかるわけです。さらに、上記で求めた関係を使うと、AnalogInputの値(step)
x 4.88281(mV/step) x 30(mA/mV)で、mAに変換することができます。どうせならAで知りたいので。。。1000で割ってやると上記のコード中の「Coeff = 0.1464」が出てくるわけです。はい。面白いですねぇ。

ちなみに上記のコードは、Arduino Yunを使っています。どうせならスマホとかで電流値を確認したいですからね。

さあ、実験です。

私の研究室になぜか大きなブレーカーがあります。実はこれはちょっと離れたところにある演習室のエアコンのブレーカーなんですね。とりあえず電流センサーを黒と赤の線に繋げ、演習室のエアコンを入れに行きました。

f:id:ke_takahashi:20180116205116j:plain

エアコン停止中
f:id:ke_takahashi:20180116205222p:plain

エアコン稼働中
f:id:ke_takahashi:20180116205233p:plain

おおよそ30Aです。ブレーカーをみると30Aなので。。。いい感じです。

さらに、100Vの電気ポットで計測してみました。卒業した学生さんがゼミ室に置いていったものです。

f:id:ke_takahashi:20180116205353j:plain

ポット停止中
f:id:ke_takahashi:20180116205427p:plain

ポット稼働中
f:id:ke_takahashi:20180116205456p:plain

このポットには電力値などが書かれていませんでした。ググって見ると「100V-550W」とありました。

5.46Aいいですね。。。いい感じです。

とりあえず作ったので、自宅で試してみたいと思います。結果が出たらまたご報告します。はい。

ちなみに電流センサーの取り付け方は以下が参考になります。

http://www.ecoichi.com/material/Method_of_measuring_power_energy.pdf