ESP32で電力計を作るための下準備

published_with_changes 更新日: event_note 公開日:

labelESP32 labelIoT label電力計

暖房をファンヒータから200Vのエアコンに変えてから、ブレーカが良く落ちるようになりました。契約電流が40Aなのに、湯沸ポット、コーヒーメーカー、電子レンジ、こたつなどを一斉につい使ってしまうので、仕方がありません。注意喚起の意味でこの商品をつけてみたのですが、電流表示がないのと更新が12秒間隔なので、いまいち使い勝手が良くありません。そこで目的に合った電流計を作ろうと思いました。

春めいてきたのでエアコンはほとんど電力を食わないようになってきたので、電流計が活躍するのは来シーズンの冬になります。

EMS 100J

ネットで情報を集めていると、下記の記事に目がとまりました。解説的で、なんとなくわかった気持ちになります。電流計ではなく、電圧も測る電力計です。これをまねてみることにしました。

Arduinoで電力を計測し、スマートメーターのデータで検証する - Qiita

Arduinoで電力を計測し、スマートメーターのデータで検証する - Qiita

はじめに、ずいぶん昔の記事ですが、Arduinoで家庭の消費電力を計測する素晴らしい記事、Arduino電力計 - 回路図とスケッチ、こちらの記事を参考にハードを制作し、スケッチを修正した上で実際に運用しています。 しかし...

元になったのはこちらのようです。

なんでも作っちゃう、かも。Arduino電力計 - 回路図とスケッチ

イントロダクション 前回の続き。今回は回路図とArduinoのスケッチについてちょろっと解説します。まだまだ試作の段階なので回路とスケッチは今後も変わると思います。2011/4/26 回路図とスケッチを更新しました。回路図にはサージ対策を追加、スケッチは電力計算精度を向上させました。 電圧の検出には電源トランスを使っています。

消化しきれませんが、とても詳しく書かれている記事もあります。

主要部品

電流センサー

原理、出力電圧

CT方式電流センサの測定原理(AC専用)

CT方式電流センサとは、測定電流を巻線比に応じた2次電流に変換する原理を採用しています。

測定原理:
■ 1次側の測定電流の交流(AC)により、測定電流による磁束(Φ)が磁気コアに誘導され、2次電流による磁束(Φ’)は、2次巻線(N)に、この1次磁束を打ち消すように誘導されます。 この2次電流は、磁束(Φ’)に比例して誘導されます。
■ この2次電流はシャント抵抗に流れ、シャント抵抗両端の電圧が発生します。この電圧は測定導体に流れている電流に比例した出力になります。
引用元:HIOKI 電流センサの原理と技術情報

出力電圧の計算式

Eo=K・r/N ・Io
Eo:出力電圧………(Vrms)
K :結合係数
Io :貫通電流………(Arms)
r :外付負荷抵抗…(Ω)
N :巻数…………(ターン)
において(K=1)が理想CTとなります。
実際には、励磁電流・漏洩磁束・透磁率の変化など、諸々の要因により、CTの結合度は変化します。これを一括してCTの結合係数(K値)と定義し、使用条件により変化する様子を表したものが、結合係数特性図です。〔図-6〕〔図-7〕
この特性図から各CTの使用範囲・精度・直線性などが、より正確に把握できます。


動作原理

図3に示すように、変圧器は1次側と2次側の巻き数比に応じて、1次側に加えた交流(V1)を2次側で任意の電圧や電流に変換することができます。特に電流に変換することを目的としたものを「変流器」と言います。
図3 変圧器の原理

クランプメーターはこれを応用したもので、例えば図4のように1次側の巻数を1回として、2次側の巻数を20回とすれば、1次側に100Aの電流が流れれば、2次側には5Aの電流が流れます。
図4 変流器の原理

引用元:marutsu クランプメータの基礎と使い方

STC-013-050

