その他の違いとしては、時刻の取得がある。温度センサーのときは、秒単位までわかればいいということでtime()で現在時刻を取得、これを_localtime64_s()で変換して時/分/秒の値を取得していたが、これだと1秒以下の時刻が取得できない。今回は最短で0.1秒ごとに測定だから、このままだと不便である。ということで今回はGetLocalTime()を利用した。こちらだとmsまでの時刻が取得できるので今回の目的には最適である。
それ以外はもう完全に温度測定のケースと同じままである。見難いとかパラメータの設定が不便とか、色々ご不満はあるかと思うが、それは各々で手を入れて好きなように改造していただければと思う。
ところで、最後にもう一つArduino側のSketchをご紹介。実際に使う場合のArduino側のSketchは406回で紹介したものを使っていただく訳だが、この先頭で、
#define VOLBIAS 463
#define AMPBIAS 473
となっている部分は、実際にはArduinoとWattMeterの組み合わせで変わってくる。この値を算出するためのSketchをList 1に示す。
これを実行してシリアルコンソールを開くと、こんな画面が表示される筈だ(Photo01)。これは電圧(Analog Port 0)と電流(Analog Port 1)を5000回サンプリングし、その結果としてそれぞれの最小値(Min)と最大値(Max)、結果としての中心値(Center)と実際の振幅(Swing)を表示するものだ。先のVOLBIASとAMPBIASは、このCenterの値をそのまま利用する。
Photo01のケースで言うなら、
#define VOLBIAS 464
#define AMPBIAS 474
にするのが適切ということになる。よって、406回のSketchのVOLBIAS/AMPBIASの部分にこの値をセットして改めてArduino側にロードし、、後はWindows側のプログラムの係数を引数の形で加減しながら、WattMeterの表示と一致するように調整すればOKということになる。
ついでに、同じ環境で消費電力が300Wちょい(電流値で3.5Aほど)の状況をサンプリングしたのがこちら。3.5Aで概ね振幅が81ほどになる。逆算すると、電流側は概ね23~24/Aという計算になる。Center、つまり中心値が474とかだから、電流側のサンプリングが飽和しない限界は19~20Aということになる。これはWattMeterの利用には十分である。何しろWattMeterそのものが最大15Aまでしか対応していないからで、この範囲であれば分圧抵抗を入れなくても問題なくサンプリングできることが確認された。
ということでソフトウェア側も完成したので、ちゃんとケースに収めることにする。ということで、以下写真でご紹介(Photo03~14)。
Photo03: 今回のケースは100円ショップで見つけたこちら。探してみたら楽天では2つで100円だった。 |
Photo04: サイズはArduinoには十分。とりあえず寸法あわせにArduino Duemilenoveを引っ張りだしてきたが、Unoでも同寸法。 |
Photo05: 底面に緩衝材を敷いて少し底上げした上で、USBコネクタの穴を位置決め。 |
Photo06: カッターで切抜き。ちょっと穴の開き方が汚い。 |
Photo07: Shieldはまたユニバーサル基板で作っても良かったのだが、この前千石電商でサンハヤト製のArduino用基板を見つけたのでこれを使ってみることに。お値段は\570。 |
Photo10: 基板は完全にUSBコネクタの上まで来ているが、これだけ高さがあるので、実用上問題はなさそう。 |
Photo11: 基板の上に3pinコネクタを載せて蓋を閉めてみたところ、ぎりぎり干渉しないで閉まることが判った。高さ的にはばっちりであり、別にピンを切って基盤の高さを下げる必要はなさそうだ。 |
Photo12,13: 配線後の様子。基本的にはAnalog In 1/2とGNDにだけ配線すればいいので、スズメッキ線だけで十分。回路図は401回の図3から2本の分圧抵抗を抜いて、要するにGNDがLM2902のPin11、Analog In 0がPin14、Analog In 1がPin1にそれぞれ繋がるという構造である。 |
さてこのWattMeter、既に実戦投入させていただいた。それがこちらにおけるグラフ50の結果である。このグラフでは0.5秒間隔で約300秒分のデータをそれぞれのパターンについて測定し、スタート時間(40秒目あたりにくる急激な消費電力立ち上がり)が一致するように前後にずらしたものである。ただ240秒を0.5秒間隔でサンプルするとデータ点数が480とかになり、これが3パターンで720だとちょっとグラフ描画が重くなるし、グラフも細かな変動が出すぎて見難い。そこで、概ね2秒間隔になる様に元のデータの平均を取って、グラフをすっきりさせている。
ということで398回から11回かけてご紹介してきたWattMeterはこれで一応完成である。もっともまだWattMeterは続くのだが、この先は次回以降に。
List 1:
#define VOLPIN 0
#define AMPPIN 1
#define REPEAT 5000
void setup()
{
Serial.begin(9600);
}
void loop()
{
int lpCnt, vol, amp;
int volMin, volMax, ampMin, ampMax;
int volCtr, volSwg, ampCtr, ampSwg;
volMax = ampMax = 0;
volMin = ampMin = 32767;
for(lpCnt=0;lpCnt < REPEAT;lpCnt++)
{
vol = analogRead(VOLPIN);
amp = analogRead(AMPPIN);
if(vol < volMin) volMin = vol;
if(vol > volMax) volMax = vol;
if(amp < ampMin) ampMin = amp;
if(amp > ampMax) ampMax = amp;
delayMicroseconds(1);
}
Serial.print("Vol Min:");
Serial.print(volMin);
Serial.print(" Vol Max:");
Serial.print(volMax);
Serial.print(" Vol Center:");
Serial.print((volMax-volMin)/2+volMin);
Serial.print(" Vol Swing:");
Serial.println((volMax-volMin)/2);
Serial.print("Amp Min:");
Serial.print(ampMin);
Serial.print(" Amp Max:");
Serial.print(ampMax);
Serial.print(" Amp Center:");
Serial.print((ampMax-ampMin)/2+ampMin);
Serial.print(" Amp Swing:");
Serial.println((ampMax-ampMin)/2);
delay(1000);
}