Labview上でUSB制御をする
・概要
巷には、USBに接続する機器があふれていますが、それぞれの機器には専用のドライバが必要であり
自作したUSB機器を動作させるには、自分でドライバを作成しなくてはならなくなってしまいます。
しかし、そうした中で「汎用USBドライバ」というものが柏野政弘氏のHPにて紹介されています。
難しいことはできませんが、個人で制御ソフトを作るには十分な機能を備えていると思います。
VC++やVBでの制御方法は結構紹介されているようですが、開発ソフトのひとつである「Labview」での
製作例は無いだろうということで、インターフェースviを作ってみた過程を紹介します。
・Labviewとは?
Labviewとは、ナショナルインスツルメント社が開発した開発ソフトです。これで作ったソフトを入れ替えることにより
パソコンが電圧計になったりオシロスコープになったりします。(仮想的な計測器という感じです。)
当然、ソフトウェアだけでは電圧計にはなりませんので、A/Dボードなどが必要になりますが・・・
今回はver6.1を使用します。
・汎用USBドライバ UUSBD
柏野政弘氏が開発したUSB汎用ドライバです。
uusbd.dllが提供するAPIを利用することによりwin32アプリケーションより簡単にUSBにアクセスすることが
できます。今回はver1.3を使用することにします。公開されているパッケージは個人的使用に限られているようです
ので、自分で作った基板で通信してみることにします。
ドライバ自体は、上記サイトより入手してください。また、ドライバの組み込み方法も上記サイトをご覧ください。
・vi作り
各API関数は独自の引数・戻り値(UUSB型など)を使用しているため、そのままでは使えません。
Labviewで使用できるように、各データ型の大きさを知る必要があります。
各データ型は、以下のようでした。
・HUSB 4バイト(LONG)
・HANDLE 4バイト(LONG)
・ULONG 4バイト(UNSIGNED LONG)
・UCHAR 1バイト(UNSIGNED CHAR)
・USHORT 2バイト(UNSIGNED SHORT)
・BYTE 1バイト(UNSIGNED CHAR)
・BOOL 4バイト(UNSIGNED LONG)
これらを元に、UUSBD.dllとのインターフェースを作っていきます。
まず、LabviewよりUUSBD.dllを呼びださなくてはなりません。これを実現するのが「上級」内にある
「Call Library Function Node」です。左側より値を与えます。右側より値を受け取ります。
右側は最初が戻り値、arg1,arg2...となっているようです。
右クリックメニューより「構成...」を選び、設定画面を開きます。「ライブラリ名またはパス」にてUUSBD.dllを
指定します。すると、下の関数名の内部関数が選択できるようになります。「呼び出し規約」はstdcall(WINAPI)とします。
さて、これよりデータ型を一致させていきます。パラメータの「return type」は戻り値を意味します。
arg1より関数に与える引数を設定していきます。必要に応じて引数を追加していってください。
各関数プロトタイプは、以下のようにすることでインターフェースを実現することができます。
unsigned long Uusbd_AbortPipe( long arg1 );
unsigned long Uusbd_Check( long arg1 );
void Uusbd_Close( long arg1 );
unsigned long Uusbd_GetDeviceDescriptor( long arg1, void *arg2 );
long Uusbd_Open( void );
long Uusbd_Open_mask( unsigned long arg1, unsigned char arg2, unsigned char arg3, unsigned short int arg4, unsigned short int arg5, unsigned char arg6 );
long Uusbd_OpenPipe( long arg1, unsigned char arg2, unsigned char arg3 );
unsigned long Uusbd_ResetPipe( long arg1 );
long ReadFile( long hand, CStr buf, unsigned long rsize, unsigned long *rdsize, unsigned long ovl );
long WriteFile( long hand, CStr buf, unsigned long rsize, unsigned long *rdsize, unsigned long ovl );
一部はリストされていませんが、上記を基に作成できると思います。
・コツや注意点など
プロトタイプの中で「*char」など先頭のポインタを渡すものがありますが、これらの関数とインターフェースするときには
注意が必要です。C言語などでは、あらかじめ変数の宣言などでメモリ領域を確保してあったりしますが、Labviewではそれがありません。
領域を与えずにデータを読み出したりすると、ウィンドウズより不正なアクセスとして強制終了させられてしまいます。
回避方法としては、ポインタ渡しに対し相当分の領域をあらかじめ作って渡してやるのがあります。具体的には、*charで
16バイトの戻りがある場合、FORノードなどで文字列を16文字分作りそれを「Call Library Function Node」に渡してやります。
要は、「Call Library Function Node」によって、メモリ内容を壊させないってことですね。
同じ*charでも、Uusbd_GetDeviceDescriptor()などは文字列で返りませんので、クラスタなどで受けてやる必要があります。
・確認
簡単なサンプルで、送信と受信ができることを確認しました。
いろいろやっていませんので、引数などが間違っている可能性があります
・免責
趣味で作成した過程を紹介していますので、動作を保障するものではありません。
また、ドライバ自身は柏野氏に著作権がありますので、商用には利用できません。
この例を実際に使用したことにより発生したいかなる損害も責任を負いません。
戻る
(c)2002 Junnichi Tomaru