購入したCTセンサーはSTC-013-050(仕様は50A/1V)です。ネットを探す限り外付負荷抵抗 r や巻数Nの情報はありません。上述の「出力電圧の計算式」で示す結合係数は外付負荷抵抗の大きさに影響を受けるようです。ネットを探索すると、下記のような2V/50Aの特性も出てきます。何が何だかわかりません。だからちゃんと測定してみます。

測定結果(貫通電流とCTセンサ出力電圧)

貫通電流はクランプ式テスターUT210E(精度2.5%:2A/20Aスケールで0.05A/0.5A)で測定した実効値です。CTセンサ出力電圧はオシロスコープで実効値を読み取りました。また、カットオフ周波数72Hz(C=47uF, R=47Ω)のCRローパスフィルタを入れています。負荷はドライヤ、PC電源、LED電球などです。スイッチング電源のACアダプタでは波形がスパイク状になるので使用しませんでした。



このグラフの傾きが出力電圧の式における K・r/N になります。

具体的な数値を見てみます。CT1では、Io = 10 (A) (rms) のとき、近似式では
Eo = 13.823 x 10 + 3.531 ≒ 142 (mV) (rms)となります。
ゲインは、142 / 10 = 14.2 (mV/A) です。

一方、STC-013-050の出力電圧の仕様は 1V/50A = 20(mV/A) ですが、1Vをピーク値と解釈すれば、実効値表現で、20 / 1.41 = 14.2 (mV/A)ですから、この場合の結合係数Kは14.2 / 14.2 = 1.0 です。

同じように数字を当てはめると、CT2の結合係数は K=0.935 になりました。実はCT2は落下させてコアを割ってしまいました。きれいに合わせて組みましたが、その影響が出ていると思います。幸い特性はリニアなのでCT2は実験的に補正して使います。

測定時の波形を示します。3波形ともドライヤ負荷で見たものです。比較的きれいな波形です。2CH(青色)がCT1、1CH(黄色)がCT2です。やはりCT2が低めの値が出ています。

Io = 0.26 A

Io = 6.36 A

Io = 11.3 A


AC電圧センサー

電圧の測定にはトランスを使用します。測定原理は上記で引用した図3,4の項と同じです。容易に入手できるトランスとしてACアダプタを利用しました。写真のSony DC adapter output 4,5V 500mAです。直流整流回路は撤去しています。

無負荷時の実測で、2次側Output 33Vp-p, 11Vrmsでしたので、下記の分圧回路で分圧させます。図は上記引用の”Arduinoで電力を計測し、スマートメーターのデータで検証する - Qiita”からお借りしました。

分圧後の結果です。
Vrms[V]Vp-p[V]
IN102.2289.1
OUT1.0322.813
OUT/IN0.0100.010

結果波形 上1CH:分圧 下2CH:input 電圧

ESP32 アナログ入力

ADCの特徴

マイコンにはESP32を使います。ネットにはADCを使うときの注意点が何点か挙げられています。
  • VDD 3.3Vを4096分割
  • 精度は良くない。ゼロ点にオフセットあり。
  • 2チャンネルのADCがある。ADC2はwifiと一緒には使えない。
詳細はここに出ていました。Application Extensions(拡張アプリケーション)で正確な電圧を得る方法もあるようです。普通はADCのin/outはバイトで表現されるのですが、このアプリケーションを使うとmVで出力されるようです。

ESPRESSIF Analog to Digital Converter (ADC)

ADC Channels
ADC Attenuation
ADC Conversion
ADC Limitations
Application Extensions

espefuse.pyでこれから使用するESP32のeFuse Vrefをチェックしてみましたら、1135mVでした。

ADC特性の測定

今回は頭の整理を含めて、ADCの特性を測定してみます。各GPIOに0から3.3Vの電圧を加え、その時のanalogRead()の値をシリアルモニタで読み取ります。ADCには4段階のアッテネーション(ATT)があるので、それぞれで測定します。

