USBインターフェースの計測ロガ−ユニット

 パソコンとUSBで接続し、4チャンネルの計測データ
 を収集できる計測ロガ−です。


【概要】

いよいよUSBインターフェースの登場です。 PIC16F876にUSBデバイスコント
ローラである、ナショナルセミコンダクタ社の「USBN9603」を接続し、フルスピード
でのUSB通信を実現しています。
このユニットで、USB通信で可能なことは下記となっています。

 (1) パソコンからのコマンド出力
   計測指示など
 (2) 計測したデータのパソコンへの入力
   4チャンネルの10ビットのA/D変換結果のデータをパソコンに送ります。
 (3) ディジタルポートの制御
   発光ダイオードのOn/Off制御など
 (4) 液晶表示器への表示メッセージ出力
   パソコンからのメッセージを液晶表示器に表示する。

【ユニットの構成】

この計測ロガ−ユニットの内部構成は下図のブロック図のようになっています。
まず、中心はPIC16F876です。これはPIC16F873でもユーザープログラムが
余り大きくなければ十分使えます。
USBのコントローラのUSBN9603はPICとSPI通信モードで接続しています。

アナログ入力部は、オペアンプのLMC662だけの簡便な構成にしていますので、
本格的なセンサーなどの計測を行うには、前段にセンサーとのインターフェース部
が必要となります。







【回路構成】

本ユニットの回路は下記の回路図のようになっています。PICとUSBNの接続を
SPIとしましたので、線の本数が少なく回路も簡単になります。

4チャンネルの計測部分の回路は簡易回路となっています。本格的なデータ計測
をするためには、ノイズ対策、高精度化、センサーインターフェースなど手を加える
必要があります。

USBN9603用のクロック回路は、通常のクリスタル振動子と、クリスタル発振器の
両方いずれでも使えるようにしました。
24MHzという高い周波数なので、発振ユニットとなった、クリスタル発振器を使った
方が安定に発振します。今回は振動子のHC49USと同じ外観のクリスタル発信器
を使っています。

USBのインターフェースは、セルフパワーとし、デバイス側で電源を持つ回路と
しました。ユニットとしてはわずかな電流しか消費しませんから、バスパワーでも
十分可能ですが、この場合には、電源に十分のフィルターを挿入して、アナログ入力
へのノイズ対策を考慮する必要があります。






下記ファイルはWinDraft、WinBoard用の回路図とパターン図です。
ダウンロードし解凍してお使い下さい。

  ★ 回路図ファイル(WinDraft用)
  ★ パターン図ファイル(WinBoard用)


【デバイス側プログラム】

下記がデバイス側のプログラムの全体で、5つのファイルがダウンロードされます。
すべてアセンブラで作成していますので、解凍すれば、MPLABでそのままアセン
ブル可能です。PIC16F876が対象プロセッサとなっています。

 ★ デバイス側プログラム
   ・usbdvc2.asm  :メインプログラム本体
   ・usbdat.h     :USBに関するデータ定義ファイル
   ・usbmac.h    :マクロ命令の定義ファイル
   ・usbn9602.h   :USBN9602のICのレジスタ類の定義ファイル
   ・usbsym.h    :USBに関するパラメータ類の定義ファイル


 改良版 デバイスプログラムです。
  
  ★ 改良版 デバイス側プログラム (11/24)
   プロダクトIDが0x0042 に変わっています。


このデバイス側プログラムは、下記を参考にさせて頂きました。

  ★ トランジスタ技術 2000年6月号の渡辺明禎氏のプログラム

上記をベースにして私が作成した「基本デバイスプログラム」に、各エンドポイント
の処理部分を追加します。
エンドポイントの構成は下表のようにしています。IN/OUTの見方はホスト側から
見た入出力となっています。
USBN9603は最大でエンドポイントがコントロール+6個まで使えます。基本デバ
イスプログラムでは、全部が使えるようになっていますが、計測ロガ-として使って
いるのは、下表のコントロール+4個です。

