DUALSHOCK4について

SIXAXISのときもやりましたが、DUALSHOCK4でもハードの仕様と取得されるデータ構造をまとめておきましょう。

仕様

まずは基本的な仕様を確認してみます。

品名 DUALSHOCK 4
接続 Bluetooth Ver2.1+EDR準拠
USB(Micro B)
ボタン数 18ボタン
方向キー(POV)、アクションボタン(○×△□)、L1/R1/L2/R2ボタン、左スティック/L3ボタン、右スティック/R3ボタン、SHAREボタン、OPTIONSボタン、PSボタン、パッドボタン
アナログ入力 L2/R2ボタン、左スティック/L3ボタン、右スティック/R3ボタン
タッチパッド 2点検出式タッチパッド、クリック機構、静電容量方式
解像度:1920×900
モーションセンサー 6軸検出システム(3軸ジャイロ、3軸加速度)
振動機能 あり
端子 拡張端子
ステレオヘッドホン/マイク端子
その他 ライトバー、振動機能、スピーカー(モノラル)内蔵
メーカー ソニー・コンピュータエンタテインメント(SCE)
定価 6,458円(税込)

価格.comでも5000円。Wiiリモコンプラスの最安値2551円(希望小売価格 3619円)と比較するとやっぱり高いですね。まあSONYだし仕方ない。

今回はPCに繋ぐだけで、BluetoothでもUSBでも簡単に普通のゲームコントローラとして認識するようになりました。ドライバのインストールは不要です。 SIXAXISの頃は、入れ方間違えると悲惨なことになるドライバがあったり、配布元がよく分からなかったりいろいろありましたねー。ドライバ不要は本当にありがたいです。
PCで使用するとL2/R2から第5,6軸のアナログ値が取得できます。(アナログ値と同時にボタンが押される特殊仕様。実はこの仕様がちょっと困る。)
さらにPSボタンとタッチパッド押下の2ボタンが使用できるので、通常のゲームコントローラより多くの値が取得できます。 アナログ第1~6軸が取得できるのは、他にフライトシミュレーション用のコントローラぐらいだと思います。 こういう実装が将来PC用コントローラのスタンダードになっていったりするんでしょうか。
このように通常のゲームコントローラよりも多くの値が取得できるすぐれもの。これを活かしたゲームとか作りたいですね。

Windows標準ドライバで動作するのですが、振動に対応しません。しかし標準で使えることは地味に重要だと思います。
私のつたない経験上、ドライバが違うとプログラムでの取得値の場所がバラバラで困った経験があります。今回はドライバ無しの状態が示されているので 振動対応のドライバが出てもフォーマットが変わらないんじゃないかと期待しています。

さて、機能追加ばかりでなく逆に機能削減されたものもあります。
DUALSHOCK3まで搭載されていた、全ボタンの圧力による256段階のアナログ判定がなくなりました。残ったのはL2/R2ボタンのアナログ入力だけとなります。

解剖調査結果を検証してみた

すでに解剖結果のレポートが上がっているので、詳細はこちらをご覧ください。

Kako's Home page:http://www.kako.com/
PLAYSTATION4用DualShock4を調べてみる

SIXAXISに続き、今回もこちらのサイトのお世話になりました。写真が大きいので助かります。

モーションセンサーの位置がわかりにくいですが、左手側の基板の裏側、下の方にチップがついています。
Bosch社のBMI055と言われているそうです。

センサーの方向を見てどの向きが正負か調べてみたのですが、どうにも私の頭が悪いために理解できませんでした。 カタログ見てもZが上向き正の図になってるのに、重力加速度(下方向)がプラスって意味不明です。よくわからないので取り敢えず実測して正負を調べることにしました。

データ構造

USB接続状態で、通常のHIDとして取得すると簡単にデータが取得出来ました。
ベンダーID:0x054C
プロダクトID:0x05C4
全64byte

情報がなかったので、全て手探りで調べました。
私の環境でしか確認していないので、もしかすると環境によって異なるかもしれません。その点はご了承ください。
それにしてもタッチパッドが12bitなのが悩ましいですね。どう処理すればよいのやら…。

