![見出し画像](https://assets.st-note.com/production/uploads/images/118604997/rectangle_large_type_2_9bcc8d0a958a756f1bf88b64d1130d7d.jpg?width=1200)
PS2/USB両対応ゲームパッド基板(CY-3103)で音ゲー用コントローラーを作る
当noteではPC(コナステ)で使用できる音ゲーコントローラーの制作ばかりしてきたが、「CS版でも使いたい!」という要望もある
そんなある日、AliExpressでPS2/USB両対応のゲームパッド基板を見つけたので、音ゲーコントローラーの制作に使えないかと思い購入してみた
届いたものはこちら
![](https://assets.st-note.com/production/uploads/images/118600796/picture_pc_f2f91ef3c13fdbbcf4be0d39ca40d2e9.jpg?width=1200)
当たり前だがPCに繋いでもPS2に繋いでも反応する。各端子の対応は下の写真の通り
![](https://assets.st-note.com/img/1697003269782-q1b7vXGU4d.jpg?width=1200)
モード切替ボタンはPS2接続時にアナログ、デジタルを切り替える、USB接続には数秒短絡することで、PS3/PCコントローラー、Androidコントローラー、Xboxコントローラーとモードが切り替わる
1,ポップン用コントローラーとして使う
最も簡単なのはポップンコントローラーだ。ボタン押下の入力しかなく、ターンテーブルなどの独特の機構も無い
PS2で使う方法は3つある。公式のポップンコントローラーとして認識させるか、キーコンフィグで対応するか、CS版のボタン配置に合わせて配線するかだ
![](https://assets.st-note.com/production/uploads/images/118605135/picture_pc_cc27b2c58726d5d4764424c896ecd0a0.png?width=1200)
しかし、キーコンフィグやボタンに合わせた配線をすると、プレイ中は問題無いが選曲画面等で問題が起こる。というのも、たとえばポップンコントローラーでは青ボタンで選曲、赤ボタンで決定だが、通常のコントローラーは方向キーで選曲、○ボタンで決定のため、上記の図だと左緑と赤で選曲、右緑で決定というおかしなキー配置になる
ACポップンの操作に慣れている人には厳しいものがあり、やはり選曲中もプレイ中も同じ操作ができる、公式コンとして認識させる方法が一番だ
公式コンとして認識させる条件は、方向キーの←↓→を同時に推し続けるというもの。確かに通常のコントローラーではありえない操作だ
対応の端子をはんだ付けし、常に入力の状態にする
![](https://assets.st-note.com/production/uploads/images/118605623/picture_pc_d69b0b2642b6a3dd6a4174115a1e2059.jpg?width=1200)
これでCSポップンには公式コンとして認識される。その上でのボタン配置は以下
![](https://assets.st-note.com/production/uploads/images/118600861/picture_pc_6340a3b81d34a7b36271a0a85fa1ff07.png?width=1200)
これに合わせて配線していく。ポップンコントローラーを作る記事はこのnoteでも2つあるので、Arduino基板を当基板に変更するだけでいい
同梱の端子はそのままハメるとがっちりハマって抜けにくいため、マイナスドライバーなどで返しを少し潰しておくと外しやすい
![](https://assets.st-note.com/production/uploads/images/118600798/picture_pc_999dd6868ea9191a9040296adab25bd9.jpg?width=1200)
はんだが使えないなら←↓→は以下のように短絡してもいい
![](https://assets.st-note.com/production/uploads/images/118600801/picture_pc_5b05c5c3ea84fe6b0c239abf6d029d7b.jpg?width=1200)
そして完成
ビートポップンコントローラーのPS2対応テスト pic.twitter.com/vBJ9ydzXMp
— Enter🏳️🌈 (@eraBEMANI_sfw) October 2, 2023
JoyToKey前提にはなるけどPS2/USB両対応基板でCSとLivelyシームレスに両対応できた ポプコンとして認識させるために常に←↓→入力しなくちゃいけないのと、右黄色が↑という点がネックでゲームパッドとして機能させるのは難しかった pic.twitter.com/sfCMnslNxb
— Enter🏳️🌈 (@eraBEMANI_sfw) October 2, 2023
←↓→を常に入力の状態にしているため、PC上で使用するにはモード切り替え端子でアナログモードにするか、、もしくはXboxコントローラーモードにする必要がある。XboxコントローラーモードではJoyToKey必須
2,beatmaniaIIDX用コントローラーとして使う
Arduinoではロータリーエンコーダーの入力をデジタル入力に変換して制作することができたが、既製品の基板ではそれができない。どうしたものかと悩んでいると、専コン制作でお世話になっているフォロワーから助言を頂いた
むかし作ったボルテコントローラー(ロータリーエンコーダー式)でそれ自作してました✌
— かんだい@オープン (@kandaiiidx_open) October 3, 2023
相手方は市販のUSBゲームコントローラーでしたが、今回はプレステ専コンに置き換えればいけそうですね。
マイコン材料費は100円くらいです pic.twitter.com/f2rHQTwKDs
ざっくり進め方は以下。
— かんだい@オープン (@kandaiiidx_open) October 3, 2023
①ATtiny13とブレッドボードを買う
②AVR開発環境をインストールする
③ソースを書いてコンパイルする
④ArduinoをAVR-isp化する
⑤④を使って③を書き込む
②④がちょっと面倒ですね。私は④については専用のArduinoを用意してます。
SNSって本当にすごい(小並感)。早速部品を購入し、試してみることにした。以下購入したもの
・ATtiny13a
・書き込み用のArduino UNO互換機
Pro MicroでもかAVRライターに出来る気がしたけどUNOは持ってなかったのでこれを機に1台購入
マイコンへの書き込み方は以下の記事を参考。非の打ち所がない分かりやすさ
![](https://assets.st-note.com/production/uploads/images/118600804/picture_pc_264133e7a08af4c1c9ba415539c84ec2.jpg?width=1200)
以下はかんだい氏から頂いた、ロータリーエンコーダーをデジタル出力するためのスケッチ。情報提供、ソースコード提供に感謝
/*
* 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;
}
}
過去に作った回路は、多分こうでした。
— かんだい@オープン (@kandaiiidx_open) October 5, 2023
ソース上でPB0/1をハイインピーダンスにしてるのが原因?PB=0b00011011;の右端の11を00にすると動く…かな…?
マイコン発掘したので、こっちでも確認してみます。
それと、CntThも10000は大きすぎると思うので小さくてもいいかも。 pic.twitter.com/CG114wC4wt
無事に出力を変換してLチカも上手くいったが、ここで問題が起こった。Arduino上では問題無く動くはずなのに、今回使用するゲームパッド基板では上手く動かないのだ
前者はArduinoからVCCとGNDを取った状況で、問題無く光ります。後者はゲームパッド基盤で、5V,GNDと明記された端子から取った状態では問題無く光りますが、ボタン端子のGNDに変えると光らなくなってしまいます pic.twitter.com/vC5avp9Vem
— Enter🏳️🌈 (@eraBEMANI_sfw) October 6, 2023
様々な推測や調査が行われたが、結局解決せず今に至る(ボタン端子のGND電圧が低すぎるせい?)。また気が向いて再開したときに解決したら加筆します
![](https://assets.st-note.com/production/uploads/images/118600806/picture_pc_77db5dd877a499854f6cb80f6f162acf.jpg?width=1200)