パイプNo エンドポイント IN/OUT 用途
無し IN/OUT コントロール転送
コンフィギュレーション用
バルクIN 未使用
バルクOUT コマンドの出力
計測指令などの指示
バルクIN 未使用
バルクOUT ディジタル出力
発光ダイオードの点滅制御
バルクIN 計測データ入力
4チャンネル10ビットのA/D変換データ
バルクOUT 液晶へのメッセージ出力
16文字までのメッセージ表示用

基本デバイスプログラムに追加したユーザープログラム部分は下記のように、各パイプ
の処理になっています。
まず一つ目が、パイプ1のコマンドの受信部分で、下記リストのように、コマンドの値を
判別し、「1」だったら計測指示として、4チャンネルのA/D変換をして、送信バッファに
格納すると同時に、液晶表示器の2行目に16進数で表示します。計測が完了したら
すぐUSBのパイプ4で送信します。






次は、パイプ3の受信処理部で、受信したデータの1バイト目をディジタルポート
への出力データとしてそのままポートCへ出力しています。
さらに残りは、パイプ5の受信処理部で、受信した16バイトのデータを液晶表示器
への表示データとしてそのまま液晶の1行目に出力します。
USBのパイプ0,2,4の送信処理は、単独で行うことは特別にはありません。







【ホスト側テストプログラム】

ホスト側のプログラムとしては、デバイスドライバとアプリケーションプログラムが
必要となります。
まず、デバイスドライバは下記をそのまま使わせて頂きました。
INFファイルにデバイスを追加します。追加デバイスは下記とします。
  ベンダーID : 0x9B9
  プロダクトID: 0x0042


 ★ 柏野 政弘氏作 「汎用USBドライバ」(Interface 2000年3月号)

アプリケーションプログラムは、Visual Basic Ver6 で作成しました。
プロジェクト関連ファイルをダウンロードできるようにしましたので、お使い下さい。

 ★ USB計測ロガ−テストプログラム(VBプロジェクト関連ファイル)

 ★ USB計測ロガ−テストプログラム実行ファイル
    (VB6のランタイムパッケージが必要です)


今回のアプリケーションプログラムは、ユニットのテスト用として作成したもので、
下記のような機能を持っています。

(1) ディジタルポートの制御
  3個の基板上の発光ダイオードの点滅制御が出来ます。
(2) 計測コマンド出力と計測データの入力表示
  計測コマンドを手動、または一定時間間隔で自動で出力し、応答として返される
  4チャンネルの計測データを、16進数として表示します。
(3) 液晶表示器へのメッセージの出力
  テキストボックスに書かれたメッセージをUSB経由で送り、液晶表示器に表示する。

まずフォームは下図のようになっていて、上から、ディジタル制御、計測データ表示、
液晶へのメッセージ送信 という機能となっています。

(1) ディジタル制御
  各bitのチェックボックスをチェックしてLED点灯とすると、チェックがあるところは
  Highの出力が出ますので、LEDは消灯し、チェックが無いところのLEDは点灯します。
  今回のユニットでは、下位3ビットのみに発光ダイオードが実装されています。
(2) 計測データ表示
  手動計測とすると、1回だけ計測して4チャンネルの計測データを表示します。
  自動計測とするとタイマーで1秒間隔で計測し、毎回結果を表示更新します。
(3) 液晶表示
  テキストエリアに入力したメッセージをそのままUSBで送り、デバイス側の液晶表示
  器に表示します。






《参考》
 液晶表示器への転送機能のところで、UNICODEからANSIコードの配列変換で
 困りました。つまり、VBの中ではUNICODEですべて扱われるので文字が2バイ
 トで表現されており、そのまま液晶表示器に送ると意味不明の表示になってし
 まいます。これをANSIコードつまりバイト単位の文字列に変換する必要があり
 ます。
 下記はその変換の手法です。 これは下記本を参考にしました。

  ★ 「Visual Basicでエンジョイプログラミング」 互野 恭治著 CQ出版社

