掲載が遅くなって申し訳ありません。先週はこいつ(Photo01)の世話にかまけていて、ちょっとプログラムを組むのが遅れてしまいました。ということで、PC側プログラムのご紹介など。

Photo01: 名前は大治郎。推定2カ月強の♂。近く里親さんを募集開始予定。募集の詳細やこれまでの経緯などは、随時こちらに掲載してまいります。今が一番かわいい盛りです。

まずは完成イメージだがこんな感じである(Photo02)。こう、折れ線グラフで温度を表示とかカッコいいイメージを抱かせてしまったとしたら申し訳ないのだが、実用上はこんなもんで(少なくとも筆者の用途には)十分である。左上が現在時刻、右上が温度、左下が設定と動作状況表示である。この状態で、RS232Cポートと通信を開始すると(Photo03)、Arduinoが温度センサーから取り込んだ温度が表示される(Photo04)。

Photo02: これは起動直後。

Photo03: 通信開始は"Data Collect"→"Start"、通信終了は"Data Collect"→"Stop"である。

Photo04: 画面レイアウトは、今のところ0.1℃~99.9℃に対応したものになっていて、0℃未満あるいは100℃以上を観測すると画面が破綻する。このあたりはもう少し微調整が必要。データを通信中は、右下に"Xfer"が表示される。

ただ表示されるだけだと意味が無いので、ログファイルへの記録(Photo05,06)機能も付加した。

Photo05: ファイル→"Log File"から"Save"を選ぶと記録開始、"Close"で記録終了。

Photo06: ファイル名選択はCommon Dialogで済ませることにした。

Photo07: 記録中は、"Xfer"に加えて"Save"も表示する。

設定メニューは従来同様、"Settings"→"Port"(Photo08)、"Speed"(Photo09)、"Interval"(Photo10)となっている。

Photo08: ポート番号はCOM1~COM16までに対応。そろそろダイアログボックスでまとめることを考えたほうがいいかもしれない。

Photo09: Speedは38400bpsまで。Arduino Unoだともう少し上でもいけるが、Arduino Duemilanoveだと38400bpsあたりまでにしておくのが無難。

Photo10: 時間間隔は0.5秒~1時間までにした。温度測定だと、なにを測定するかで好みのインターバルが変ってくることに対応してこのあたりまで広げたが、まぁこのあたりは好みの問題。

さて、プログラムに入る前にArduino側のSketchの修正から。List 1が今回利用した修正版のSketchである。変更点は3つで、

  • 通信速度を19200bpsに引き上げ。
  • 温度測定の頻度を200msごとにした。
  • 通信プロトコルをちょっと変更し、頭に"z"を必ずつけるようにした。

となっている。まず最初の2つだが、0.5秒での受信を行うようにした場合、

  • 実際にArduinoからも0.5秒毎で送っているとタイミングがずれることがあるので、0.2秒毎にデータを送る仕組みにした。
  • 0.2秒毎にArduinoから受け取るようにすると、9600bpsでは時折転送タイミングが合わず、PC側のプログラムが長時間(1~2秒)ReadFile()から戻ってこないことがあった。19200bpsではこれがほぼ解消された。

という実際の状況に基づいての判断である。またzに関してだが、元々のプログラムは、

"30.0 30.1 30.2 30.3 30.4 30.5"

という文字列を送っているのだが、PC側でブンまわしていると時折、

"0.0 30.1 30.2 30.3 30.4 30.5"

なんて具合に1文字欠けることが発生した。これを回避するため、1回の転送ではかならず先頭に"z"を入れた、

"z30.0 30.1 30.2 30.3 30.4 30.5"

とし、PC側も先頭に"z"が入っていないデータは読み捨てることで、妙に欠落したデータを取り込むことを防いだ。ただこうすると、時折データが欠落するわけで、なので欠落することを前提に、200ms単位でデータを送ることで、仮にデータが欠落してもすぐ次のデータを受け取れるようにしたというわけだ。

さて、それではPC側のプログラムである。やっぱりソース量が膨大なサイズになるので、こちらも前回同様ソースファイルや実行ファイルなどをまとめたもの(TempSensor.zip)を用意した。こちらをダウンロードして当該箇所をエディタなどで開いている、という前提で以下説明を進めてゆきたい。

まずリソースファイル系だが、こちらはやっぱりメニューの変更だけである。Visual Studio.NET 2010 Professionalをお持ちの方は.rcファイルから直接メニューの作成やresource.hの生成が可能だが、Expressのみの方は.rcファイルと、やはりzipファイルに含まれているresource.hを利用して頂きたい。メニュー項目が多い以外の違いは無い。

さてメインとなるTempSensor.cppのほうだが、前と異なるのはまずincludeに、

#include 
#include <pdhmsg.h>

がなく、代わりに、

#include <Commdlg.h>

が増えていること。今回はPerformance Counterは利用しないのでPDH系のincludeは不要で、代わりにファイル保存時に使うCommon Dialog用のincludeが追加されている形だ。その下では、TIMER_IDが2つあるあたりがちょっと目を引くほか、Font系の設定も増えているが、このあたりは次回紹介する。

List 1:

#define BAUDRATE 19200
#define WAIT  200

static float Coff[6]={0.486, 0.494, 0.492, 0.495, 0.493, 0.484};
static float Const[6]={-47.731,-48.716,-47.45,-49.821,-47.341,-46.736};

void  setup()
{
  Serial.begin(BAUDRATE);
}

void  loop()
{
  int  lpCnt;
  int  analogValue;

  delay(WAIT);

  Serial.print("z");
  for(lpCnt = 0; lpCnt < 6; lpCnt++)
  {
    analogValue = analogRead(lpCnt);
    Serial.print((float)analogValue*Coff[lpCnt]+Const[lpCnt],1);
    Serial.print("\t");
  }
  Serial.println("");
}