M5StackでAC電流センサを使う

家庭やオフィスでは、省エネや、環境問題への啓蒙活動などのために、電化製品が使う電流値を「見える化」したいニーズがあります。
また、工場では、製造装置の稼働状況監視のために、装置が使う電流値を測定したい場合もあります。

このため、今回は、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の使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。

ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。


このサイトで書いている、M5Stackシリーズ(M5Stack、M5StickCなど)に関するブログ記事を、「さとやまノート」という別のブログページに、あらためて整理してまとめました。

他のM5Stackシリーズの記事にも興味のある方は「さとやまノート」をご覧ください。