目的
入社年度より,コーヒーメーカー象印 コーヒーメーカー 珈琲通/EC-AK60(2020/07/05)を勝手に会社に設置して,有志3,4人で使用してきているが,抽出後の切り忘れが多く,保温状態を継続するとガラスにコーヒーが焦げ付いてしまい,焦げ臭いとの苦情が時にある状況である.そのため,今回ようやく重い腰を上げ,抽出後に一定期間が経過したら電源をOFFする装置の製作に着手する!
そのうち今回は,その消費電流を測定するまでの計測編を記載する.抽出が終わった=消費電流が下がるという予測の元,製作をスタート.
結論
下図のとおり,最大量6杯分(おおよそ810[mL])の抽出中は定格消費電流付近,抽出後は定格消費電流付近とほぼOFF状態の間欠動作となることがわかった: そのため,抽出後動作を検出して,その検出からコーヒーメーカーの電源OFFまでの時間を設定することで目的は達成できると考えられる.
次はその変化点である抽出後をどのように検出するかを検討する.単純に変化点をみるだけであれば,まずは以下のように,現在データと過去データの差分をみればよさそうである*1が,変化点は判別できるものの変化量が必ずしも一定となっていないために閾値が判定の仕方が私には判別できなかった(40の値を超えた回数で判断する?):
差分検出は利用できるため,それの累積値をプロットすると,以下のような1次関数に近いかたちとなる.抽出後(=保温開始)から5分程度経過で電源OFFを目標とすると,累積値がおおよそ330となったところ(以下のグラフ上15分過ぎくらい)がよさそうである*2:
設計
ハードウェアとソフトウェアそれぞれについて記載する.
ハードウェア
メイン基板をArduinoとして,SDカードシールド(下表,Data logging shield V1.0)を使用することによりデータロガーとして,経過時間と消費電流を計測した.正直なところ,原理がわかっていないのだが,以下の回路で右側の信号が測定できる:
使用部品は具体的には以下のとおりで,電流センサー,電解コンデンサーおよび金属皮膜抵抗が基幹部分の部品となる.
名称 | 外観 | 規格 | 製造会社 | 必要個数 | 参考価格 | 備考 |
---|---|---|---|---|---|---|
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センサー) | SR-3702-150N(変流比:3000対1) | サラ | 1 | 980円@1個 | 秋月電子P-08960 | |
電解コンデンサー | 10[μF],50[V],85[℃] | ルビコン | 1 | 10円@1個 | 秋月電子P-03116 | |
金属皮膜抵抗 | 470[kΩ],1/4[W] | FAITHFUL | 2 | 2円@1本 | 秋月電子R-08567 | |
金属皮膜抵抗 | 330[kΩ],1/4[W] | FAITHFUL | 1 | 2円@1本 | 秋月電子R-08567 | |
XHコネクタハウジング(2ピン) | XHP-2 | JST | 1 | 5円@1個 | 秋月電子C-12255 | |
XHベース付ポスト サイド型(2ピン) | S2B-XH-A | JST | 1 | 10円@1個 | 秋月電子C-12262 | |
XHハウジング用コンタクト | SXH-001T-P0.6 | JST | 2 | 3円@1個 | 秋月電子C-12264 | |
ブレッドボード | EIC-801 | E-CALL | 1 | 270円@1個 | 秋月電子P-00315 | |
Arduino and Breadboard Holder | 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種類がある.いずれも,導線に電流を流したときの磁界の変化を読み取る仕組みで動作するようである.
名称 | 外観例 | 特徴 | 備考 |
---|---|---|---|
カレントトランス | 回路の配線を傷つけない*4.センサーによっては物理的に大きい.交流のみしか測定できない. | 多数メーカーが存在 | |
電流センサーIC | 電流計のように電流経路に実装が必要.物理的は小さくできる.直流/交流いずれも測定できる. | メーカーは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のサイトの回路構成に従って,回路定数を決定した: learn.openenergymonitor.org
項目 | 文字 | 値 | 備考 |
---|---|---|---|
測定電流の最大値 | 15[A] | コンセントの最大容量 | |
1次側のピーク電流 | 約21.21[A] | ||
2次側のピーク電流 | 約7.07[mA] | ||
カレントトランスの巻き数比 | 3000 | カレントトランス(サラSR-3702-150N)の変流比3000対1 | |
測定抵抗 | 330[Ω] | 計算上は約353.55[Ω] | |
分圧抵抗1 | 470[kΩ] | 10~470[kΩ]であればよい(ただし,と同じ値) | |
分圧抵抗2 | 470[kΩ] | 10~470[kΩ]であればよい(ただし,と同じ値) | |
バイパスコンデンサー | 10[μF] | サイトに記載された値どおり |
上記サイトの指示どおりだが,以下に,計算式を記載する. 測定電流の最大値をとすると,測定している1次側(AC100[V]側)のピーク電流は
となる.一方,カレントトランスを通して変換される2次側のピーク電流は,カレントトランスの巻き数比をとすると
となる.最後に,上記計算例図においてBurden 33Ωと記載されている測定抵抗を求める.A/D変換基準電圧をとすると
となる.
上記式より,測定電流の最大値は一般的なコンセントの最大容量である15[A]と設定し,また,カレントトランスの巻き数比はカレントトランス(サラSR-3702-150N)の変流比が3000対1,Arduino UNO R3互換機ではA/D変換基準電圧が5[V]であることから,それぞれ
と求められる.ここで測定抵抗は実在する抵抗値とするため330[Ω]とした.ほか,分圧抵抗およびは1対1で分圧できればよいため,10~470[kΩ]であればよいとの記載がOpenEnergyMonitorのAdding a DC Bias項にあり,消費電流が少なくなるためそれぞれ
とし,バイパスコンデンサーについても,OpenEnergyMonitorのAdding a DC Bias項に記載があるように低リアクタンスであればよいため,記載されている値
とした.
なお,測定抵抗の消費電力は,消費電力をとすると
と計算できるため,部品表のとおり1/4[W]で問題ないと判断した.
配線等
ブレッドボードで試作し,Data logging shield V1.0に半田付けして最終実装した*5.
カレントトランスは購入時,配線にコネクター等が付いていないためXHコネクタハウジング(2ピン)を実装した.
以下,ブレッドボード試作図,ブレッドボード試作写真,回路図,基板レイアウト図,基板レイアウト写真を示す.
ソフトウェア
開発環境は,下表のとおり:
名称 | 規格 | 製造会社 | 備考 |
---|---|---|---|
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つのデーター
- 経過時間elapsed time[ms]
- 交流電流の実効値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
- https://github.com/openenergymonitor/EmonLib
- https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino
- https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/how-to-build-an-arduino-energy-monitor-measuring-current-only
- https://learn.openenergymonitor.org/electricity-monitoring/ctac/ct-and-ac-power-adaptor-installation-and-calibration-theory
- https://openenergymonitor.org/forum-archive/node/846.html
- https://community.openenergymonitor.org/t/calibration-and-parameters-in-emonlib/6855
- https://s2jp.com/2011/06/android-with-electric-toaster/
- https://snge.me/blog/2019-10/current-meter-make.html