OpenStickでフォースフィードバックができないか

前々からOpenStickでフォースフィードバックができないかと考えており調べています。
フォースフィードバックが出来るとフライトヨークにグイグイ力を加えたり、ヨットシミュレータで風の強さを手元に感じたりと夢が広がります。

が・・・
単純に入力だけのジョイスティックと比べて格段に難しいです。情報も少ないし、
このあたりを読んでも解らない事だらけです(しかも英語なんです)。

まず、普通のHIDデバイスはUSBのクラスIDは3番ですが、フォースフィードバック(PIDデバイス)の場合はどうなのでしょう?5番という記述も見るのですが、HIDと違う番号でPC側は問題ないのでしょうか?・・・といったところからして解りません。

そもそもウチにあるフォースフィードバックデバイスといえば「SideWinder Force Feedbak Pro」という古いジョイスティックがあるのですが、これはゲームポート&MIDIポートに接続する仕様の為、参考になりません(どこに仕舞ったかわからず写真も取れません)。

そこで何かフォースフィードバックのUSBデバイスが欲しいと思い、これを買ってきました。

BUFFALO BSGP1204

BUFFALO BSGP1204 ¥1980-

とりあえずPC(Windows7)に挿してみます。しかし暫く待っても認識されませんでした。ジョイスティックはドライバなぞ要らないもんだと思っていましたが、これは駄目なようです。そこで付属のCDからドライバを入れました(ドライバを入れた後も認識に暫くかかっていたので、もしかするとそのまま待っていれば認識したのかもしれません)。
OpenStickでフォースフィードバックデバイスを実現できたとして、PC側に何らかのドライバを書く必要があるのでしょうか?

コントロールパネルの「デバイスとプリンター」からデバイスの設定画面を出してみると下の様な派手なのが出ました。

BSGP1204Setting

セッティング画面

「バイブレーション」タブを押すと次の様な画面に変わります。

BSGP1204Setting2

バイブレーション設定画面

ここで「左側が振動」とか「右側が振動」とかをクリックするとゲームパッドがぶるぶると震えるので動作はしている様です。

次にこのデバイスのディスクリプタ類を見てみます。以前やったのと同様に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からフォースフィードバック機器がどの様に見えるのかを知っておく必要があると思い、まずは振動を送るプログラムを書いてみようしてこちらもハマっています。

道は遠そうなのでぼちぼちやります。
どなたか詳しい方にアドバイスを頂けるとうれしいのですが・・。

 

4 thoughts on “OpenStickでフォースフィードバックができないか

  1. 通りすがり

    初めまして。的を外していたらすみません。振動制御用のEP OUTが無いのはEP0のコントロール転送を使っているからではないでしょうか?キーボードでもLED制御用のEP OUTを用意せず、EP0 OUTを使ってLEDの制御を行うことがあります。

    Reply
    1. ほいほい堂本舗

      通りすがり様
      アドバイスありがとうございます。
      ここらへんがよくわからないんですが、EP0を使う場合リポートディスクリプタにOUTPUTを書かなくても使えるのでしょうか?

      また↓この資料の7ページとかを見るとコントロールとは別のパイプを使う様な絵が描かれています。どちらでも可能なんでしょうかね?
      http://www.usb.org/developers/docs/devclass_docs/pid1_01.pdf

      # 色々とむつかしくてちょっとくじけそうになっています。

      Reply
  2. ほいほい堂本舗

    通りすがり様
    すみません、上の返信は勘違いしていました。
    リポートディスクリプタにはOUTPUTの記述がありました。
    入力用しか記述がないのはエンドポイントディスクリプタの方でしたね。
    確かにEP0は元々あるエンドポイントにつき新たに宣言しないので頷けます。

    # もう少し調べてみます。

    Reply
  3. Pingback: OpenStickでフォースフィードバックができないか~2~ | ほいほい堂blog

Leave a Reply

Your email address will not be published. Required fields are marked *


*