Nintendo Switch ProコントローラーをRubyでhackしている話

Rubyist近況[1] Advent Calendar 2021 https://adventar.org/calendars/6777 2日目の記事です。


これは自作ツールを紹介する文書です。

概要

この文書でのhackとは、Switch本体とProコントローラーの間に有線でRaspberry-Pi4を経由し、本記事で紹介するツールを使って、Proコントローラーの出力を書き換える、ということを指しています。
コントローラーからの出力を書き換えることで、「ボタンを押しっぱなし状態」を「連打」にしたり、ボタンのremap、マクロを実現しています。
ソースは https://github.com/splaplapla/procon_bypass_man です。

やっていることは https://www.youtube.com/watch?v=N1dPFDSxaQ4 と同じです。

詳細な機能の説明

このツールはサードパーティー製のコントローラーよりも詳細な設定が可能です。例えば、特定のボタンを押している時にのみ連打を発動する、かつ、連打中は特定の入力を無視する、といった、特定のタイトルに特化した振る舞いを、設定ファイルに書くことでできます。
また、自作キーボードによくある「レイヤー」の概念もあったり、アナログスティックの最大値も書き換えも可能です。 これらの設定内容はテキストで出力可能です。

私が実際に使っている設定ファイルは https://gist.github.com/jiikko/309812cdf410b27503227d60d3f5c474 です。
設定の本文は、rubyスクリプトで書いているのでなんとなく、どんなことを行うのか読めるのではないでしょうか。

なぜこのツールを作ろうとしたのか

通常は、ボタン連射をするには、市販されているサードパーティー製のコントローラーを使う必要があるのですが、ボタンの押した感覚や各種設定方法は各社の独自仕様であるため、それらを手に馴染ませるのがとてもだるいです。特に「説明書を熟読してコントローラーの設定方法を覚えること」が主な苦痛でした。

そんな時に https://www.youtube.com/watch?v=N1dPFDSxaQ4 の動画を見つけて、自分も作ることにしました。

成果

ゲームをするときは今もこのツールを使っていて、具体的に何が便利かの明言は避けるのですが便利です。

進捗

基本的な機能はできるようになりましたが、使うにはrubyやlinuxの知識が必須な状態です。
現在は、それらの知識がなくてもトラブルシューティングや設定ファイルの書き換えを行えるような実装をしています。
https://github.com/splaplapla/procon_bypass_man/pull/18

課題と展望

  • 50回に1回くらいは接続に失敗することがある
    • sudo rebootの次はほぼ繋がる
  • 自分が使っている時に運用でカバーが結構多い気がしていて、言語化や仕組み化できていないものがありそう
  • 有線接続を強要されるので取り回しがだるい
    • 将来的にはbluetoothでの接続をすることを目指していますが、これを実現するには接続プロトコルをちゃんと理解する必要があってまだまだ時間はかかりそうです。暇な時にやろうと思っています
  • ラズパイのセットアップだるすぎ問題。itamaeでセットアップは完結するようにしていますが、メンテナンスが日に日にだるくなっています
    • arduinoみたいなハードで代替ができると、起動時間の短縮や配布物や手順・購入コストが減ると思っているのでちょっと考えていますが、今は実装・検証のしやすさという観点でラズパイを使っています。

宣伝

raspberry-Pi4が必要なので、動かせる人は相当限られると思うんですが、ピンと来た人はぜひ使ってみて欲しい!
前に書き散らした文書が古くなっていたり、アンドキュメントが結構あると思います。質問やPRは歓迎降臨です!
プラグイン機構もあるので本体に手を入れずに新しいタイトルへの対応もできます!(ex: https://github.com/splaplapla/procon_bypass_man-splatoon2 )

READMEにdiscordの招待リンクを貼っています。
https://github.com/splaplapla/procon_bypass_man

補足

  • 何でもsshでカバーするのはいつか辞めたいと思っていたので、webインターフェースを作りました
    • https://github.com/splaplapla/procon_bypass_man-web
    • webインターフェイスの中に、設定ファイルのエディターを作ったんですが、procon_bypass_manの新しい構文対応がめんどくて放置気味
      • 設定ファイルを手で読み書きできるのは作者しかいないよな、という気持ちがあってエディタは必要という意識はある
  • procon_bypass_man のバージョンマネージャーがあって、初期設定ファイルと実行ファイルを作るだけなら簡単にできます

おわり