コーヒーメーカーの切り忘れを防止する(計測編)---WIP

目的

入社年度より,コーヒーメーカー象印 コーヒーメーカー 珈琲通/EC-AK60(2020/07/05)を勝手に会社に設置して,有志3,4人で使用してきているが,抽出後の切り忘れが多く,保温状態を継続するとガラスにコーヒーが焦げ付いてしまい,焦げ臭いとの苦情が時にある状況である.そのため,今回ようやく重い腰を上げ,抽出後に一定期間が経過したら電源をOFFする装置の製作に着手する!

そのうち今回は,その消費電流を測定するまでの計測編を記載する.抽出が終わった=消費電流が下がるという予測の元,製作をスタート.

結論

下図のとおり,最大量6杯分(おおよそ810[mL])の抽出中は定格消費電流付近,抽出後は定格消費電流付近とほぼOFF状態の間欠動作となることがわかった:

コーヒーメーカーEC-AK60の動作経過時間と消費電流(RMS)の関係
そのため,抽出後動作を検出して,その検出からコーヒーメーカーの電源OFFまでの時間を設定することで目的は達成できると考えられる.

次はその変化点である抽出後をどのように検出するかを検討する.単純に変化点をみるだけであれば,まずは以下のように,現在データと過去データの差分をみればよさそうである*1が,変化点は判別できるものの変化量が必ずしも一定となっていないために閾値が判定の仕方が私には判別できなかった(40の値を超えた回数で判断する?):

コーヒーメーカーEC-AK60の前データとの消費電流(RMS)差分の2乗による変化点検出

差分検出は利用できるため,それの累積値をプロットすると,以下のような1次関数に近いかたちとなる.抽出後(=保温開始)から5分程度経過で電源OFFを目標とすると,累積値がおおよそ330となったところ(以下のグラフ上15分過ぎくらい)がよさそうである*2

コーヒーメーカーEC-AK60の前データとの消費電流(RMS)差分の2乗の累計値
コーヒーメーカーEC-AK60の前データとの消費電流(RMS)差分の2乗の累計値 (別日の積算値)*3

設計

ハードウェアとソフトウェアそれぞれについて記載する.

ハードウェア

メイン基板をArduinoとして,SDカードシールド(下表,Data logging shield V1.0)を使用することによりデータロガーとして,経過時間と消費電流を計測した.正直なところ,原理がわかっていないのだが,以下の回路で右側の信号が測定できる: https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/files/Arduino_AC_current_input_A.png

使用部品は具体的には以下のとおりで,電流センサー,電解コンデンサーおよび金属皮膜抵抗が基幹部分の部品となる.

名称 外観 規格 製造会社 必要個数 参考価格 備考
Arduino UNO R3(互換品) CPU:ATMEGA328P-AU,USB-シリアル変換IC:CH340G - 1 695円@1個 https://amzn.to/2ZRqQ2b
Data logging shield V1.0 SDカードスロット,リアルタイムクロックIC:DS1307Z HiLetgo 1 680円@1個 https://amzn.to/3fgB6Yg
SDまたはSDHCカード - 2[GB] adata 1 - 手元にあったものを使用
電流センサー(CTセンサー) https://akizukidenshi.com/img/goods/S/P-08960.jpg SR-3702-150N(変流比:3000対1) サラ 1 980円@1個 秋月電子P-08960
電解コンデンサ https://akizukidenshi.com/img/goods/S/P-03116.jpg 10[μF],50[V],85[℃] ルビコン 1 10円@1個 秋月電子P-03116
金属皮膜抵抗 https://akizukidenshi.com/img/goods/S/R-08567.JPG 470[kΩ],1/4[W] FAITHFUL 2 2円@1本 秋月電子R-08567
金属皮膜抵抗 https://akizukidenshi.com/img/goods/S/R-08530.JPG 330[kΩ],1/4[W] FAITHFUL 1 2円@1本 秋月電子R-08567
XHコネクタハウジング(2ピン) https://akizukidenshi.com/img/goods/S/C-12255.JPG XHP-2 JST 1 5円@1個 秋月電子C-12255
XHベース付ポスト サイド型(2ピン) https://akizukidenshi.com/img/goods/S/C-12262.JPG S2B-XH-A JST 1 10円@1個 秋月電子C-12262
XHハウジング用コンタクト https://akizukidenshi.com/img/goods/S/C-12264.JPG SXH-001T-P0.6 JST 2 3円@1個 秋月電子C-12264
ブレッドボード https://akizukidenshi.com/img/goods/S/P-00315.JPG EIC-801 E-CALL 1 270円@1個 秋月電子P-00315
Arduino and Breadboard Holder https://cdn.sparkfun.com//assets/parts/6/8/4/4/11235-01c.jpg DEV-11235 SparkFun 1 501円@1個 スイッチサイエンスSFE-DEV-11235
平型コードコネクター - TP-1035(1500[W]まで,125[V]まで) ターシンジャパン 1 198円@1セット コーナンにて購入
VFF2.0 2芯(白) - 60[℃],300[V],17[A]まで - 1 115円@1[m] コーナンにて購入

