光学工房

光科学及び光技術調査委員会
■
光
学
工
房
気
軽
に
U
S
B
光
の
広
場
研究には,さまざまな機器を駆 して実験を行う
1. デバイスドライバー UUSBD
必要に迫られる場合があります.さまざまな機器の
Windows のプログラミングですので,USB 機器
さまざまなパラメーターを制御しながら計測するた
を制御するためにはデバイスドライバーが必要とな
めには,それらの設定を手作業で操作を行うのでは
ります.ここでは,柏野政弘氏が 開 (http:/
/www.
なく,機器を PC(personal computer)に繫げて
otto.to/kasiwano/newpage17.htm)している汎用
実 験 を 行 い ま す.一 昔 前 な ら,RS-232(Recom-
USB デバイスドライバー uusbd.sys とダイナミッ
mended Standard 232) や GP-IB (General Pur-
クリンクライブラリー uusbd.dll を用いて制御して
pose Interface Bus, IEEE 488)での制御で事足り
みました.
ていました.しかし,USB (universal serial bus)
UUSBD は ユ ー ザ ー プ ロ グ ラ ム か ら の read/
が PC にほぼ標準的に搭載されるようになってか
write をそのままデバイスへの USB の送受信コマ
ら,USB をインターフェースにもつ機器が増えて
ンドとして通信します.したがって,ユーザープロ
きて,USB による機器制御が必要になってきまし
グラムは UUSBD を通じて直接 USB 機器とデータ
た.今回,USB をインターフェースにもつ
をやり取りするようにプログラミングできます.
光器
(Ocean Optics 社:HR2000)からのスペクトル取
得に迫られましたので,USB によるデータ取得プ
さて,UUSBD でプログラミングする際に必要な情
報は,
ログラミングについて紹介したいと思います.な
1. Vendor ID
お,確認はしていませんが,同社の USB2000 とコ
2. Product ID
ードは互換性があります.また,少し拡張すれば簡
3. データ転送のためのパイプ番号
単に最近の USB
4. USB コマンド
光器からのデータ取得も可能に
なると思います.
です.これらの情報は,Ocean Optics 社の場合で
さて,Windows 以前のプログラミングは非常に
はホームページの Engineering docs (http:/
/www.
簡単でした.例えば,各ポートに対する命令さえわ
oceanoptics.com/technical/engineeringdocs.asp)
かれば,直接 I/O ポートに命令を送ることで制御
で 開されています.
ができたからです.しかしながら,Windows プロ
UUSBD のインストールに関しては,柏野政弘氏
グラムでは直接ハードウェアを制御することはでき
のホームページ等を参 にしてください.インスト
ず,かならずデバイスドライバーを通して制御を行
ール後,uusbd.inf ファイルの VID (vendor ID)と
わなければなりません.デバイスドライバーの作成
PID(product ID)を 3か所ずつ設定する必要があ
も可能ですが,敷居が高くそう安々とは行えませ
ります.Ocean Optics社の VendorID は 2457,HR2000
ん.もちろん,機器メーカーは,デバイスドライバ
(USB2000)の Product ID は 100A (1002)なので,
ーを用意し,これを うためのライブラリーを提供
これらを書き換えます(いずれも 16進数表記です)
.
していますが,これらが非常に高価である場合があ
なお,VID,PID 等を複数記述することも可能です.
ります.そこで,メーカー提供のライブラリーを
わない, 開されている通信コマンドを用いたプロ
グラミングを紹介します.
2. プログラミング
実際のプログラミングでは,USB デバイスのオ
ープン (Uusbd Open,または Uusbd open mask)
,
37巻 3号(2 08)
199 (59 )
リスト 1
USB デバイスのパイプハンドルの取得 (Uusbd
FIFO メモリーを,ハードウェアレベルではエンド
,データの送受信(ReadFile,WriteFile:
OpenPipe)
ポイントとよびます.ユーザープログラムでは,エ
いずれも Windows のファイル操作 API 関数)
,パ
ンドポイントと直接やり取りするのではなく,パイ
イプのクローズ(CloseHandle:Windows の API
プとよばれる仮想的な通信経路を ってデータを送
関数),デバイスのクローズ(Uusbd Close)を順
受信します.したがって,ユーザーとしては,何番
に行います.
パイプで,どのようなデータをやり取りすればよい
USB は複数の機器を数珠つなぎで接続すること
かがわかれば,プログラミングが可能となります.
ができます.したがって,どの USB デバイスに通
HR2000 では,EP2(エンドポイント 2)がコマン
信を行うのか,指定する必要があります.Uusbd
ドの送信とスペクトル情報の受信,EP7(エンドポ
Open 関 数 は uusbd.inf に 書 か れ た VID と PID に
イント 7)が 光器情報の受信のために用いられま
合致する USB デバイスをオープンします.したが
す.なお,HR2000 のデータシートにはエンドポイ
って,合致するものが複数ある場合は,そのうちの
ントとパイプの関係が示されていませんでしたが,
1つが選択されます(どのデバイスが選択されるか
他の
は,繫ぎかたに依存します)
.もし PID 等で選択し
Error から,パ イ プ 1が EP2 の 送 信,パ イ プ 2が
たい場合は,Uusbd open mask 関数を って選択
EP7 の受信,パイプ 4が EP2 の受信であることが
します.
わかりました.
USB はシリアル通信ですが,通信データを時
光器のデータシートからの類推と Try &
光器との通信は,パイプ 1に命令(先頭バイト
割して送受信し,USB デバイスの複数の FIFO メ
がコマンドを表し,その後に情報を付加する)を送
モリーと PC の複数のバッファー間でデータをやり
ることで行います.リスト 1(以下,C 言語のソー
取りすることができます.この USB デバイスの
スの一部.簡単のためエラー処理はない)に, 光
200 (60 )
光
学
光
の
広
場
リスト 2
器の積算時間の設定関数を示します.積算時間の設
行います.HR2000 の場合,1つのスペクトルは 16
定を表すコマンドが 0x02 で,これを先頭バイトと
ビット 2048個のデータからなりますが,各データ
し,続いて積算時間を表す情報を付加して,パイプ
は上位ビット,下位ビットに
1から送信しています.
ずつに 割されて送られてきます.なお最後にデー
光器からデータを受け取るには,パイプ 4を用
います.リスト 2は, 光器の各種設定情報を取得
けて,さらに 64個
タが終わったことを表す,0x69 の値が 1バイト付
加されています(リスト 3)
.
する関数です.まず,パイプ 1の先頭バイトに 光
器の設定情報の受信を表すコマンド 0x05 と,それ
以上のように,汎用デバイスドライバー UUSBD
に続いてどのような設定の返信を要求するか表すコ
を用いると,簡単に USB 機器を制御することがで
マンドを加えて送信します.例えば,0x00 はシリ
きます.もちろん,機器の USB コマンドが
アルナンバー返信要求を表します.そして,引き続
れている場合に限られますが.
いてパイプ 4を通して情報を受信します.
開さ
さて,筆 者 の グ ル ー プ で は,Igor Pro (wave-
同様に,スペクトルも取得することができます.
/www.wavemetrics.com)という
metrics 社,http:/
このときのコマンドは 0x09 で,パイプ 1でこれを
データ処理ソフトウェアを,機器制御にも用いてい
送信します.スペクトルの取得はパイプ 2を通じて
ます.今回,HR2000 と通信するプラグイン (Igor
37巻 3号(2 08)
201 (61 )
リスト 3
Pro では XOP とよばれています)も作成しました.
XOP は,ユーザーの自己責任の範囲内で
用して
用してみたい方,ソースファイルが必要な方は,
ください.これらの 用によって生じた不具合や不
筆者(mamoru@me.es.osaka-u.ac.jp)まで直接お
利益などについて,その妥当性を問わず日本光学会
問い合わせください.
ならびに著者は一切責任を負いませんので,ご了承
なお,例に掲げたプログラムの一部,ならびに
202 (62 )
ください.
(大阪大学 橋本 守)
光
学