ラベル libusb の投稿を表示しています。 すべての投稿を表示
ラベル libusb の投稿を表示しています。 すべての投稿を表示

2009年8月30日日曜日

ruby-usbが使えない

簡単なサンプルを実行しようとしてみたが、デバイスが出てこない。

おかしいなといろいろ調べたら、既存のドライバがデバイスをつかんでいるため、libusb側には何の情報も来ないということだった。

ドライバを入れなおすことも少しやってみたものの、うまくいかない。

う~ん、困ったぞ。

usbをつかうことをいったんやめて、シリアル通信にしてみるか。。。

それで、ruby-serialport-0.7.0を入れて動かしてみたら、ruby-1.8.xのDLLを要求された。ruby-1.9.1じゃないのか。
ソースをextconf.rbからMakefileを作成して、VC++でコンパイルを試みたが、エラーだらけでさっぱりわからない。

またしても、困った。

それで、仕方なく、wincom.rbというライブラリを使うことに。このライブラリは、windows専用なのだ。プラットフォーム依存バリバリ。でも、仕方ない。

2009年8月23日日曜日

ruby-usbのコンパイルが出来た


画像のようなエラーが出ていたため、libusb 用のライブラリがコンパイルできないと思っていたのだが、意外と簡単に解決した。


以下に手順を書くことにする。

  • はじめに
まずは、VisualC++が動くように /bin/vcvars32.bat を実行して環境変数を設定する。

  • ソース入手
ruby-usb - libusb binding for Ruby のサイトから ruby-usb-0.2.tar.gz をダウンロードする。


それから、libusb-win32も入手しておく。

これらのソースファイルを適当な作業用ディレクトリに展開する。

libsub-win32は、usb.hとlibusb.libは面倒だからruby-usbと同じフォルダーにコピーして配置した。

  • Makefile作成
READMEに書いてあるとおり、

ruby extconf.rb

を実行する。するとMakefileが出来上がる。

このMakefileをエディターで開いて、

LIBS = $(LIBRUBYARG_SHARED) oldnames.lib user32.lib advapi32.lib shell32.lib ws2_32.lib libusb.lib

のように、行の最後にlibusb.libをつける。これで先ほどのエラーが出なくなる。要するにエラーの原因はライブラリが読み込めてなかったということだった。

  • コンパイル&インストール
READMEの続きを実行する。ただし、VCなのでmakeじゃなく、nmakeとなる。

> nmake
> nmake install

最後に、usb.h と libusb.lib を rubyのインストールされているディレクトリ配下のinclude/ruby-1.9.1とlibにそれぞれ手で配置した。

irbを起動して、require 'usb'すると-->trueと返事が返ってきた。

これがつかえるとなると、DLなどを使ったコードを書かなくても済むに違いない。


スペアナGigaSt v5をrubyからコントロール出来るか

GigaSt v5というスペアナはUSBでPCとつながっている。だからrubyがUSBポートをコントロールできれば、スペアナのデータが取り出せるはずだ。

それで調査してみたのだが、WindowsXPのSP3以降には、MS純正のUSBドライバ(WinUSB.DLLとWinUSB.sys)が入っていることがわかった。

参考:
http://www.wdddc.net/node/25

参考URLの記事によると、以下のようなソフトウェア構成になるらしい。

[ユーザーアプリケーション](exe)
 ↑[ユーザーリンクライブラリ](WinUSB API群を利用するdll)
  ↑[WinUSB.DLL](Microsoft社提供WinUSB API群)
   ↑[WinUSB.SYS](Microsoft社提供WinUSB デバイスドライバ)
    ↑[ユーザーデバイス](ハードウェア)

それで、この絵の下から4番目(上から2番目)の部分にあたるDLLはどうするのかしら・・・とさらに調べた。

すると、libusb というユーザーモードのドライバが存在するらしい。それも、linux, MacOSX, WindowsをサポートしてLGPLで公開されているらしい。Windows版は、LibUsb-Win32。素晴らしい。

すると、あとは、rubyからこのLibUsb-Win32をコントロールできればいいわけだ。
rubyからDLLを呼び出す方法は2つほど存在するようだ。ひとつはWin32APIというライブラリを使う方法。もうひとつは、DLというダイナミックリンクライブラリを呼び出すためのCラッパーライブラリを使う方法。
後者の方が新しいらしく、OSに依存しないようにできるとか。特に、今回はlibusbというライブラリを使うので、このDLを利用したほうがよさそうだ。

ちなみに、rubyからlibusbドライバを呼び出すためのlibusbというライブラリも存在するのだが、こちらはWindowsではコンパイルできなかった。