Bytebit 7bit 6bit 5bit 4bit 3bit 2bit 1bit 0
0ReportID(0x01)
1LAnalogX(0x00 ~ 0xFF)
2LAnalogY(0x00 ~ 0xFF)
3RAnalogX(0x00 ~ 0xFF)
4RAnalogY(0x00 ~ 0xFF)
5 △ Triangle
Button Flag
○ Circle
Button Flag
× Cross
Button Flag
□ Square
Button Flag
UP/RIGHT/DOWN/LEFT Button(0x0~0x7)
Not pressed(0x8)
6 R3 Button
Flag
L3 Button
Flag
OPTION
Button Flag
SHARE
Button Flag
R2 Button
Flag
L2 Button
Flag
R1 Button
Flag
L1 Button
Flag
7Unknown(0x??)
8L2 Button Level (0x00 ~ 0xFF)
9R2 Button Level (0x00 ~ 0xFF)
10Unknown(0x??)
11Unknown(0x??)
12Unknown(0x??)
13
14
X Axis Angular Velocity Value (0x0000 ~ 0xFFFF)
15
16
Z Axis Angular Velocity Value (0x0000 ~ 0xFFFF)
17
18
Y Axis Angular Velocity Value (0x0000 ~ 0xFFFF)
19
20
X Axis Acceleration Value(0x0000~0xFFFF)
21
22
Z Axis Acceleration Value(0x0000~0xFFFF)
23
24
Y Axis Acceleration Value(0x0000~0xFFFF)
25Unknown(0x00)
26Unknown(0x00)
27Unknown(0x00)
28Unknown(0x00)
29Unknown(0x00)
30 Unknown(0x0) Unknown(0x0) mini-plug
Connection
Flag
Unknown(0x0) Unknown(0x0) Unknown(0x0) Unknown(0x0) Unknown(0x0)
31Unknown(0x00)
32Unknown(0x00)
33 Unknown(0x0) Unknown(0x0) Unknown(0x0) Unknown(0x0) Unknown(0x0) Unknown(0x0) Touchpad? Unknown(0x1)
34Touchpad ? (0x??)
35Touchpad_1st touched count
36Touchpad_1st X coordinate(0x*00~0x*FF)
37 Touchpad_1st Y coordinate(0x**0~0x**F) Touchpad_1st X coordinate(0x0**~0xF**)
38Touchpad_1st Y coordinate(0x00*~0xFF*)
39Touchpad_2nd touched count
40Touchpad_2nd X coordinate(0x*00~0x*FF)
41 Touchpad_2nd Y coordinate(0x**0~0x**F) Touchpad_2nd X coordinate(0x0**~0xF**)
42Touchpad_2nd Y coordinate(0x00*~0xFF*)
43Unknown(0x00)
44Unknown(0x80)
45Unknown(0x00)
46Unknown(0x00)
47Unknown(0x00)
48Unknown(0x80)
49Unknown(0x00)
50Unknown(0x00)
51Unknown(0x00)
52Unknown(0x00)
53Unknown(0x80)
54Unknown(0x00)
55Unknown(0x00)
56Unknown(0x00)
57Unknown(0x80)
58Unknown(0x00)
59Unknown(0x00)
60Unknown(0x00)
61Unknown(0x00)
62Unknown(0x80)
63Unknown(0x00)

十字キー(POV)は次のようになっています。

bit012345678
動作 ↑→ →↓ ↓← ←↑ 押下なし

この他、空き領域が沢山あるのでマイク入力や拡張端子からの入力が入ってくるのかもしれません。
また加速度と角速度の単位についてもよく分からなくて、追跡調査が必要そうです。
しかしこれ、PSボタンとタッチパッドボタンが入ってないんですよね。これも謎です。

座標軸

座標軸
これも手探りで調べました。
図の赤矢印方向が加速度の正方向。
緑の矢印が回転の正方向。
SIXAXISとは随分違うようです。

加速度は右手系なのに、回転は右ネジではありませんでした。謎です。とりあえず本体を緑矢印の方向に回すと正の値が出力されます。
もしかすると私のほうが解釈をなにか間違えているのかもしれません。orz

ともかく方向さえ分かってしまえば、後は好きなように正負反転させるなりして使うことが出来ますね。

確認用のサンプルプログラム

確認用のサンプルプログラム…は前回公開したのがありますので、そちらでご確認ください。