また,回路上で計測した電流値が正しいかどうかを確かめるため,以下クランプメーターを購入している. https://amzn.to/2BIH8Tfamzn.to

電流センサー選定

電流センサーには,調べた限りでは,カレントトランス(またはCTセンサー)と呼ばれるものと,電流センサーICの2種類がある.いずれも,導線に電流を流したときの磁界の変化を読み取る仕組みで動作するようである.

名称 外観例 特徴 備考
カレントトランス http://akizukidenshi.com/img/goods/M/P-08960.jpg 回路の配線を傷つけない*4.センサーによっては物理的に大きい.交流のみしか測定できない. 多数メーカーが存在
電流センサーIC https://d2air1d4eqhwg2.cloudfront.net/images/1582/500x500/e46214d2-364d-48e1-b9c2-4a2007888524.jpg 電流計のように電流経路に実装が必要.物理的は小さくできる.直流/交流いずれも測定できる. メーカーはAllegroのみ?

今回は,インターネット上に日本語での作成事例の多い,カレントトランスを用いることとした.カレントトランスにおいて,上記外観例にあるとおり,配線に通さなければならないものと,後から配線の上にかみ合わせることができるクランプ式がある.

当初は,配線に通さなければならないが,740円と最も価格の安かった以下HiLetgoのもの(耀华德昌TA12-100搭載) https://amzn.to/3tKodSUamzn.to を利用する予定だったが,最大測定電流が5[A]であるため要件を満たさないので(後述)採用を取りやめた.5[A]未満の測定であればこの部品が最も安い. 次に価格の安かったものが今回採用した(部品表参照),以下,サラSR-3702-150N akizukidenshi.com である.本センサーは980円であり,他の同等のものが1,500~3,000円するのに対して破格の値段である.加えて,最大測定電流が80[A]である.

他にも,参考URLに記載した海外のサイトで採用されている耀华德昌SCT013も選択肢には上がったが,こちらは3.5mmイヤホンジャックで接続するため,むしろ使いにくいと判断して不採用とした. https://amzn.to/3gN8eawamzn.to

回路構成と回路定数計算

以下のOpenEnergyMonitorのサイトの回路構成に従って,回路定数を決定した: https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/files/Arduino_AC_current_input_A.png learn.openenergymonitor.org

項目 文字 備考
測定電流の最大値 i_\text{max} 15[A] コンセントの最大容量
1次側のピーク電流  i_\text{peak-ct-in} 約21.21[A]
2次側のピーク電流  i_\text{peak-ct-out} 約7.07[mA]
カレントトランスの巻き数比  n 3000 カレントトランス(サラSR-3702-150N)の変流比3000対1
測定抵抗  R_\text{burden} 330[Ω] 計算上は約353.55[Ω]
分圧抵抗1  R_\text{1} 470[kΩ] 10~470[kΩ]であればよい(ただし, R_\text{2}と同じ値)
分圧抵抗2  R_\text{2} 470[kΩ] 10~470[kΩ]であればよい(ただし, R_\text{1}と同じ値)
バイパスコンデンサー  C_\text{1} 10[μF] サイトに記載された値どおり

上記サイトの指示どおりだが,以下に,計算式を記載する. 測定電流の最大値をi_\text{max}とすると,測定している1次側(AC100[V]側)のピーク電流 i_\text{peak-ct-in}

 i_\text{peak-ct-in} = \sqrt{2}i_\text{max}