GPIOによるバラツキがあるのかを調べる狙いもあって、下図のようにして、使用するGPIO32~35の4つのADCを同時に測定ました。3.3Vをボリュームで分圧させて、0V~をADCピンに入力しています。

// ESP32 ADC特性測定スクリプト
 
#define TestPin0 32      // 測定するピンを指定
#define TestPin1 33      // 測定するピンを指定
#define TestPin2 34      // 測定するピンを指定
#define TestPin3 35      // 測定するピンを指定
// サンプリング用バッファ
long VASamples[4];
 
void setup() {
  Serial.begin(115200);
    analogSetAttenuation(ADC_0db);        // アッテネーターを設定
  //  analogSetAttenuation(ADC_2_5db);
  //  analogSetAttenuation(ADC_6db);
  //  analogSetAttenuation(ADC_11db);
  //  pinMode(TestPin, ANALOG);
}
 
void loop() {
  VASamples[0] = 0;
  VASamples[1] = 0;
  VASamples[2] = 0;
  VASamples[3] = 0;
  for (int i = 0; i < 1000; i++) {  // 1000回測定して
    //d += analogRead(TestPin);
    VASamples[0] += analogRead(TestPin0);
    VASamples[1] += analogRead(TestPin1);
    VASamples[2] += analogRead(TestPin2);
    VASamples[3] += analogRead(TestPin3);
  }
  Serial.print( ( VASamples[0]+500) /1000);// 四捨五入して平均値をシリアルに出力
  Serial.print('\t');
  Serial.print( ( VASamples[1]+500) /1000);
  Serial.print('\t');
  Serial.print( ( VASamples[2]+500) /1000);
  Serial.print('\t');
  Serial.println( ( VASamples[3]+500) /1000);
  Serial.print('\t');
     
  delay(10000);
}



ATT 0dBの時の測定データを一例に示します。ノイズの影響なのか値がばらつくので1000個のデータを平均しています。個々のGPIOではバラツキがないことが分かりました。


各々のGPIOのデータをグラフに表します。GPIO間でバラツキがなくすべてが一点のマークに集約されています。ATTによりゲイン(勾配)が異ななることや入力電圧の上下に制限があることがわかります。下側の制限は上記のESPRESSIFの資料によるとVrefと言うようです。この資料には測定可能な範囲も書かれていました。

減衰

測定可能な入力電圧範囲

ADC_ATTEN_DB_0

100 mV〜950 mV

ADC_ATTEN_DB_2_5

100 mV〜1250 mV

ADC_ATTEN_DB_6

150 mV〜1750 mV

ADC_ATTEN_DB_11

150 mV〜2450 mV

0dBの特性は2500mV付近に変曲点がありますが、他のATTでは変曲点がなく1次式で表現できます。Rー2乗値が1でリニアリティがとても高いと言えます。



入力電圧の上限はATTによらず4095bytesですが、下限はATTによって違いがみられます。


以上の測定結果を踏まえ、入力電圧を広く使えて線形な特性を持つ-6dBを使うことにします。

キャリブレーション値まとめ

各々の部品の特性が得られたので、キャリブレーション値を整理しておきます。GPIOのanalogRead()の値をADCと表現しました。また、Ebは今回実験的に求めた値で、ATTをー6dBに選んだ時の12bit(4096bytes)に相当する電圧幅を表します。

CT1CT2電圧検出
トランス
備考
KCT = k・r/N [rms]13.823/100012.979/1000
定義:Eo = KCT x Io
KCT = k・r/N [p-p]1.414 x
13.823/1000
1.414 x
12.979/1000
KVT = Vo / Vi [rms]102.2/1.032定義:Vo = KVT x Vi
ADC / Eb = 4096 / Eb2.2447入力電圧(mV)に対する
analogRead()値の感度
Eb [mV]1825ESP32のAtt -6dBのとき利用可能な
アナログ入力電圧(mV)

Powered by Blogger | Designed by QooQ

keyboard_double_arrow_down

keyboard_double_arrow_down