見出し画像

PS2/USB両対応ゲームパッド基板(CY-3103)で音ゲー用コントローラーを作る

当noteではPC(コナステ)で使用できる音ゲーコントローラーの制作ばかりしてきたが、「CS版でも使いたい!」という要望もある
そんなある日、AliExpressでPS2/USB両対応のゲームパッド基板を見つけたので、音ゲーコントローラーの制作に使えないかと思い購入してみた

届いたものはこちら

上のケーブルがPS2,下のケーブルがUSB

当たり前だがPCに繋いでもPS2に繋いでも反応する。各端子の対応は下の写真の通り

下の数字はJoyToKeyでのボタン番号

モード切替ボタンはPS2接続時にアナログ、デジタルを切り替える、USB接続には数秒短絡することで、PS3/PCコントローラー、Androidコントローラー、Xboxコントローラーとモードが切り替わる

1,ポップン用コントローラーとして使う

最も簡単なのはポップンコントローラーだ。ボタン押下の入力しかなく、ターンテーブルなどの独特の機構も無い
PS2で使う方法は3つある。公式のポップンコントローラーとして認識させるか、キーコンフィグで対応するか、CS版のボタン配置に合わせて配線するかだ

下はCS版のボタン配置。上はそれの対応番号

しかし、キーコンフィグやボタンに合わせた配線をすると、プレイ中は問題無いが選曲画面等で問題が起こる。というのも、たとえばポップンコントローラーでは青ボタンで選曲、赤ボタンで決定だが、通常のコントローラーは方向キーで選曲、○ボタンで決定のため、上記の図だと左緑と赤で選曲、右緑で決定というおかしなキー配置になる
ACポップンの操作に慣れている人には厳しいものがあり、やはり選曲中もプレイ中も同じ操作ができる、公式コンとして認識させる方法が一番だ

公式コンとして認識させる条件は、方向キーの←↓→を同時に推し続けるというもの。確かに通常のコントローラーではありえない操作だ
対応の端子をはんだ付けし、常に入力の状態にする

裏面の写真

これでCSポップンには公式コンとして認識される。その上でのボタン配置は以下

STARTとSELECTを逆に書いてしまった

これに合わせて配線していく。ポップンコントローラーを作る記事はこの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電圧が低すぎるせい?)。また気が向いて再開したときに解決したら加筆します

IIDXコンのボタン対応表