となる.一方,カレントトランスを通して変換される2次側のピーク電流 i_\text{peak-ct-out}は,カレントトランスの巻き数比を nとすると

 \displaystyle i_\text{peak-ct-out} = i_\text{peak-ct-in}\div{}n = \frac{\sqrt{2}}{n}i_\text{max}

となる.最後に,上記計算例図においてBurden 33Ωと記載されている測定抵抗 R_\text{burden}を求める.A/D変換基準電圧を V_\text{aref}とすると

 \displaystyle R_\text{burden} = \left(\frac{1}{2}\times{}V_\text{aref}\right)\div{}i_\text{peak-ct-out} = \frac{nV_\text{aref}}{2\sqrt{2}i_\text{max}}

となる.

上記式より,測定電流の最大値i_\text{max}は一般的なコンセントの最大容量である15[A]と設定し,また,カレントトランスの巻き数比 nはカレントトランス(サラSR-3702-150N)の変流比が3000対1,Arduino UNO R3互換機ではA/D変換基準電圧 V_\text{aref}が5[V]であることから,それぞれ

 i_\text{peak-ct-in} = \sqrt{2}i_\text{max} = 15\sqrt{2}\simeq{}21.21\>\text{A}

 \displaystyle i_\text{peak-ct-out} = \frac{\sqrt{2}}{n}i_\text{max} = \frac{\sqrt{2}}{200}\simeq{}7.07\>\text{mA}

 \displaystyle R_\text{burden} = \frac{nV_\text{aref}}{2\sqrt{2}i_\text{max}} = 250\sqrt{2}\simeq{}353.55\approx{}330\>\Omega

と求められる.ここで測定抵抗 R_\text{burden}は実在する抵抗値とするため330[Ω]とした.ほか,分圧抵抗 R_\text{1}および R_\text{2}は1対1で分圧できればよいため,10~470[kΩ]であればよいとの記載がOpenEnergyMonitorのAdding a DC Bias項にあり,消費電流が少なくなるためそれぞれ

 R_\text{1} = R_\text{2} = 470\>\text{k}\Omega

とし,バイパスコンデンサー C_\text{1}についても,OpenEnergyMonitorのAdding a DC Bias項に記載があるように低リアクタンスであればよいため,記載されている値

 C_\text{1} = 10\>\mu{}\text{F}

とした.

なお,測定抵抗 R_\text{burden}の消費電力は,消費電力を W_\text{burden}とすると

 \displaystyle W_\text{burden} = i^\text{2}_\text{peak-ct-out}R_\text{burden} = \frac{\sqrt{2}}{80}\simeq{}17.67\>\text{mW}

と計算できるため,部品表のとおり1/4[W]で問題ないと判断した.

配線等

ブレッドボードで試作し,Data logging shield V1.0に半田付けして最終実装した*5

完成形

カレントトランスは購入時,配線にコネクター等が付いていないためXHコネクタハウジング(2ピン)を実装した.

XHコネクターを実装(ホットボンド含む)

以下,ブレッドボード試作図,ブレッドボード試作写真,回路図,基板レイアウト図,基板レイアウト写真を示す.

ブレッドボード試作図
ブレッドボード試作写真*6

回路図

基板レイアウト図
基板レイアウト写真(表面)
基板レイアウト写真(裏面)

ソフトウェア

開発環境は,下表のとおり:

名称 規格 製造会社 備考
PC CPU:Ryzen 7 3700X,メモリー:32[GB] - マザーボードGigabyteのB450 AORUS M
OS Windows 10 Pro 64ビット,バージョン2004 Microsoft English International版*7
開発環境 Arduino IDE 1.8.12 Arduino Software -
Arduinoライブラリー EmonLib,バージョン1.1.0 OpenEnergyMonitor https://openenergymonitor.org/によるエネルギーモニターライブラリー
Arduinoライブラリー SD,バージョン1.2.4 SparkFun SPI通信でSDカードと通信するライブラリー

ソースコードにおいて,基本的にはSDライブラリーとエネルギーモニターライブラリーのサンプルそのままの部分が多いが,以下のソースコードのとおり.オリジナルのものから不要なコメントを削除し,追記したコメントはC90形式のコメント/* ~ */で記載する.

