2015年11月17日火曜日

NTSCカメラと液晶モニタ

10年位前に購入したカメラを、玄関モニタ用に設置した。これまで何度も頓挫、やっと実用化できた。
モニタのケースは準備してあったので追加工と塗装だけだったがカメラケースには悩んだ。ホームセンターで、塩ビパイプや樹脂製の花鉢など手に取るところまで行ったが、結局取り付け金具も含めて廃材で済ませた。購入したのは、塗装に使ったカラースプレーだけ。
NTSCのカメラなので壊れたら替えはきかない。

【カメラ】
  • ドーム型
  • 2006年5月、秋月から14,000円で購入
  • NTSC出力、電源DC12V
【液晶モニタ】
  • 5.6インチ
  • 2003年1月カマデンから13,650円で購入
  • NTSC入力、電源DC12V
【モニタケース】
  • 電源は壊れた外付けハードディスクの12V電源を使用
  • ケースは15年以上使われずじまいの壁掛け型ケース
  • 日焼けして変色していたので、スプレー塗装した
【カメラケース】
  • カメラケースはある装置に使われていた防水ケース
  • ただし穴だらけ
  • 耐候性はありそう
【ケーブル】
  • FMアンテナを撤去してケーブルを再利用する
  • 電源を沿わせる(DC重畳しない)
  • FMラジオに妨害が入り、電源線の根元にノイズ輻射防止用のコアを入れた

2015年11月10日火曜日

Excel VBA いまさらの Win32API シリアル通信

10年以上前に取り組んだ時はMSCommで実現していたが、Windows 更新プログラムの適用で使えなくなってしまうのでまずい。

今回は別の手段、APIによる方法を試す事にした。いくつかのサイトを見て、例文を使わせてもらっい、指定の時間間隔でデータを取り込んでEccelシートに書き込み、グラフ(スパークライン)表示するところまで、大きな困難も無く数日でデモ用簡易版プログラムは完成した。

ところが、依頼者のパソコンで使うとまるでダメ。開発機と違う自分のパソコンでも再現、半分以上の受信データを取り逃がし、根本的に問題有りと気づかされる。
開発機でまれに起きていた時は、何か端末側で他のタイミングとぶつかるためで、リトライすればいいと考え、対策した。
よく考えれば、送信処理後、送り終わったかは確かめもせず、すぐに受信処理に入る手順でもたまたまよかったに過ぎない。通信速度が115200ではなくて、9600bpsだったら全くダメだったかもしれない。
コマンド送信後に固定タイマを入れることで、データを取り逃がすことは無くなり、デモ用のプログラムは翌日渡せた。


本ちゃんの依頼が来たら、タイマで済ませられないので、解決策を講じないといけない。
  • VB2005では新しい解決法(SeriaPort コントロール)が提供されているが、それは使えない
  • 実際は、受信データ長がシステム構成で変わる(受信終了までの時間が変わる)
  • データ要求コマンドに対する反応時間(一文字目)が、どのくらい変動するものかも不明
  • 通信速度を変えてもOKにするにはイベント駆動する必要がある
  • オシロスコープの出番
  • 毎回、返答が無い場合(断線や、電池切れ)を想定して対処する必要がある
イベント駆動について調べると、途端にハードルが上がり、頭に入ってこない。分かることは
  • 送信終りのイベント検出
  • 受信データの先頭文字は固定文字である
  • 送信内容から受信文字数は計算できるので、正常受信完了は分かるはず

2015年11月2日月曜日

Excel VBA WMI で FTDI 社製 FT232 の ID が読めない

「USBシリアル変換ケーブルの、IDを読み込みたい」がテーマ。
シリアル通信仕様の機器(温度ロガー)に接続したUSBシリアル変換ケーブルの固有シリアル番号を取得して、VBAの動作環境を特定したい。
WMI (Windows Management Instrument) を使用すれば、情報(デバイスインスタンスID)を取得できる。サンプルコードで問題なくディスクドライブは取得できた。ところが、手持ちの10年前くらい前に購入したアーベルl製USBシリアル変換ケーブルの場合が、取得できず悩まされた。
  • Win32_DiskDrive     ・・・これはディスクドライブ
  • Win32_Printer     ・・・これはプリンタ
  • Win32_USBController     ・・・これはポートのUSBコントローラーが出てくる
  • Win32_ComputerSystemProduct     ・・・コンピュータ名やCPU番号
  • Win32_SerialPort     ・・・ダメ
  • Win32_Ports     ・・・ダメ
FTDIだけだと思われるが、全て当たってみるには大変そう。で、一年以内に絞ってネット検索してみたら、マイコンの掲示板にヒントを見つけた。
早速試したところNameで見つけ出せたので、次のようなコードを試した。

  Set colPort = oService.ExecQuery("Select * From Win32_PnPEntity")
  For Each Serial In colPort
        If Serial.Name = "USB Serial Converter" Then
            Debug.Print Serial.Name
            Debug.Print Serial.DeviceID
        End If
  Next
  • クエリー条件を"Win32_PnPEntity"とすると、該当する項目がずらずらと出てくる
  • "USB Serial Converter"にて抽出する
FTDI製のFT232チップを使用したUSBシリアル変換ケーブルは、これでOK。
おまけとして、CPU番号を見れることも分かったので、USBシリアル変換ケーブルを使わない場合はこれでパソコンを特定できる。
WSIの解説サイトのサンプルを見ていると、マクロから何でも出来てしまいそうで、恐ろしくもなる。