ゲームで使うコントローラーを自作しました。コントローラーのコアになる部分は、Raspberry Pi Pico を利用しました。
Raspberry Pi Pico に GP2040-CE という Firmware を書き込むことで、ゲームコントローラーとして利用することができるようになります。
「GP2040-CE」は「GP2040」の実質的な後継にあたる Gamepad の Firmware です。ちなみに CE は Community Edition の略で、主に OpenStickCommunity のメンバーのことみたいです。
Firmware の書き込み
GP2040-CE Releases から最新の(ビルドの通っている)Firmware をダウンロードして、Raspberry Pi Pico に書き込みます。
- GP2040-CE_x.x.x_Pico.uf2
通常であれば、Raspberry Pi Pico のプログラムを編集する Python IDE として「Thonny」をインストールすることになるのですが、GP2040-CE を使うことだけが目的であれば、Thonny のインストールは不要です。
Raspberry Pi Pico の基盤上の白いボタン (BOOTSEL) を押しながら、micro-USB 端子を接続します。すると、私の環境では OS が F ドライブ(RPI-RP2)として認識しました。ここに直接、Firmware ファイルをドラッグ&ドロップして書き込むだけです。
自動的に F ドライブとして認識していた Raspberry Pi Pico のウィンドウが閉じられて、今度はコントローラーとして認識するようになります。Windows の設定を開いて「Bluetooth とデバイス」から「デバイス」を選択、「その他のデバイス」に「XBOX 360 Controller for Windows」として認識していました。(後述の Web config で認識されるデバイスの種類は変わると思います)
動作確認
正しくプログラムが機能しているかどうかを検証します。まず、Raspberry Pi Pico はデータシートとして「Pinout」が公開されています。
基本的に、黒、赤 、ピンクのピンは、そのままの形で利用するのが普通です。これらのピンの位置は重要です。
- 黒: GND
- 赤: VBUS, VSYS, 3V3(OUT)
- ピンク: 3V3_EN, RUN
赤とピンクのピンは、(GP2040-CE の範囲だと)触らないくらいの認識でよいと思います。黒の GND は重要です。各ボタンの pin は、GND と両端を繋ぐことで ON の状態になります。
GP2040-CE の pinout は、以下のようになっているはずです。(上述の GND などの位置はもちろん同じです)
Windows の設定を開いて、「Bluetooth とデバイス」から「デバイス」を選択し「その他のデバイス」の関連設定から「その他のデバイスとプリンターの設定」を開きます。
古い Windows のコントロールパネルが開きますので、コントローラーのデバイスを右クリックして「ゲームコントローラーの設定」を選択し、どの pin がコントローラーのどのボタン(↑↓→←)なのかを確認して、動作を検証します。
個人的には、古式ゆかしい「JoyToKey」もボタン確認するうえで便利です。
このあとにボタンの pinout を確認しておくことはとても大事になります。後述の Web Config を表示することもできないし、基盤をはんだ付けすると物理的に不可逆なダメージになります。必ず、どのように動作するのかは(Web Config で Setting を更新後も)期待どおりに動作していることを確認しておくこと。(後述の SOCD の動作もチェックする)
例外:pinout が異なるケース
おま環(お前の環境でだけ起こっていたこと)かもしれませんが、「GP2040-CE_0.7.0_Pico.uf2」の Firmware を書き込んだところ、直後の pinout が異なっており、GP2040 で採用のあった(らしい)pinout でした。
なぜなんだろうと確認する前に、「GP2040-CE_0.7.1_Pico.uf2」の Firmware が公開されたので更新すると pinout は公開されているものに戻っていました。
2024/01/22 追記:気が付いたのですが、もしかすると間違って pico fighting board 用の Firmware をインストールしたのかもしれないです。Firmware が違うと pinout が異なるので注意が必要!
Web Config
GND と GP17 を結べばいいです。GND はどこでもいいので、隣の GND でもいい。
GP2040-CE(および GP2040)は、Raspberry Pi Pico を PC 接続する際に、「START (S2) ボタン」を押しながら Micro-USB 接続することで、「Remote NDIS based Internet Sharing Device」として認識します。(このときは、コントローラーとして機能しません)
Web ブラウザーからアドレス「http://192.168.7.1」にアクセスすることで端末の設定ができる Web Config を起動することができます。
ここの「SOCD Cleaning Mode」の設定は、プレイするゲームに応じて設定をすることが推奨されると思います。設定を変更して「Save」を選択します。
- Up priority(↑↓の同時場合は↑を優先:←→ Neutral)
- Neutral(↑↓の同時入力、または、←→の同時入力のとき、入力 OFF)
- Last Win(後に入力したキーを優先する:左右上下)
- First Win(先に入力したキーを優先する:左右上下)
- OFF(機能をつかわない)
SOCD クリーナーとは?
まず、SOCDとは、Simultaneous Opposing Cardinal directions の略称です。
同時発生的な (Simultaneous)+対立する/反対方向 (Opposing) +Cardinal Directions という感じで、cardinal directions はよく東西南北のことを指しますが、ここでは「↑↓←→」のことなので、こんな感じでどうでしょうか。
- 「同時に入力される反対方向の↑↓←→」のクリーナー
なんで、↑↓の組が同時に入力されたら、クリーナーが入力を除去してしまおう、という機能のことです。
細かく言うと、完全な同時入力ではなくて、意図して2つの組のボタンをズラして押下することで、ゲームの中で有利な入力とするケースがあります。一部のゲームではルールとして、こうした同時入力は、どのような振る舞いをする必要があるのか定められていることがあります。(後述の SF6 など)
この機能に GP2040-CE は対応しているので、SOCD クリーナーの機能をつかってルールに合わせてあげる必要があります。
Street Fighter 6 の入力規則
Street Fighter 6 では、トーナメント参加に際してコントローラーの規則を設定しています。
トーナメントに参加しないならいいじゃないか、というのもありそうですが、基本的にはこういうルールで遊ぼうという考え方をしていたほうが、健全だと思います。
たしかに、この CPT(CAPCOM Pro Tour)精神は、プロツアーに適用されるものですが、公平性を担保する目的で制定されているので、ゲームを普通にプレイする際も、不公平な有利/不利があるのは好ましい状態ではありません。(いわゆる広義/SNSで言われるような意味でのチート行為として、嫌われてしまいます)
Street Fighter シリーズでは、Street Fighter 5 のころから、コントローラー規則が(いわゆる自作コントローラー/レバーレスコントローラーに向けて)制定されています。歴史的に色々あって、レバーレスコントローラーの普及がはじまったことで、まず、左右の同時入力があった際の 2nd Priority(後入力優先)が明確に禁止されました。(ガフロ問題など)
2nd Priority の一例として、左右の溜め技(例:ガイルのソニックブーム)があります。ガード方向のボタンは入れっぱなしのままにして、技を出すときだけ、逆方向+攻撃ボタンを押下して溜め技を成立させることが可能になります。(ガード方向のボタンはずっと離さないので)フレーム的に無駄のない=ニュートラルの状態を挟まないからガードのミスが無い、溜め技の回転が最大になるなど、理想的な技の成立を可能としたため、批判がありました。
Street Fighter 5 は、最後まで↑↓の 2nd Priority が残っていました。しかし、これが Street Fighter 6 で NG になりました。
2nd Priority の一例として、上下の溜め技(例:ガイルのサマーソルト)があります。↓方向に入れっぱなしのまま、↑+攻撃ボタンを押下して溜め技を成立させることが可能になります。ソニックブームのように技の回転(連続して使うこと)は(大体のケースで)重要にならないのですが、フレーム的に無駄のない=ニュートラルを挟まない入力になったことで、キャラクターは確実にしゃがみ状態のまま、サマーソルトのような無敵技を使うことができるようになりました。(つまり、しゃがみ状態でギリギリまで溜めフレームを稼げたり、間違いなく直撃させるため、引きつけることが可能になっていた)レバーだと、レバーを↓入力の位置から↑入力の位置に持ち上げる過程でニュートラルを誤って経由する(入力が遅い)と、一瞬(数フレーム)だけ立ちモーションを経由するため、やられ判定が大きくなる恐れがあった。例を挙げると、ユリアンのエイジスリフレクターの上設置も、立ちを経由しない=しゃがみ状態で出せる無敵を持つ必殺技が対策として重要だった。
このように、すくなくとも Street Fighter というタイトルにおいては、コントローラーの入力規則はかなりセンシティブな問題です。自作コントローラーを利用する際は、利用上のマナーを把握したうえで活用するようにしないと、意図せずにチーターになる恐れがあります。ゲームのコミュニティに嫌われる十分な理由になるので気を付けよう。
この次は?
TODO です。
キーを増設する予定があるので、対応したら詳細を書き足します。