PS2/USB両対応ゲームパッド基板(CY-3103)で音ゲー用コントローラーを作る
当noteではPC(コナステ)で使用できる音ゲーコントローラーの制作ばかりしてきたが、「CS版でも使いたい!」という要望もある
そんなある日、AliExpressでPS2/USB両対応のゲームパッド基板を見つけたので、音ゲーコントローラーの制作に使えないかと思い購入してみた
届いたものはこちら
当たり前だがPCに繋いでもPS2に繋いでも反応する。各端子の対応は下の写真の通り
モード切替ボタンはPS2接続時にアナログ、デジタルを切り替える、USB接続には数秒短絡することで、PS3/PCコントローラー、Androidコントローラー、Xboxコントローラーとモードが切り替わる
1,ポップン用コントローラーとして使う
最も簡単なのはポップンコントローラーだ。ボタン押下の入力しかなく、ターンテーブルなどの独特の機構も無い
PS2で使う方法は3つある。公式のポップンコントローラーとして認識させるか、キーコンフィグで対応するか、CS版のボタン配置に合わせて配線するかだ
しかし、キーコンフィグやボタンに合わせた配線をすると、プレイ中は問題無いが選曲画面等で問題が起こる。というのも、たとえばポップンコントローラーでは青ボタンで選曲、赤ボタンで決定だが、通常のコントローラーは方向キーで選曲、○ボタンで決定のため、上記の図だと左緑と赤で選曲、右緑で決定というおかしなキー配置になる
ACポップンの操作に慣れている人には厳しいものがあり、やはり選曲中もプレイ中も同じ操作ができる、公式コンとして認識させる方法が一番だ
公式コンとして認識させる条件は、方向キーの←↓→を同時に推し続けるというもの。確かに通常のコントローラーではありえない操作だ
対応の端子をはんだ付けし、常に入力の状態にする
これでCSポップンには公式コンとして認識される。その上でのボタン配置は以下
これに合わせて配線していく。ポップンコントローラーを作る記事はこのnoteでも2つあるので、Arduino基板を当基板に変更するだけでいい
同梱の端子はそのままハメるとがっちりハマって抜けにくいため、マイナスドライバーなどで返しを少し潰しておくと外しやすい
はんだが使えないなら←↓→は以下のように短絡してもいい
そして完成
←↓→を常に入力の状態にしているため、PC上で使用するにはモード切り替え端子でアナログモードにするか、、もしくはXboxコントローラーモードにする必要がある。XboxコントローラーモードではJoyToKey必須
2,beatmaniaIIDX用コントローラーとして使う
Arduinoではロータリーエンコーダーの入力をデジタル入力に変換して制作することができたが、既製品の基板ではそれができない。どうしたものかと悩んでいると、専コン制作でお世話になっているフォロワーから助言を頂いた
SNSって本当にすごい(小並感)。早速部品を購入し、試してみることにした。以下購入したもの
・ATtiny13a
・書き込み用のArduino UNO互換機
Pro MicroでもかAVRライターに出来る気がしたけどUNOは持ってなかったのでこれを機に1台購入
マイコンへの書き込み方は以下の記事を参考。非の打ち所がない分かりやすさ
以下はかんだい氏から頂いた、ロータリーエンコーダーをデジタル出力するためのスケッチ。情報提供、ソースコード提供に感謝
/*
* RotalyEncoder.c
*
* Created: 2023/10/03 22:39:12
* Author : kandai
*/
#define F_CPU 1000000UL
#include <util/delay.h>
#include <avr/io.h>
// PB0,1を入力として使う
// プルアップ抵抗が必要
// PB4,3を出力として使う コントローラに直結
// ハイインピーダンスで、Loのときにボタン押下扱い
int main(void)
{
// 初期化
// ポートB初期設定
DDRB = 0b00011000; // PB4,3を出力に設定 PB1,0を入力に設定
PORTB = 0b00011000; // PB4,3をHi出力に、PB1,0をハイインピーダンス入力に
int upCnt=0;
int dnCnt=0;
int CntTh;
CntTh = 100;
char buf=0;
char buf_=0;
while (1)
{
buf = PINB & 0b00000011;
_delay_ms(1);
// 正転: 00 -> 01 -> 11 -> 10 -> 00
if ((buf==0b00000000 && buf_==0b00000001) ||
(buf==0b00000001 && buf_==0b00000011) ||
(buf==0b00000011 && buf_==0b00000010) ||
(buf==0b00000010 && buf_==0b00000000))
{
// PB4を0に落とす
PORTB = 0b00001011;
upCnt = CntTh;
dnCnt = 0;
}
// 逆転: 00 -> 10 -> 11 -> 01 -> 00
else if((buf==0b00000000 && buf_==0b00000010) ||
(buf==0b00000010 && buf_==0b00000011) ||
(buf==0b00000011 && buf_==0b00000001) ||
(buf==0b00000001 && buf_==0b00000000))
{
// PB3を0に落とす
PORTB = 0b00010011;
dnCnt = CntTh;
upCnt = 0;
}
if (upCnt>0)
{
upCnt --;
}
else if(dnCnt > 0)
{
dnCnt --;
}
// 両方のカウントがゼロになったらボタン出力をHiにする(押していない)
if ((upCnt ==0)&& dnCnt ==0)
{
PORTB = 0b00011011;
}
buf_ = buf;
}
}
無事に出力を変換してLチカも上手くいったが、ここで問題が起こった。Arduino上では問題無く動くはずなのに、今回使用するゲームパッド基板では上手く動かないのだ
様々な推測や調査が行われたが、結局解決せず今に至る(ボタン端子のGND電圧が低すぎるせい?)。また気が向いて再開したときに解決したら加筆します