前々からOpenStickでフォースフィードバックができないかと考えており調べています。
フォースフィードバックが出来るとフライトヨークにグイグイ力を加えたり、ヨットシミュレータで風の強さを手元に感じたりと夢が広がります。
が・・・
単純に入力だけのジョイスティックと比べて格段に難しいです。情報も少ないし、
このあたりを読んでも解らない事だらけです(しかも英語なんです)。
まず、普通のHIDデバイスはUSBのクラスIDは3番ですが、フォースフィードバック(PIDデバイス)の場合はどうなのでしょう?5番という記述も見るのですが、HIDと違う番号でPC側は問題ないのでしょうか?・・・といったところからして解りません。
そもそもウチにあるフォースフィードバックデバイスといえば「SideWinder Force Feedbak Pro」という古いジョイスティックがあるのですが、これはゲームポート&MIDIポートに接続する仕様の為、参考になりません(どこに仕舞ったかわからず写真も取れません)。
そこで何かフォースフィードバックのUSBデバイスが欲しいと思い、これを買ってきました。
とりあえずPC(Windows7)に挿してみます。しかし暫く待っても認識されませんでした。ジョイスティックはドライバなぞ要らないもんだと思っていましたが、これは駄目なようです。そこで付属のCDからドライバを入れました(ドライバを入れた後も認識に暫くかかっていたので、もしかするとそのまま待っていれば認識したのかもしれません)。
OpenStickでフォースフィードバックデバイスを実現できたとして、PC側に何らかのドライバを書く必要があるのでしょうか?
コントロールパネルの「デバイスとプリンター」からデバイスの設定画面を出してみると下の様な派手なのが出ました。
「バイブレーション」タブを押すと次の様な画面に変わります。
ここで「左側が振動」とか「右側が振動」とかをクリックするとゲームパッドがぶるぶると震えるので動作はしている様です。
次にこのデバイスのディスクリプタ類を見てみます。以前やったのと同様にLinuxマシンに挿して・・・
まずlsusbコマンドでベンダID,プロダクトIDを見ます。
$ lsusb : : Bus 001 Device 005: ID 1dd8:000f
IDは「1dd8:000f」の様です。次に-v,-dオプションをつけてディスクリプタを見ます。
-vは詳細情報出力の意味、-dは指定デバイスのみ表示するオプションです。
$ lsusb -v -d 1dd8:000f Bus 001 Device 005: ID 1dd8:000f Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 8 idVendor 0x1dd8 idProduct 0x000f bcdDevice 1.00 iManufacturer 0 iProduct 2 iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 34 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 300mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 3 Human Interface Device bInterfaceSubClass 0 No Subclass bInterfaceProtocol 0 None iInterface 0 HID Device Descriptor: bLength 9 bDescriptorType 33 bcdHID 1.10 bCountryCode 0 Not supported bNumDescriptors 1 bDescriptorType 34 Report wDescriptorLength 94 Report Descriptors: ** UNAVAILABLE ** Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0008 1x 8 bytes bInterval 10 cannot read device status, Operation not permitted (1)
見たかったのはInterface Descriptor:内のbInterfaceClassです。
これは上に書いたクラスIDを示すものですが5番ではなく、やはり3番になっている様です。
また、良くわからないのはEndpointが入力用の1つだけである事です。想像では出力用にもう一つEndpointがあるものと思っていました。
余計にわからなくなってきました。
一旦これは置いときます。
いづれにせよPCからフォースフィードバック機器がどの様に見えるのかを知っておく必要があると思い、まずは振動を送るプログラムを書いてみようしてこちらもハマっています。
道は遠そうなのでぼちぼちやります。
どなたか詳しい方にアドバイスを頂けるとうれしいのですが・・。
初めまして。的を外していたらすみません。振動制御用のEP OUTが無いのはEP0のコントロール転送を使っているからではないでしょうか?キーボードでもLED制御用のEP OUTを用意せず、EP0 OUTを使ってLEDの制御を行うことがあります。
通りすがり様
アドバイスありがとうございます。
ここらへんがよくわからないんですが、EP0を使う場合リポートディスクリプタにOUTPUTを書かなくても使えるのでしょうか?
また↓この資料の7ページとかを見るとコントロールとは別のパイプを使う様な絵が描かれています。どちらでも可能なんでしょうかね?
http://www.usb.org/developers/docs/devclass_docs/pid1_01.pdf
# 色々とむつかしくてちょっとくじけそうになっています。
通りすがり様
すみません、上の返信は勘違いしていました。
リポートディスクリプタにはOUTPUTの記述がありました。
入力用しか記述がないのはエンドポイントディスクリプタの方でしたね。
確かにEP0は元々あるエンドポイントにつき新たに宣言しないので頷けます。
# もう少し調べてみます。
Pingback: OpenStickでフォースフィードバックができないか~2~ | ほいほい堂blog