覚え書きブログ

複数のジョイスティック読み込み覚え書き

複雑なロボットを制御するために、2つのジョイスティックの状態を読み込むプログラムを作ったので、メモっておく。

Windowsでは、ジョイスティックの状態を読み込むためには、マルチメディアのAPI「mmsystem.h」を用いる。
具体的には、下記のJOYINFOEX構造体を用いる。
https://msdn.microsoft.com/en-us/library/windows/desktop/dd757112(v=vs.85).aspx

JOYINFOEX構造体を使うためには、ヘッダーファイルmmsystem.hをインクルードする必要がある。ただし、mmsystem.hの前に、windows.hをインクルードしておかないとエラーがでるので注意が必要。

#include <windows.h> //これが無いと、mmsystem関連のエラーがでる
#include <mmsystem.h>

また、プロジェクトのプロパティの「リンクー」->「入力」->「追加の依存ファイル」に、「winmm.lib」を追加する。

そして、main関数で、JOYINFOEX構造体変数を宣言・初期化した後、ジョイスティックのIDとJOYINFOEX変数を指定してjoyGetPosEx関数を実行して、ジョイスティックの状態を取得する。ここで、ジョイパッドのIDとしては、JOYSTICKID1、JOYSTICKID2のように順番に指定する。取得したジョイスティックの状態は、それぞれJOYINFOEX構造体のメンバ変数を用いて参照することができる。例えば、ジョイスティック1のX軸方向の値は、joy1.dwXposにより参照することができる。
https://msdn.microsoft.com/en-us/library/windows/desktop/dd757108(v=vs.85).aspx

以下は、2つのジョイパッドの状態を読み込み、それぞれのX,Y軸の位置と、ボタンの値を表示するプログラムの例である。

// JOYINFOEXの初期化
JOYINFOEX joy1;
JOYINFOEX joy2;
joy1.dwSize = sizeof JOYINFOEX;
joy1.dwFlags = JOY_RETURNALL;
joy2.dwSize = sizeof JOYINFOEX;
joy2.dwFlags = JOY_RETURNALL;

while (1){		
	//ジョイスティック1の位置とボタンの値の取得
	if (joyGetPosEx(JOYSTICKID1, &joy1) == JOYERR_NOERROR){

		//ジョイスティック2の位置とボタンの値の取得
		if (joyGetPosEx(JOYSTICKID2, &joy2) == JOYERR_NOERROR){

			// X, Y軸の位置と、ボタンの値出力
			printf("x1:%d,y1:%d,button1:%d\t x2:%d,y2:%d,button2:%d\n", joy1.dwXpos, joy1.dwYpos, joy1.dwButtons, joy2.dwXpos, joy2.dwYpos, joy2.dwButtons);
		}
	}
}

下記からプログラム一式をダウンロードすることができる。
https://drive.google.com/open?id=0B3uB4w2FEJbIS0M5bHJlMEIyeUE

下図は実行例である。
f:id:hirotaka_hachiya:20160404171850p:plain

ちなみに、PCで認識されたジョイスティックは、以下のように「デバイスとプリンター」にジョイスティックのアイコンで表示される。また、アイコンを右クリックし「ゲームコントローラーの設定」を、ジョイスティック名を選択し、右クリックで「プロパティ」を選択することにより、ジョイスティックの動作確認ができる。
f:id:hirotaka_hachiya:20160404171550p:plain