家庭やオフィスでは、省エネや、環境問題への啓蒙活動などのために、電化製品が使う電流値を「見える化」したいニーズがあります。
また、工場では、製造装置の稼働状況監視のために、装置が使う電流値を測定したい場合もあります。
このため、今回は、M5Stackと電流センサを使って、機器が使う電流値を測定できないか、試してみます。
今回使うのは、スイッチサイエンスで購入した「クランプ式AC電流センサ30A」です。
電源ケーブルを電流センサではさむと、ケーブルを流れる電流に比例した2次電流がセンサ側にも流れます。比率は2000:1なので、ケーブルに30Aの電流が流れると、15mAの2次電流が流れる計算になります。
センサの端子の両端に抵抗をつなぎ、抵抗の両端端子の電位差を測定することで、電流値が計算できます。
30A程度までの交流電流を測定でき、測定対象の回路を壊さずに取り付けることができます。
今回は、以下のような回路構成にしました。
ブレッドボードで回路を作りました。AC電流センサは端子がオーディオプラグになっているので、オーディオジャックで接続します。
M5Stackの電源端子(3V3)とグランド端子(G)を、4.7kΩの抵抗ふたつでつなぎ、中間電位を作ります。
電流センサには47Ωの抵抗をつなぎ、その一方の端に先ほど作った中間電位をつなぎます。
電流センサのふたつの端子を、M5Stackの35番、36番端子につなぎます。
M5Stackでは、35番、36番端子のアナログ値を読み取り、両者の差を観測することで、電源コードを流れる電流値を把握できます。
スケッチは以下のとおりです。
M5Stackで読み取ったアナログ値を電圧に補正し、さらに「電源コードを流れる電流値 I = ふたつの端子の電圧の差 V / 47 * 2000」の式に当てはめることで、ケーブルを流れる電流値が計算できます。
#include <M5Stack.h>
int pin1 = 35;
int pin2 = 36;
int count = 100;
void setup() {
M5.begin();
Serial.begin(115200);
pinMode(pin1, INPUT);
pinMode(pin2, INPUT);
}
void loop() {
float total = 0.0;
for(int i=0; i<count; i++) {
float vdiff = (float)(analogRead(pin1) - analogRead(pin2)) / 4096.0 * 3.3; // Vdiff = (val2-val1)/4096*3.3
float current = vdiff / 47.0 * 2000.0; // I = Vdiff/R*ratio, , R=47ohm, ratio=2000
total += pow(current, 2);
delay(1);
}
Serial.println((float)sqrt(total / count));
}
電源ケーブルを電流センサではさみます。
電源ケーブルは2本の線でできていますが、両方をはさんでしまうと2次電流は流れないので、写真のように2本の線の片方だけをはさみます。
今回、電源コードには、ヘアドライヤーをつなぎました。
シリアルプロッタに表示した結果は以下のとおりです。ドライヤーの状態に応じて、波形の大きさが変化しています。
ただ、ドライヤーを停止している時にも、2A弱の電流が流れていると表示されています。
これは、先日調査した(記事は こちら)、M5Stackの電源ノイズが原因ではないかと考えています。
そのため、先日の調査結果をふまえ、「M5.begin」に引数を追加してみます。
1項目めだけを「false」にします。これにより、M5StackのLCDは使えなくなります。
#include <M5Stack.h>
int pin1 = 35;
int pin2 = 36;
int count = 100;
void setup() {
M5.begin(false, true, true, true);
Serial.begin(115200);
pinMode(pin1, INPUT);
pinMode(pin2, INPUT);
}
void loop() {
float total = 0.0;
for(int i=0; i<count; i++) {
float vdiff = (float)(analogRead(pin1) - analogRead(pin2)) / 4096.0 * 3.3; // Vdiff = (val2-val1)/4096*3.3
float current = vdiff / 47.0 * 2000.0; // I = Vdiff/R*ratio, , R=47ohm, ratio=2000
total += pow(current, 2);
delay(1);
}
Serial.println((float)sqrt(total / count));
}
結果は以下のとおりです。
ドライヤーを停止している時の数値が、0.3A程度に低減できました。
なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。
ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。