Wiiコントローラのセンサ値取得について – プログラミング – Home

Wiiコントローラのセンサ値取得につい...
 
通知
すべてクリア

Wiiコントローラのセンサ値取得について


2tom
 2tom
(@2tom)
ゲスト
結合: 16年前
投稿: 7
Topic starter  

現在、ゲームコントローラを使ったアプリの作成を行っています。

まず、XBox360コントローラをPCに接続し、DirectInputを使用して
スティックや、ボタンの状態を取得することはできました。
(ハットスイッチのみ取得できません。(^_^;))

次にWiiコントローラをBluetoothでPCと接続し、
Wiiコントローラのセンサの状態の取得を試みましたが
うまく出来ませんでした。
(Wiiコントローラのデバイスクラスは周辺機器(ジョイスティック)と
認識されています。)

XBox360のコントローラと同じように値を取得することはできないのでしょうか?
ご教授御願い致します。


引用解決済
トピックタグ
2tom
 2tom
(@2tom)
ゲスト
結合: 16年前
投稿: 7
Topic starter  

自己レスです。

その後、調べたところ、
1. http://paken.s1.hayasoft.com/down/denno2007.html

2. http://wiiyourself.gl.tter.org/
に説明が記載されておりました。

そこで、「1.」の「Wiiリモコンをもう一回見直してみます。」を参考にしながら、
プロジェクト名を「WiiControl」を作成し、Wiiコントローラ制御用のクラス
「WiiRemote」を追加し、「WiiRemote.cpp」を以下の様に作成しました。

****************************************************************

// WiiRemote.cpp : 実装ファイル
//

#include stdafx.h
#include <hidsdi.h>
#include <setupapi.h>
#include WiiControl.h
#include WiiRemote.h

// CWiiRemote

IMPLEMENT_DYNAMIC(CWiiRemote, CWnd)

CWiiRemote::CWiiRemote()
{

}

CWiiRemote::~CWiiRemote()
{
}

BEGIN_MESSAGE_MAP(CWiiRemote, CWnd)
END_MESSAGE_MAP()

// CWiiRemote メッセージ ハンドラ

int CWiiRemote::WiiRemoteInit(void)
{
GUID device_id;

HidD_GetHidGuid(&device_id);

return 0;
}

****************************************************************
この状態でコンパイルを行ったところ

1>WiiRemote.obj : error LNK2001: 外部シンボル "void __stdcall HidD_GetHidGuid
(struct _GUID *) (?HidD_GetHidGuid@@YGXPAU_GUID@@@Z) は未解決です。
1>C:\WiiControl\Debug\WiiControl.exe : fatal error LNK1120: 外部参照 1 が未解決
です。
1>ビルドログは file://c:\iiControl\WiiControl\Debug\BuildLog.htm に保存されま
した。

とのエラーが発生しました。

現在、以下の作業・設定は完了しています。
1.WDKのダウンロード・インストール
2.VCの「ツール」→「オプション」→「プロジェクトおよびソリューション」
→「VC++ディレクトリ」内のインクルードファイル・ライブラリファイル
にWDKのパスを追加

エラーを取るにはどうすればよろしいのでしょうか?
ご教授御願い致します。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

リンカの追加の依存ファイルに ***.lib を追加するとか必要はないでしょうか?


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

リンク先を見る限りsetupapi.libとhid.libの
ライブラリリンクが必要なようですね。

setupapi.libはPlatformSDKにあるけど
hid.libはDDKのライブラリのようですね。


返信引用
2tom
 2tom
(@2tom)
ゲスト
結合: 16年前
投稿: 7
Topic starter  

>Blue様・subaru様
有り難う御座います。
「プロジェクト」→「WiiControlのプロパティ」→「構成プロパティ」→「リンカ」
→「入力」→「追加の依存ファイル」
内にhid.libとsetupapi.libを追加しましたが、変化なしでした。

また、
#include stdafx.h

