2019年8月12日月曜日

HIDアナログ軸

 HIDで使えるアナログ軸の内、Winで使えるものと使えないものの一覧。


 重複定義できる(sim.upgの)軸だと、ラダー/スロットル/ブレーキの3軸が使用できる。重複定義できない(desktop.upgの)軸では、X/Y/Z/Rx/Ry/Rzの6軸とホイール/ハットスイッチの8軸が使用できる。

 ハットスイッチは、実態としてはただのアナログデータ(符号付き整数)だが、大多数のゲームでは45*100の整数倍と-1を入力として受けるような処理になっているので、マイコン側で適当に離散化してやるほうが良い。
 動作確認だけなのでレンジを-2048から+2047の範囲として、マイコンからもその値を出すようにしているが、この状態だと0から325度くらいの範囲に割り当てられる感じ。負数になっても入力として判定されている。おそらくロジカルレンジで0から36000を指定し、方向キーが押されていない場合は-1を返してレンジ外に出す、みたいな挙動になるはず。

 前回のエントリでsim.upgは8bit以外が使えないっぽい、と書いたが、これは誤りのようだ。既定値にリセットを行ったら正常に動作した。HIDが使えるようになった最初の頃にキャリブレを行ったような気がするので、その時のデータが残っていたらしい。


 市販のフライトスティックとかってどんな割当になってるんだろうか? HOTASを意識したフライトスティックだとスイッチが大量についていたり、トグルスイッチがついていたりするけど、標準のHIDゲームデバイスとして使えるんだろうか? ゲーミングPCとか売ってるショップに行って設定画面見ればわかりそうだけど、このあたりじゃゲーミングPCなんて扱ってる店自体無いからなぁ。


 とりあえずHIDで使える入力のおおよその上限はわかったから、それを目安にユニ基板で簡単なテストボードを作ってみようっと。


追記

 どうやら、アナログ軸はsim.upg/desktop.upg合わせて8軸が上限らしい。それ以上だと適当に端折られる。
 また、ハットスイッチ(POV)は、ロジカルMINが0、ロジカルMAXが31500で、-1を返せば無入力、という挙動らしい。実際のところは-1である必要はなく、ロジカルレンジ外であれば無入力になるが。ロジカルMAXが31500なので、当然ながら320度とかの入力はできない。つまり、ハットスイッチをハットスイッチとして使うなら、ソフト側は連続値を扱う必要はなく、ハード側は離散値を送る必要がある。連続値だとifで処理するなり、割り算を使う必要があるが、離散値ならswitchで分岐できるし、そういう由来でこのような挙動になったと思われる。
 念の為にハットスイッチの入力をifで分岐する、というようなサンプルプログラムがあるけど、その必要は無いらしい。もっとも、これはゲームコントローラー側が紳士的に実装されているという前提に立つので、そうでないモノを相手にする場合はやはりifや割り算を使うべきだが、まぁそんなコントローラーは今すぐ投げ捨ててしまえ、とも言える。


 おそらく、Winが扱えるゲームコントローラーで一番入力が多い時の画面。


 6軸+32ボタン+1、の構成。


 プロパティ画面をググってみると、ダイヤルやスライダーなど、上記テスト時にはNGとした軸が使われている例もある。入力デバイスの種類によって使える組み合わせが変わるのかもしれない。

0 件のコメント:

コメントを投稿