大まかな処理は,Arduino電源ON時にSDカード直下にファイル名をdatalog.csvとして,2つのデーター

  1. 経過時間elapsed time[ms]
  2. 交流電流の実効値Irms[mA]……CTセンサー経由のA/D変換値

をおよそ1秒ごとに書き出し続けるだけである.計測開始操作を設けていないので,Arduino電源ON時にSDカードが挿入されていない,またはSDカードに書き込みができないなどの症状がある場合は何も計測データーが残らない.

#include "EmonLib.h"
#include <SPI.h>
#include <SD.h>
EnergyMonitor emon1;

/* Adafruit SD shieldと互換品なので今回は10ピン */
const int chipSelect = 10;

void setup()
{  
  Serial.begin(9600);
  while (!Serial)
  {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  
  /* 第1引数はEmonLibでのチャンネル番号で,EmonLibのサンプルと同じポートを
   * 使用しているので1のままでよい.第2引数はセンサーのキャリブレーション値で
   * 後述の計算で求めるキャリブレーション値9.09.
   */
  emon1.current(1, 9.09);             // Current: input pin, calibration.
  Serial.print("Initializing SD card...");

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect))
  {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    //while (1);
  }
  Serial.println("card initialized.");
}

void loop()
{
  /* 初回のcsv書き出し時はデーター列の項目名を出力するため,その判定用のフラグ */
  static boolean s_bFirstTime = false;
  // make a string for assembling the data to log:
  String dataString ="";
  uint32_t u32StartTime = 0;

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile = SD.open("datalog.csv", FILE_WRITE);

  /* 実は以下の値の計算方法が不明で,サンプルのコメントから,タイムアウト時間までの
   * ゼロクロス回数と判断し,1[Hz]の制限は1周期で2回ゼロクロス点を通過するので,
   * AC電源周波数60[Hz]地域のため,500[ms]で60回と判断し,以下の値を指定した.
   * ※サンプルでは20,2000.
   */
  emon1.calcVI(60, 500);         // Calculate all. No.of half wavelengths (crossings), time-out
  if (false == s_bFirstTime)
  {
    s_bFirstTime = true;
    dataString = "elapsed time[ms],Irms[mA]\n";
    dataString += u32StartTime = millis();
    dataString += ", ";
    dataString += emon1.Irms * 1000;
  }
  else
  {
    dataString = millis() - u32StartTime;
    dataString += ", ";
    dataString += emon1.Irms * 1000.0;
  }

  // if the file is available, write to it:
  if (dataFile)
  {
    dataFile.println(dataString);
    dataFile.close();
    // print to the serial port too:
    Serial.println(dataString);
  }
  // if the file isn't open, pop up an error:
  else
  {
    Serial.println("error opening datalog.csv");
    Serial.println(dataString);
  }
}

ここまで記載,後はキャリブレーション値の計算方法

参考URL

  1. https://github.com/openenergymonitor/EmonLib
  2. https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino
  3. https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/how-to-build-an-arduino-energy-monitor-measuring-current-only
  4. https://learn.openenergymonitor.org/electricity-monitoring/ctac/ct-and-ac-power-adaptor-installation-and-calibration-theory
  5. https://openenergymonitor.org/forum-archive/node/846.html
  6. https://community.openenergymonitor.org/t/calibration-and-parameters-in-emonlib/6855
  7. https://s2jp.com/2011/06/android-with-electric-toaster/
  8. https://snge.me/blog/2019-10/current-meter-make.html

*1:単純に差分を取ると負の値になることもあるため2乗値

*2:焦げ付くまでの時間がどれくらいになるのかは確認していない

*3:長くデータを取り過ぎたものの,焦げ付きがなかった(データ取得中はコーヒーメーカー通電中のため)

*4:非侵襲とも呼ぶ

*5:fritzingを利用したが,Data logging shield V1.0とぴったり同じ部品がfrizingに存在しないため類似品を利用しており,基板レイアウトは実際のレイアウトとは異なる.

*6:図と違うのはご愛敬! 回路図としてはもちろん同一.

*7:英語版なのは中二病