見出し画像

GCコンの通信とPhobコン、それを支えるRP2040

この記事は、スマブラ Advent Calendar 2023 12月3日の記事です。

こんにちは、ゲーム好きの和菓子(@AT12806379)です。
軽く自己紹介をすると、私は今年初めのDELTA#3にブーススタッフとして行ったのを皮切りに、オフ大会の同期切りの悩みを解決する「ProCon Disconnector」などの物作りやこのnoteのような情報発信でスマ界隈に貢献したいと活動しているリンク・勇者使いです。

さて、皆さんは手元にあるコントローラーがどういう通信をしているのか知っていますか?
今回はGCコンの通信の解説とPhobコンの仕組み,そしてRP2040というチップについて、解説していきたいと思います。
今年の締めともいえるアドベントカレンダー、是非(まだ早いですが)この記事で理解を深めてから年越ししましょう。

まずは端子をチェック

GCコンといえば、まず目につくのは今時珍しい(USBではない)端子でしょう。

この端子を「ニンテンドー ゲームキューブ コントローラ 接続タップ」に繋ぐことでSwitchで使用可能になりますが、この端子の中をよく見てみると…

引用元

ピンが6つあり、(先人達の解析によると)そのうち5ピンはDATA(実際の通信用のピン),5V・3.3V(GCコンの基板・振動モーターへの電源供給ピン),GNDとなっているようです(真ん中下のピンは未使用)。

今回はこのDATAピンで行われている通信を少しだけ解説していきたいと思います。

信号を見てみよう!

これが、実際に通信をキャプチャした画像です。

実際の波形

…何が何やらだと思いますので、もっと細かく解説したいと思います。
コンピューターは、内部的に全ての情報を0/1で管理しています。いわゆるデジタルですね。
そして、その0/1(ビット)をいくつも並べていく(具体的には8bitで1バイトと呼ばれる単位になる)事で、より大きな数字を表現できるようになります。(PCの32bitとか64bitとかってのは一回の演算で扱えるビット数の話)

GCコンの通信はDATAピンの電圧の上下(HIGH/LOW)と、電圧が下がっている時間の長さ(マイクロ秒単位)でビットを表現している通信なのです。
より詳しく知りたい方は、「シリアル通信」で検索すると似たような仕組みが多く引っかかるでしょう。

実際には通信の終わりを示すストップビットもあるが、1と同じなので省略

さて、これを知った後に実際の通信を見直してみると、1バイト単位で何かしら意味のありそうな数値になっていることがわかるでしょうか。
例えば、1000 0000は16進数で80,10進数で128ですね。

画像青線部分

しかし、実際のビット列とボタンの押下状態などがどう結びつくのか疑問が残ると思います。

ボタンは押している/押していないという0/1なので、押した際に変化するビットを特定すれば良いですが、アナログスティック等(GCコンの場合はアナログトリガーも)はどうやって送信しているのか…

これもまた先人達の解析の賜物なのですが、ボタンやスティックはこのような順番で表現されています。
ボタンは先頭2バイト(Byte0,Byte1)に収まっていて、押していれば表にある場所のビットが1に、押していなければ0になります。(例えば、Yボタンを押すと、Byte0が0000 1000になります)
割り当ての無い部分であるByte0の上位3ビットは常に0,Byte1の上位1ビットは常に1です。
そしてスティック等のアナログ値は、8bit(中央128,0~255の範囲)でデジタルに変換されて送信されているのです。

引用元

先程の画像に当てはめるとこうなります。

実際には初期応答など他にも解説すべきところはあるのですが、とりあえず実際のデータに絞って軽く解説をしてみました。
長く使われているコントローラーだけあって、先駆者がほとんど調査し、文書化して残してくれています。

さて、皆さんはこの通信の仕組みが明らかになる事で、どういう事が可能になると思いますか?

例としては、Arduinoといった各種マイコンを介して入力可視化ができるようになるでしょう。GCコンの延長ケーブルを切って、RetroSpyを自作した人も居るのではないでしょうか。

また、接続タップ等を介さずにGCコンを直接読み取り、PCで使えるようにしたり振動させたりも可能でしょう。
実際、Arduino向けに有志が作ったライブラリもあります。

が、この2つよりも私が言いたいのは…
「通信を再現することができれば、例え純正GCコンでなくともGCやSwitchにコントローラーとして認識させられる」
という事実なのです。

私は以前からこれに着目し、GCのゲームを自動化することに取り組んできました。

(自分でライブラリを書いたり、プルリクエスト出したりかなり色々やったなぁ…)

そして昨今、この技術が自動化だけにとどまらず、著名なプロゲーマーの手に渡り注目を浴びるという事態が起きています。
そう、これが昨今のスマブラ界隈に広がる「Phobコン」の仕組みなのです。

Phobコンとは?

Phobコンとは、スティックにホールエフェクトセンサーを採用&跳ね戻りフィルタ等の高機能なファームウェアを搭載する等、GCコンの弱点を解決しているオープンソースのGCコン型基板です。
Phobコンは、GCコンとは全く違うチップを使用しながらも、先程のような通信を模倣することでGCコンとして認識されるようになっています。

このPhobコンには、基板のバージョンがv1だとTeensy4.0というマイコンボードが、v2以降だとRP2040というチップが基板に直接積まれています。
それぞれのチップの紹介と相違点、それぞれがどうやって先の通信を行っているかを軽く紹介させてください。

Teensy4.0

引用元

業界内でも最も性能が高いと言われているマイコンボードで、CPUクロックはなんと600MHz!
ぶっちぎりの高性能でとても優秀なマイコンボードです。(赤がRP2040の定格/オーバークロックで、同様に青がTeensy4.0)

引用元

では欠点が無いじゃないか!と思われるかもしれませんが、それでも問題はいくつかあり…

