その他の違いとしては、時刻の取得がある。温度センサーのときは、秒単位までわかればいいということで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: これはWattMeterをAC100Vに接続しただけで、何も繋がない状態。つまりVolの側は100V掛かるが、Ampのほうは本来0になる筈。

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までしか対応していないからで、この範囲であれば分圧抵抗を入れなくても問題なくサンプリングできることが確認された。

Photo02: 3A程度の状態でSwingは70前後、3.5Aのときに81だった。

ということでソフトウェア側も完成したので、ちゃんとケースに収めることにする。ということで、以下写真でご紹介(Photo03~14)。

Photo03: 今回のケースは100円ショップで見つけたこちら。探してみたら楽天では2つで100円だった

Photo04: サイズはArduinoには十分。とりあえず寸法あわせにArduino Duemilenoveを引っ張りだしてきたが、Unoでも同寸法。

Photo05: 底面に緩衝材を敷いて少し底上げした上で、USBコネクタの穴を位置決め。

Photo06: カッターで切抜き。ちょっと穴の開き方が汚い。

Photo07: Shieldはまたユニバーサル基板で作っても良かったのだが、この前千石電商でサンハヤト製のArduino用基板を見つけたのでこれを使ってみることに。お値段は\570。

Photo08: とりあえずピンを刺して基板を載せてみた。えらく高い。

Photo09: Pin付近を拡大。ピンに直接半田付けしなくても、隣のホールまでパターンが来ているので配線は楽。

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にそれぞれ繋がるという構造である。

Photo14: 最終的に3pinコネクタの真上もちょっと切り抜いて、ここにケーブルが装着される形に。

さてこの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);
}