他のアカウント

プロフィール

フォトアルバム

ニンジャー

趣味が広く浅いのですが、それらについて適当に書いていこうと思います。まぁ、ブログだから気楽にと言うことで。

2016-01-17

IIDXアケコンのキーボード化

先月からサービス開始しているbeatmania IIDX INFINITASですが、基本的にキーボード対応なので、専コンを使うのには、PS2コントローラのコンバーターとJoyToKeyJoyadapterを組み合わせる必要があります。
これだと、遅延の発生(これは調整でなんとかなります)や判定のブレ(これは私の腕ではあまり実感できていませんが)がある上、オプションを呼び出す時にキーボードが必要だったりとちょっと不便な状態になります。

そこで、既に幾人か先人が専コンのキーボード化に成功していたので、自分も挑戦してみました。

darekasannetのブログ
http://darekasan.net/wordpress/archives/429

こちらのブログを参考に材料を集めて、Arduinoにスケッチを書き込んでみました。
ちなみに私の環境では、リンク先で紹介されているプルアップ抵抗は必須でした。

なお、スケッチはDP環境向けにちょっとアレンジしてみました。


1P側

#include "HID-Project.h"
#include <Psx.h>

#define dataPin 7
#define cmndPin 6
#define attPin 5
#define clockPin 4

#define SLCT KEY_TAB
#define STRT KEY_RETURN

#define SCR1 KEY_LEFT_CTRL
#define SCR2 KEY_LEFT_SHIFT

#define KEY1 'z'
#define KEY2 's'
#define KEY3 'x'
#define KEY4 'd'
#define KEY5 'c'
#define KEY6 'f'
#define KEY7 'v'

Psx Psx;
unsigned int data;

void setup()
{
NKROKeyboard.begin();
Psx.setupPins(dataPin, cmndPin, attPin, clockPin, 1);
}

void loop()
{
data = Psx.read();
if (data & psxSlct)NKROKeyboard.add(SLCT); else NKROKeyboard.remove(SLCT);
if (data & psxStrt)NKROKeyboard.add(STRT); else NKROKeyboard.remove(STRT);
if (data & psxDown)NKROKeyboard.add(SCR1); else NKROKeyboard.remove(SCR1);
if (data & psxUp)NKROKeyboard.add(SCR2); else NKROKeyboard.remove(SCR2);
if (data & psxSqu)NKROKeyboard.add(KEY1); else NKROKeyboard.remove(KEY1);
if (data & psxL1)NKROKeyboard.add(KEY2); else NKROKeyboard.remove(KEY2);
if (data & psxX)NKROKeyboard.add(KEY3); else NKROKeyboard.remove(KEY3);
if (data & psxR1)NKROKeyboard.add(KEY4); else NKROKeyboard.remove(KEY4);
if (data & psxO)NKROKeyboard.add(KEY5); else NKROKeyboard.remove(KEY5);
if (data & psxL2)NKROKeyboard.add(KEY6); else NKROKeyboard.remove(KEY6);
if (data & psxLeft)NKROKeyboard.add(KEY7); else NKROKeyboard.remove(KEY7);

NKROKeyboard.send();
}


2P側

#include "HID-Project.h"
#include <Psx.h>

#define dataPin 7
#define cmndPin 6
#define attPin 5
#define clockPin 4

#define SLCT KEY_BACKSPACE
#define STRT KEY_ESC

#define SCR1 KEY_RIGHT_CTRL
#define SCR2 KEY_RIGHT_SHIFT

#define KEY1 'b'
#define KEY2 'h'
#define KEY3 'n'
#define KEY4 'j'
#define KEY5 'm'
#define KEY6 'k'
#define KEY7 ','

Psx Psx;
unsigned int data;

void setup()
{
NKROKeyboard.begin();
Psx.setupPins(dataPin, cmndPin, attPin, clockPin, 1);
}

void loop()
{
data = Psx.read();
if (data & psxSlct)NKROKeyboard.add(SLCT); else NKROKeyboard.remove(SLCT);
if (data & psxStrt)NKROKeyboard.add(STRT); else NKROKeyboard.remove(STRT);
if (data & psxDown)NKROKeyboard.add(SCR1); else NKROKeyboard.remove(SCR1);
if (data & psxUp)NKROKeyboard.add(SCR2); else NKROKeyboard.remove(SCR2);
if (data & psxSqu)NKROKeyboard.add(KEY1); else NKROKeyboard.remove(KEY1);
if (data & psxL1)NKROKeyboard.add(KEY2); else NKROKeyboard.remove(KEY2);
if (data & psxX)NKROKeyboard.add(KEY3); else NKROKeyboard.remove(KEY3);
if (data & psxR1)NKROKeyboard.add(KEY4); else NKROKeyboard.remove(KEY4);
if (data & psxO)NKROKeyboard.add(KEY5); else NKROKeyboard.remove(KEY5);
if (data & psxL2)NKROKeyboard.add(KEY6); else NKROKeyboard.remove(KEY6);
if (data & psxLeft)NKROKeyboard.add(KEY7); else NKROKeyboard.remove(KEY7);

NKROKeyboard.send();
}


DPで2台使っている人は、これで1P側のセレクトキーでオプション、2P側のセレクトキーでオプション切替え、スタートキーがESCキーの役割を果たすようになるので、キーボードに触れる機会をだいぶ減らせると思います。

また、参考にしたリンク先では、スクラッチの方向に違和感があったので、割り当てを変更しています。お好みでCTRLキーとSHIFTキーを入れ替えて使ってください。

ちなみに、キー割り当ての参考にしたサイトは、以下の通りです。

https://www.arduino.cc/en/Reference/KeyboardModifiers

正直、遅延の軽減や判定ブレ等については実感できていない状態ですが、テンキー以外の機能をコントローラーでまかなえるようになったのが大きいですね。あと、USBコンバータはスリープからの復帰時に無効になっていたので、挿し直す必要があったのですが、これが不要になったのも地味に大きいです。

部品等を安く上げればやる価値があると思いますので、興味がある人は是非どうぞ。

最近のトラックバック

アクセスランキング