この記事はIoTLT Advent Calendar 2018 neoの12月3日の記事です。
最近手持ちの電子機器類が絶不調なユーリと申します。大学生やってます。文理融合というナウでヤングなな学部にいるので理系とも文系かは自分でもよくわからないです。
そんななんちゃって理系学生なので、このあいだスイッチサイエンスのCTセンサというのを使ったのですが、あまりネット上に情報なくて苦労したのと、またとりあえずそれっぽい値を出すようになったのでそのことを紹介させていただければなと思います。
CTセンサとは
スイッチサイエンスで売っているこういうやつです。
テーブルタップに流れているような、交流の電流の量をはかることができます。
トランスのように(というかトランスとほとんど一緒なんですが)センサーの中に鉄心とコイルが入っていて、延長コードの電流 -(電磁誘導)→ 鉄心 -(電磁誘導)→ コイル のカタチで電流が伝わるので、コイルの側流れた電流(が負荷抵抗にかけた電圧)をArduinoで測定することで、延長コードの中に流れる電流の量を計測することができます(であってるはず)。
一つ注意点として、上の写真だと分かりづらいのですが、テーブルタップから出ている導線が2本(それがくっつけられた状態になっている)あると思うのですが、、そのうちの1本だけ(どちらでも構わないです)をセンサーに挟む必要があります。
片方の線がコンセント(発電所)から家電機器へ向かう線、もう片方が家電機器からコンセント(発電所)へ戻る線で電流が流れる方向が異なり、2本とも挟んでしまうと双方の磁界を打ち消し合って電流が正常に測定できなく(というより理論上は実際には15A流れたとしても計測値は0Aに)なってしまします。
回路図
回路図はこのような形になります。
大きく分けてセンサーの部分(水色の部分)と電源の部分(赤色の部分)の2箇所に分けられます。
センサー部分
まずスイッチサイエンスのCTセンサーなんですが、Arduinoに接続する部分が3.5mmジャックになっています。
(https://www.switch-science.com/catalog/840/ より)
これをブレッドボード上で利用するためにスイッチサイエンスのピッチ変換基盤を利用しました。GNDが根元(ケーブル)側のセンサに接続する部分、TSH・TIPが端子先端側のセンサーと繋がる部分とつながっています。
スイッチサイエンス先生曰く、センサーの両端に10Ω抵抗をはさめとのことだったので、それを入れています。
極性は今回逆でも問題ないので、片側をArduinoのA0端子に、片側を電源の部分の回路に接続します。
電源部分
他の多くのセンサーと同様に、このセンサーもArduinoで電圧を計測することにより、測定値を読み取ることができます。
ただ、こいつは0V以下、-(マイナス)の電圧を取りうるので、予め基準となる電圧を作り、そこから何V上がったか下がったかでこのセンサの値を読み出すことにします。
今回は基準電圧として2.5Vを用意します。そこらへんに転がっていた10kΩ抵抗を2つ使って、Arduinoの5Vを分圧し、2.5Vを作り出します。
GNDと2.5Vの点と間の抵抗と並列に接続してあるコンデンサはノイズ除去用で、これがないとノイズが乗りすぎて、ろくに計測ができなかったです。ただコンデンサはそのへんに転がっていたものを適当につけただけなので、容量はもっと適切なものがあるのかもしれないです。
回路は部品点数はたいしてないので、実際にブレッドボード上に組むとだいたいこんな感じになります。
(写真に写ってる赤いのがArduino互換機です。)(こいつは3.3V駆動なのですが、記事は普通のArduino UNO等とおなじく5V前提で書いています。)
計測プログラム・・・のまえに測定値がどうなるか
データシートによると、このセンサは(負荷抵抗として10Ωの抵抗を接続したとき)延長コードに10A(≒1000W)の電流が流れると、ArduinoのA0端子に50mVの電圧がかかります。
今5A(≒500W)テーブルタップに流れると、Arduinoに25mVの電圧がかかる・・・というのはある意味では間違えではないのですが、大半の人とが思っている通りにはなりません。
というのもコンセントを流れる電流は交流なので、常に電圧とともに電流も変化しています。その結果として、Arduinoも毎秒50Hzとかで電圧が上がったり下がったりします。
そこで、家電機器の消費電力というと電流の平均をとったものになると思うので、それを求めます。
時間で積分して単位時間ごとの平均に直します。
今回電流を1msごとに(1000Hzで)サンプリングし、1秒間の区間を、時間で積分します。
これが平均電力となるので、これに日本の家庭用電源の実行電圧100Vを掛け合わせたものを、今回は消費電力にします。
ソースコード
#include <FlexiTimer2.h>
volatile long count = 0;
volatile int freq = 50; //50Hz
volatile double analogPinStatus;
volatile double ammeter;
volatile double dt = 0.001;
volatile double ammeterSum = 0;
volatile double realAmmeter = 0;
volatile double voltage = 100.0;
void getAmmeterValue(){
analogPinStatus = analogRead(0);
ammeter = (analogPinStatus - 511.0) * 4.9 * 0.2 ;
ammeterSum = ammeterSum + abs(ammeter) * dt;
if(count%1000 == 0){
realAmmeter = ammeterSum;
ammeterSum = 0;
}
count++;
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
FlexiTimer2::set(1, getAmmeterValue);
FlexiTimer2::start();
}
void loop() {
// put your main code here, to run repeatedly:
Serial.print(realAmmeter * voltage);
Serial.println("W");
delay(1);
}
FlexiTimer2を使って1msごとにタイマー割り込みを行って、サンプリングを行っています。
1000回分、1秒分のデータを取り終わったらそれが(1000回分足し合わせたものが)平均電力となるので、これに日本の家庭用電源の実行電圧100Vを掛け合わせたものを、今回は消費電力にします。
これをloop()でおおむね1秒毎にシリアル通信で読み出せるようにしました。
ワットチェッカーとの消費電力の比較
いくつかの電化製品の消費電力をサンワサプライ TAP-TST5で計測した値と比較しました。
まぁ一応それっぽい値はでてますね。。。
以上になります。ここまで読んでいただいてありがとうございました!
備考: 今回使用した部品リスト
CTセンサ *1
3.5mジャックをブレッドボードにさせるようにするやつ *1
10Ω 金属皮膜抵抗 *1
10kΩ 金属皮膜抵抗 *2
0.1uF コンデンサ *1
Arduino Uno *1
ブレッドボード *1