この記事は、スマブラ Advent Calendar 2024 5日目の記事です。
普段スマブラ全くやってない人間なので初めましての方が多いかと思います。
基本的にはポケモンのアドベントカレンダーに寄稿しているのですが、今回はどちらかといえばスマブラ寄りの内容になりそうだったので、こちらに寄稿させて頂きました。
執筆中に作業データ吹き飛んだので遅刻してます!!!!!!
ごめんなさい!!!!!!!!!!
はじめに
コントローラー基板「FireBird」を開発するにあたっての零れ話的なやつです。
2023年の初頭から開発に着手し、今までの間にそれなりの知見を蓄積できたので、その辺りを雑に書き出していこうと思います。
Arduinoとかで遊んだことのない人からすると分かりづらい所は色々あると思います。悪しからず。
まずお前何ができるんだよ
他のブログ記事見てください
プログラムはアセンブリ(ARM,x86)、C/C++、C#が辛うじて書けます。
回路設計はマイコンを使ったデジタル回路ならギリギリ何とかできる、といったレベルです。
その他、ポケモン過去作の乱数調整や任意コード実行の解析をしていました。
blog.bzl-web.com
blog.bzl-web.com
スマブラ...?わからん...
コントローラー基板に興味を持ったきっかけ
2年くらい前にPhobやProGCCといったコントローラーが登場し、「低遅延で様々な機能を持った高性能コントローラー」としてスマブラ界隈で猛威を振るっている...という話を聞きました。
私はスマブラどころか普通のゲームすら殆ど遊んでいませんでしたし、純正コントローラーで満足していたので登場初期はあんまり興味がありませんでした。
その後、ネットサーフィン中に偶然以下の動画を見つけました。
www.youtube.com
1000円未満で買える汎用マイコンボードで作ったコントローラーが2万円のアケコンをボコボコにする...という後者を買った人からしたら堪ったものではない内容でした。
(実際はポーリングレートの差でこうなってしまっているだけで、適切な設定にすれば2万の方が強いとかそうでもないとか)
...まあ内容の正確性はさておいて、汎用マイコンでここまでできるなら自分でも何か面白いものが作れるかも?という興味を抱くには十分でした。
取り敢えず作る
話は変わりますが、ポケモン界隈ではArduinoや中華マイコンをコントローラーとして認識させ、アイテム集めなどの単純な作業を自動化する...という手法が割とよく使われたり使われなかったりします。
見た目こそ違いますが、過去に自分が作った中華マイコンボードも広義の「ゲームコントローラー」ではあると思います。
これをベースにより性能の高いマイコンに変えて既製品のコントローラー基板に形状を合わせるだけで、ソフト部分はほぼ流用できそうだと思いました。
その内なんか作れる可能性があります pic.twitter.com/zgYdS4F2y2
— ぼんじり (@_3z8) 2023年4月1日
▲取り敢えず形状を合わせただけのやつ
有線Proコン互換基板として開発を進めていたFireBirdですが、最低限の準備が整ったので本日20:00-22:00辺りにBoothにて公開できそうです
— ぼんじり (@_3z8) 2023年7月16日
正直売り切れるようなものとは思ってませんが、どうなるか分からないので本当に欲しいと思ってる方はショップ通知入れといてくださいhttps://t.co/6YQ78K8gv9 pic.twitter.com/kyxVREhLju
▲なんかできた
v1.0の開発に関しては本当に何も考えずマイコンボード作っただけです。
USB-FSなのでそこまでシビアな回路でもないですし、今見ると結構雑な所は多いなと思います。
折角だしやれることは全部やりたい
v1.0の時点で「低遅延プロコン」としての要件を満たしてはいたため、人によっては十分と感じる人もいたかもしれませんが、正直言って純正プロコンと比べると色々なものが足りません。
無線機能は弊害も多いので一旦保留するとして、有線の純正プロコンで使えるものは全部使えるようにしたいものです。
というか今のバージョンに至るまでにそれらは全て対応したのですが、いちいち細かく纏めていられないのでざっくり書いていきます。
ジャイロセンサー
真っ先に手を付けたのはこれです。
純正プロコンで使われているジャイロセンサーが汎用品であると知り、v1.1の基板で試験的に導入しました。
その後のFWアップデートで感度調整などを何度か挟みましたが、現行FWではほぼ純正と同じ感度で使用できると思います。
HD振動
v1.0時点でHD振動用のモーターも一応動く構造にしましたが、流石にいきなりHD振動の再現まではできませんでした。
対応はv2.0以降になってしまいましたが、大体以下の資料を参考にフルスクラッチで実装した気がします。
github.com
tech.alpsalpine.com
これを実装する前にもHD振動を謳う中華コンなどはありましたが、どれも再現度はかなり低かったと思います。
実はProGCC制作者からもこれに関して質問されたことがあり、ProGCCv3.2の振動制御回路はFireBirdv2.0以降とほぼ同じ構成になっていたりします。
ソフト側の制御もほぼ同じようなことをしているようです。
純正ボタンボードとの互換性
初期のFireBirdは純正ボタンボードとの互換性とか微塵も考えずに各ボタンにつきピンを1つ割り当てる方式で入力を読み取っていました。
まあ処理的にはそっちの方が簡素ですし、それだけで使う分には何も問題はないのですが、やっぱり純正品との互換性がないというのは少し気になる所ではありました。
純正プロコンのボタン入力にはキーボードの回路とかでよく使われるマトリクス回路というものが使用されています。
これがどういったものなのかはURL先の記事を参照して頂くと分かりやすいかと思います。
紹介されているのはダイオードの数を省いた簡易回路なので、実際の基板では若干構成が異なりますが、動作原理は変わりません。
FireBirdではv2.0以降の基板で対応しています。
v2.3以降の基板ではここから回路を拡張し、8個のGPIOで元々存在する16個のボタン入力に加えて追加のボタン4個が読み取れるようにしています。
www.elec-hobbyist.com
ハードワイヤリング
あんまりいらないかな、と思って対応をv1.2まで先送りにしていた機能です。(TP置くだけなので機能ですらないが)
USB端子の接触不良による接続切れ報告が出てきたので追加しました。
取り回しがどうしても悪くなってしまうので、スマブラで滅茶苦茶レバガチャする人以外はあんまりいらない気もします。
ProGCCv3.1でハードワイヤリング用のピンが消えてv3.2で即復活しているのを見ると色々あったんだろうな...と思わされます。
RETRO-Cケーブル
ProGCCv3で実装されていた機能ですが、折角なので対応させました。
元ネタ同様にNES/SFC/N64/GCの4種類のプロトコルに個別対応しています。
また、各ハードの信号を認識して通信モードを自動で切り替える機能を独自に実装しています。
ボタンLED
絶対いらないだろ、と思っていましたが要望が多かったので対応させました。
製造コストも不良率も跳ね上がるので作る側としては何もいいことがありません。
そもそもゲーミングデバイス光らせて何が楽しいんだ?
光るPCとかも大嫌いです。
適当なパーツでPC自作すると大概ピカピカ光りますよね。
なんなんだあれ
しょうもない冗談はさておき、LEDがラバーに干渉したりすることがあるのでボタンLED対応は操作性とのトレードオフとの認識でいます。
FireBirdで使用しているLEDは影響が出ないようにできるだけ薄いものを使用していますが、在庫は安定しないし高いしで中々辛い所です。
LEDもクリック化も使用しない場合、メイン基板だけ買ってボタン基板は純正品を流用するのが一番賢いと思います。
マウスクリック・タクトスイッチ化
v2.0以降の基板ではマウススイッチ、v2.3以降の基板ではタクトスイッチのフットプリントに対応しています。
マウスクリック化の方をやっている人が多い印象ですが、タクトスイッチ化も何だかんだ遊びやすくておすすめです。
SKRRAAE010という薄型のタクトスイッチに合わせてフットプリントを作っているので、気になった人は挑戦してみると良いと思います。
プラグとかは特に用意していないのでその辺は自分で合わせてください。
ホールセンサースティックについて語りたい
この手のコントローラーの目玉機能であるホールセンサースティックですが、メーカーによって品質にかなりのバラつきがあるのでここら辺でざっくり纏めておこうと思います。
アルプス製のスティックは本来可変抵抗タイプしかありませんが、一応ホールセンサー化することは可能なので書いておきます。
アルプス製
純正プロコンとかで使われているスティックです。
感触は純正とほぼ同一で、耐久性もそこそこあります。
初期のFireBirdで使用していましたが、修理で受け取った個体の軸はどれも比較的安定しています。
Phobコンと同じ要領でホールセンサー化することが可能ですが、手間が大きいのとGinfull製の方が耐久性は上という都合上今は使用していません。
Gulikit製
一般販売はされておらず、メーカーに直接問い合わせて頑張って購入しました。
見た目のそれっぽさに感動した記憶があります。
但し、スティック自体の耐久性に関してはお世辞にも良いとは言えないクオリティです。
修理で受け取った個体は大体軸がガタガタです。
スティックの寿命が短すぎて純正プロコンより早く故障してしまう傾向にあります。
TMRスティックというものも出ていたので既に検証していますが、肝心の部分は特に改善されていないようです。
センサー部分に関しては割とマシな方ではありますが、ニコイチして使うほどではないと思います。
K-Silver製
Gulikit製のスティックボックスはこちらのOEMだったりします。
耐久性はGulikit製同様にあまり高くありません。
センサーは少し前までは良かったのですが、サイレントアップデートでちょっと使いづらくなってしまいました。
Ginfull製
スティックボックスの耐久性に関してはこちらがダントツで一番高いです。
感触はアルプス製より少し柔らかいかな?と感じるくらいです。
ニュートラル付近でグリグリ動かす時の感触はちょっと違う気もしますが、慣れでどうにかなるレベルだと思います。
耐久性が高い分操作性も殆ど変化しないので、使い込んで緩くなった他メーカー製スティックと比べると硬く感じるかもしれません。
センサーは時期によって良かったり使い物にならなかったりします。
途中のバージョンでセンサーにコンデンサが埋め込まれてスマブラのダッシュが出なくなったりしたこともありました。
今のバージョンでもコンデンサが入っていますが、その頃と比べると調整されている気がします。
それでも操作への影響は十分考えられますが、最近FW側でコンデンサのフィルタを解除することができたのでその内何とかなると思います。
開発時気を付けた点とか
スティック関連のフィルタ処理
まず例として跳ね戻りフィルタを挙げますが、GCコンの改造でスティックにコンデンサを挟んで跳ね戻りを抑制する、といった手法がここでは有名かと思います。
これはスティックの操作をRCフィルタという回路で鈍らせることによって急激なスティック移動を抑制するといった仕組みで行われます。
跳ね戻りが消えるだけなら良いのですが、波形のレベルで見ると通常の弾き入力といったユーザーの意図した操作にまで影響が及んでしまいます。
調整次第で体感できない程度にすることは可能だと思いますが、人によってはどうしても違和感を覚える原因となる場合があります。
FireBirdのFWでは跳ね戻りフィルタやジッター抑制フィルタ、追加予定のものだと感度カーブやRCフィルタといったスティックの操作に補正を掛ける処理がいくつか実行されています。
スティックの入力値の取得・パケットへの反映は約1.1khzで行われ、各種フィルタ処理は全てその速度でリアルタイムに反映できるようにチューニングしています。
その為、これらの処理が原因でスティックの操作に遅延が生じるといったことはありません。
跳ね戻りフィルタは急激な移動のみをカットする仕様なので、感度を上げすぎると入力抜けのような症状が発生する場合がありますが、それ以外に遅延は起こり得ません。
CPUリソース管理
HD振動、認証処理、RETRO-C接続の検出やスティックの座標計算など、初期と比べて色々と面倒な処理が増えたので、相応にCPUの計算量も増加しています。
それでもスレッド管理や涙ぐましい最適化等でなんとか時間内に処理できる形にできています。
電源
よく分からない中華レギュレータでも別にいいんですが、詰めておくに越したことはない部分だと思います。
特に振動を駆動する場合はノイズや電力消費量も増えるので、電源が弱いと何かしらの誤作動を起こす可能性も否定できません。
FireBirdではTexas Instrumentsのリニアレギュレータを使用して3.3V電源を生成しています。
最低負荷時は3.29V、最高負荷時は3.27Vで電圧値はかなり安定している方だと思います。
LED
あまりLEDは好きではないですが、どうせやるなら綺麗に見せられるようにしようと工夫した点はあります。
フルカラーLEDの仕様上、クリアパーツに光を透かした際に分光してしまい、色が綺麗に混ざらないことがあります。
対策として、複数のLEDを向かい合わせるように向きを変えて配置し、LEDの各色がまばらになるようにしました。
▲左:未対策 右:対策後
今後の予定とか
v2.0へのアップデート後は致命的な不具合も特に見つからずに一年近くが経過しているため、今後はFW更新で機能を調整していく感じになると思います。
基本的な機能は全てv2.0で完成しており、それ以降のv2.4までの更新は基本的に普通に使うならまず影響のないようなものです。
v2.4から更に変更したい点も特にないので、暫くはこのバージョンで安定するかと思います。
記事執筆時点で作成予定の機能は以下の通りで、☆付きは着手中、★付きはほぼ完成しているものです。
これらの機能はv2.0以降の基板であればまず問題なく使用できます。
★感度カーブ機能
★スケーリング形状変更
★RCフィルタの適用/解除
☆コントローラー単体での設定変更
☆XInputでの設定変更
・GCコン接続タップ経由での設定変更
・ジャイロ感度変更
・キーボード/マウスとしての認識
・トーナメントモードの詳細設定
・連射(Swtichでは使用不能にしたい)
追加した機能(というほどでもない)の検証完了
— ぼんじり (@_3z8) 2024年7月19日
LR基板はまだ来てないけどあっちは形状の修正だけ pic.twitter.com/bymYkicsOp
▲写真はv2.3時点のもの、v1.0と比較すると結構色々変わったと思う
— ぼんじり (@_3z8) 2024年5月12日
▲デザインをそれっぽく刷新したり多言語対応したり頑張った
さいごに
仕事の合間にチマチマやってたというのもあって何だかんだ開発に2年くらい掛かってて色々とマズい。
さっさと作るもん作りきって安定させたら他の作業を優先させたいです。
特に書かんでええかと思ったけど流石にアレなのでショップページ貼っておきます。
プロコン分解できる人はどうぞ
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
booth.pm