・入手性が悪かった(安定しなかった)
v1基板がメインストリームだった当時は世界的に半導体不足が深刻化している時期でなかなか(特に日本のショップには)品が並ばなかった

・高価
高性能が故に、当然価格も高価(約4000円)
Phobの製造者側はPhob基板の製造費+このボードを購入する必要があったため負担が大きかった(※v2基板もそれはそれでコストかかってるので諸説あり)

・そもそもここまでの高性能が必要ではない
コンピューターというものは性能と電力消費がトレードオフなのが世の常で、結局Phobもクロックを150~300MHzほどに落として運用していた
(※ただし当時はGCコンの通信模倣にはそれなりのボーレート(通信速度)を設定できるシリアルポートが必要だったものと思われる)

と、このような課題点によりv2からRP2040に交代する事になったのでした。

上にも少し書いた通り、Teensy4.0は持ち前の高速なシリアルポートを、画像のような回路を用いて単線双方向にして実現しています。
シリアル通信の標準的な最高ボーレートといえば115200bpsなのですが、Teensy4.0ではなんと2500000bpsに設定しています(速すぎる…!)。

引用元

そして、この状態でシリアルポートから特定の16進数値を書き込むことで、下記画像の様にGCコンとほぼ一緒の通信波形を実現しているのです。(画像ではN64と書かれていますが、実はN64とGCは波形レベルでは全く同じ通信プロトコルを採用しています)

引用元

とはいえかなり無理やり波形を出力しているので、微妙に波形は合っていません(画像赤部分)
しかし、0.2マイクロ秒ほどの誤差であればゲーム機側は正しく読み取ってくれます。
これが、Teensy4.0(v1基板)の方式です。

RP2040

引用元

RP2040は、2021年に教育用途などで大きな支持を集めるラズベリーパイ財団より発表されたRaspberry pi picoボードで初登場したチップです。
このチップは、先に上げたTeensy4.0の課題を見事に解決しています。

・入手性が良い
発売から今の今まで、品薄だというニュースはほとんど聞きません。
比較的、搭載ボードを入手しやすくコミュニティによるサポートも(巨大なラズベリーパイフォーラムがあり)手厚いです。

・安価
チップ単体が国内で160円で購入できます。
もちろんチップ単体で動くものではない(例えばファームウェアを保存するフラッシュメモリが必要)ので、Phob基板自体をすごく安くできるというわけではありませんが、チップを直接Phob基板に搭載でき製造やサポートの負担を(製造者・ユーザーどちらの視点からも)軽減できます。

・特殊な独自機構でGCコンの通信を模倣できる
RP2040自体はTeensy4.0ほど高性能ではなく、さほど高速なシリアルポートを持ちませんが、後述する独自機構でGCコンの通信波形を生成できます。

(そういえば、RP2040のwikipediaには作品例としてPhobコンが掲載されています。すごい!)

このように今最も勢いのあるRP2040チップですが、独自機構とはいったい何なのかと言うと…

PIO

RP2040は、ハードウェア側でサポートされていない(通常の規格ではない)GCコンのような通信を扱いたいユーザーにうってつけな"Programmable IO"という機構を備えています。
ざっくり言うと、GCコンの通信部分だけを正確に行ってくれるプログラム可能なサブCPUみたいなものです。

サブCPUを動かすためには特殊なアセンブリ(機械語)を書く必要がありますが、その効果は凄まじく…

ぴったり4マイクロ秒の波形

寸分の狂いもない波形を生成することができ、これを用いてRP2040はGC/Switchとの通信を実現しているのです。
やや蛇足な話ですが、PIOのポテンシャルはこれだけではなくUSBの波形や(オーバークロックすれば)HDMI等の映像信号も生成できるほどの性能を出せます。

その他コントローラー

ざっくりとPhobの仕組みについて解説しました。
が、RP2040にはUSB機能も搭載されているため、Phobだけでなく様々な自作コントローラー・アダプターに使用されています。

・FireBird・ProGCC(v3以降)

FireBirdはぼんじりさん、ProGCCはHandHeldLegendが開発したプロコン互換基板です。
Phobと同じくホールエフェクトセンサー,跳ね戻りフィルタ等を搭載しつつ、プロコン特有のジャイロ機能も兼ね備えています。

・GC POCKET ADAPTER+

こちらもHandHeldLegend製のGCコン接続アダプターです。
GCコン接続アダプター側の仕組みについてもいつか書きたいと思っていますが、RP2040なら最大8個のGCコンを読み取れるのでは?と常々考えています。(未検証)

・GP2040

超低遅延なアケコンを自作できるGP2040というプロジェクトも、その名の通りRP2040がターゲットです。
スト6をしているスマ勢は必見かも!
(そういえばスマブラでアケコン使ってる人は知り合いに何人かいますね…)

総括

・GCコンは、マイクロ秒単位で電圧を上下させることで、単線双方向な通信をしている
・PhobコンはTeensyやRP2040でその通信を模倣している
・最近の自作コントローラーには、RP2040が使われていることが多い

始めはGCコンの通信仕様だけ書くはずが、膨らみまくった結果RP2040の紹介まで書いてしまいました。
これからも広がっていくであろうカスタムコントローラー、目が離せません。
拙い記事でしたが、ご覧いただきありがとうございました。

スマブラ Advent Calendar 2023 12月4日の記事は、
ちゃたさんによる「いつか、君とのスマブラを。」です。
題からはどういった内容なのかを推し量ることができませんが、楽しみです。

そして私自身も明日は「Youtube配信の画質を高めるアドバイス」と題した記事を更新予定です、こちらも是非。(別のアドベントカレンダーの宣伝ですみません…!)

それでは、またいつか。

この記事が気に入ったらサポートをしてみませんか?