(1) ANSI側の配列変数を宣言する。
  このときインデックスは指定しないでおく。指定してしまうとそれぞれが独立
  変数となってしまい、バイト列(つまり文字列配列)として扱えなくなってしまう。

  Dim data( ) As Byte

(2) UNICODEからASCIIコードへの変換には StrConv関数 を使う
  またStrConv関数の第2パラメータには、vbFromUnicode を指定して変換後
  にVBシステム既定コード(つまりASCII)になるように指定する。

   data( ) = StrConv (Left (Text2.Text & " (16個のスペース) ", 16), vbFromUnicode)

(3) あとは通常のバイト列の文字列として扱うことができる。
  LeftB、RightB、MidBというバイト文字列扱いとする







【ロガ-ホストプログラム】   

アナログデータの計測をしながら。そのトレンドをグラフで表示するプログラムを
作成しました。
下記はVisual Basicのプロジェクトファイル1式です。解凍してお使いください。

  ★ トレンドグラフ表示プログラム
    (実行ファイルも含んでいます)

このトレンド表示プログラムは下記のような機能を持っています。

(1) プログラムロード時にUSBロガ-をオープン
  プログラム起動時にUSBロガーのパイプをオープンします。従って
  本プログラム起動前に、ロガ-ユニットのUSB接続が完了し、汎用USB
  ドライバが起動している必要があります。
(2) 4チャンネルのデータのグラフ表示
  データは10ビットバイナリ値をそのまま扱っています。(データ変換なし)
  最大10000回の計測値をグラフ表示します。
(3) 計測間隔の指定とグラフX軸時間値表示
  計測インターバルをmsec単位で指定して計測できます。
  最小10msec、最大30000msec(30秒)まで指定できます。このインターバル
  に合わせてX軸の時間表示を変更しています。1000msecまでは「秒」で、
  それ以上は「分」で表示します。
  10000サンプルまでですので、10msec間隔だと100秒、30sec間隔だと
  300000秒=5000分=約83時間のトレンドグラフとなります。
(4) グラフデータのファイル格納、読み込み表示
  測定しグラフに表示したデータをCSV形式のファイルとして保存します。
  また格納されているデータを読み込んでグラフとして表示出来ます。
(5) デバイスの液晶表示器へのメッセージ表示
  計測の開始、終了、インターバル時間、プログラムの終了をメッセージと
  してデバイス側の液晶表示器に表示する。
(6) プログラム終了とUSBクローズ
  プログラムを終了させると、デバイスの液晶表示器にEnd Program と表示
  して、全てのUSBパイプをクローズしUSBロガ-をクローズします。
  このあとは、USBロガ-を他のプログラムで使うことも可能ですし、切り離す
  ことも問題ありません。

下記はトレンドグラフの表示例です。(拡大表示できます)






【外観】

USB接続の計測ロガ-の外観は下図のようになっています。ボード単体
です。


全体外観で、液晶表示器など外部接続は
すべてコネクタとしました。





中央がPIC16F873/876でUSBN9603は裏側の
半田面にあります。



USBN9603回りの部品でクロックには24MHzの
HC49USタイプのクリスタル発振器を使いました。
USBの接続にシリーズB用のソケットを実装しました。




USBN9603はフラットパッケージなので直接
基板の半田面に直付けしています。
USBソケットのピン配置を間違えてしまい
修正ストラップを追加しています。



基板CADのWinBoardにはフラットパッケージの
パターンがあらかじめ用意されているので、簡単に
パターンが作成できます。半田付けも、一度たっぷりの
半田でピンを半田付けし、あとで、こてで余分な半田
を取り除きながら、ピン間のブリッジを無くして行けば、
比較的簡単に半田付け出来ます。







目次に戻る