の前に
# pragma comment(lib, setupapi.lib)
# pragma comment(lib, hid.lib)

も追加してみましたが、エラー発生は変わりませんでした。


返信引用
2tom
 2tom
(@2tom)
ゲスト
結合: 16年前
投稿: 7
Topic starter  

また、自己レスです。すいません。

#include stdafx.h
#include <hidsdi.h>
#include <setupapi.h>
#include WiiControl.h
#include WiiRemote.h

#include stdafx.h
#include <setupapi.h>

extern C {
#include hidsdi.h
}

#include WiiControl.h
#include WiiRemote.h

のように変更したらコンパイルは通りました。

有り難う御座いました。

引き続き、Wiiコントローラのセンサ値取得を行っていきます。

追加質問ですが、
>まず、XBox360コントローラをPCに接続し、DirectInputを使用して
>スティックや、ボタンの状態を取得することはできました。
>(ハットスイッチのみ取得できません。(^_^;))
ハットスイッチの値はDirectInputでは取得できないのでしょうか?

void CDirectInput::KeyCheck(void)
{
DIJOYSTATE2 dijs;
HRESULT hr;

if (g_pDIDev) {
hr = g_pDIDev->Poll();
if (FAILED(hr))
{
g_pDIDev->Acquire();
}

hr = g_pDIDev->GetDeviceState(sizeof(DIJOYSTATE2), &dijs);
if (SUCCEEDED(hr))
{
SendMessage(g_hWnd,WM_JOYSTIC_OK,(WPARAM)&dijs,0);
} else if (hr==DIERR_INPUTLOST) {
g_pDIDev->Acquire();
}
}
}

上記の様に作成し、GetDeviceState()でXboxコントローラの値を取得したところ
ハットスイッチ(POV)のみ取得できませんでした。
dijs.rgdwPOVの値が「4294967295」と不定になっているようです。
ハットスイッチはその他のスイッチ・ボタンを取得方法が
違うのでしょうか?

宜しく御願い致します。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

Xbox コントローラ向けには XInput という新しい API があります。
Xbox コントローラ専用と言うわけではなく、Microsoft は DirectInput を XInput に置
き換えていくつもりのようで、Xbox コントローラはその対応第一弾ということかと思い
ますが。

で、Wikipedia
http://ja.wikipedia.org/wiki/DirectInput
によると、

> Xbox 360用コントローラーとマイクロソフトのデフォルトのドライバでDirectInputを
使う場合、XInputと比較して以下の制約がある。
> 左右のトリガーは単一のデジタルな方向として動作し、独立したアナログの軸としては
動作しない。

というのがありますが、これでしょうか?


返信引用
ISLe
 ISLe
(@ISLe)
ゲスト
結合: 18年前
投稿: 38
 

Xbox360コントローラーの純正ドライバはハットスイッチをサポートしていない(割り当
てられていない)のでは?

トリガの話は、純正ドライバでは左右のトリガが同じスライダの+方向と-方向とに割り
当てられるため左右同時押しが認識できないということです。レースゲームなんかでは
けっこう致命的ですね。


返信引用
ISLe
 ISLe
(@ISLe)
ゲスト
結合: 18年前
投稿: 38
 

ごめんなさい。
DirectInputでXbox360コントローラー(+純正ドライバ)の十字キーはPOVであってまし
た。

> dijs.rgdwPOVの値が「4294967295」と不定になっているようです。

16進で0xFFFFFFFFですから、十字キーが押されて無い状態の正常値にも見えます。


返信引用
2tom
 2tom
(@2tom)
ゲスト
結合: 16年前
投稿: 7
Topic starter  

aetos様・ISLe様有り難う御座います。

十字キーの上を押下した状態で「GetDeviceState()」を行っても
dijs.rgdwPOVの値は全て「4294967295」となっています。

十字キーを使用するときはEnumObjects関数や、EnumDevices関数などで
「十字キーを使用する」といった設定が必要なのでしょうか?


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました