スクリプトについて解説

サンプルスクリプトについて少し解説してみようかと思います。
といってもよく理解していない部分もあるので、処理の概略を追いかけるだけです。
間違っていて大きな問題になるといけないので、最終的には自分で確認するようにしてください。

基本的には通常のUSB機器から情報を受信する操作と変わり無いと思います。

スクリプト公開

サンプルの実行結果だけではよく分からないので、スクリプトを公開します。
微修正してるので以前公開したサンプルとちょっと違うかもしれませんが基本的にはほとんど変わっていません。気にしないように。
以下の文章は、サンプルスクリプトを見ながら読み進めていってみてください。
というわけで、SIXAXIS情報取得Sampleのスクリプトです。

SIXAXIS情報取得Sample(11 KB)

Usbd_Setup

まずは接続されたUSB機器を見つけます。
HidD_GetHidGuid関数でGUID取得してSetupDiGetClassDevs関数でHIDクラスのデバイスリストへのハンドルを取得します。
ええ、私も言ってて意味よく分かりません。w

Usbd_OpenDev

HIDデバイスの中から、ベンダーID(VendorID)とプロダクトID(ProductID)を元にSIXAXISを探します。
IDは自分で調べることも出来ますが書いておきます。これです。

#define global SIXAXIS_VID 0x054c ;ベンダーID
#define global SIXAXIS_PID 0x0268 ;プロダクトID

SetupDiEnumDeviceInterfaces関数でリストの先頭から順番に探していきます。
見つかったHIDデバイスは、SetupDiGetDeviceInterfaceDetail命令でデバイス名を取得します。
CreateFile関数でオブジェクトを開いてHidD_GetAttributes関数でHIDデバイスの属性を取得。
ここでようやく見つけたHIDデバイスのベンダーIDとプロダクトIDが分かります。

これをSIXAXISのベンダーIDとプロダクトIDと比較します。
一致していれば見つけたデバイスはSIXAXISです。
一致していなければそのデバイスはSIXAXISではありません。次のデバイスを調べます。

サンプルでは1つでもSIXAXISが見つかれば処理を終わらせるようにしています。
もし複数台のSIXAXISを使いたいなら引き続きデバイスが見つからなくなるまで検索する必要があります。

Usbd_SetupSixaxis

Usbd_OpenDevで取得したハンドル(SIXAXISのハンドル)を使って、 HidD_GetPreparsedData関数でデバイス(SIXAXIS)の能力情報を取得するための準備をします。
HidP_GetCaps関数でデバイスの能力に関する情報を取得します。
この結果から、デバイスと送受信するためのパイプのデータサイズを取得することもできます。
ちなみにSIXAXISのInputByteは49 Byte、OutputByteは0 Byteです。

Usbd_GetSixaxis

ReadFile関数でSIXAXISから情報を取得します。
49Byteの情報を受信しますので、受信する変数はあらかじめ

dim _PS3_data, 13

などとして49 Byte分(<13×4=52Byte)のメモリ領域を確保しておく必要があります。

さて、ここまでは通常のUSBデバイスに対する処理と変わらないので、 SIXAXISのドライバが違っても同じ作業で値が取得できるのではないかと思います。(詳細は未確認のため推測です。)

取得した値の内容はSIXAXISdriverの場合SIXAXISについて ~データ編~で一覧表にしていますので参照してください。

受け取ったデータの中身

ここからは使用するSIXAXISのドライバによって中身が違うので注意が必要です。
サンプルではSIXAXISdriverを使った場合ですので、ここではサンプルに従います。

取得した値はの内容は1~8 Bit区切りです。
この値の中からほしい値を抽出するにはpeek命令を使用します。
サンプルでは見やすくするために、いったん配列変数PS3_data_readに値を1byteずつ切り分けてみました。
こんな感じです。

	repeat 49
		PS3_data_read(cnt) = peek(PS3_data, cnt)
	loop
切り分けた後はそのまま使えるところはそのまま使い、ボタンのフラグのように 1bit区切りのデータはビット演算で抽出してください。
ちなみにUP/RIGHT/DOWN/LEFT Buttonは前4bitがつながっていますので、 4bitをそのまま抽出しないといけないので注意。

受け取ったデータの処理

取得した情報で注意が必要なのは、方向キーと、加速度センサー角速度センサーの値です。

方向キーはハットキーになっていますので、ビットフラグで判断できないので注意してください。

加速度センサーは3方向の値が取得できます。
また、1方向につき8bit+2bitの情報を受信できます。
ここは少し説明が必要な部分ですので説明しておきます。
説明のため2bitのほうの値をM_High、8bitのほうの値をM_Lowとします。
M_Highは正負の符号を意味していて、1のとき負、2のとき正です。1,2以外の値を返すことはありません。
M_Lowは加速度の量を示していますが、絶対値ではありません。
負(1)のときは255を0Gとして、0が最大化速度です。
正(2)のときは0を0Gとして、255が最大化速度です。
このようになっていますので、加速度の値は次のような計算で求めることが出来ます。
 acc = (M_High-2)*256 + M_Low
加速度センサの検出範囲が±2Gなので127ぐらいが1Gなのかもしれませんね。確認できないので分かりませんが。

角速度センサーはどうやらまともな値が取得できていないようです。
いくら振り回しても0~3の整数値しか返してくれず、扱いに困っています。
この値だけで十分と言う意味なのか、それともトラップなのか…。

後処理

サンプル内では取得した数値に後処理をほどこして、3D表示しています。
処理内容の意味はスクリプト見れば分かる人は分かるんでしょうが…。
このあたりについての説明はまた次回以降。