見出し画像

RTA in Japan 2022 Winterに参加するためにコントローラーを自作した話

2022年末に行われたRTA in Japan 2022 Winterにソニック3&ナックルズで参加しました。
この記事はイベントの参加レポートではなく、イベントに応募するまでの話です。

イベント本番の動画はこちらからどうぞ。

応募するには

普段ソニック3&ナックルズをプレイする際は非公式のエミュレーターを使用しているのですが…

RTA in Japanの応募要件の画像。 応募不可能なケース ・エミュレーター使用
応募できねぇ…

RTA in Japanではエミュレーターが禁止されています。

ですが、応募はしたいです。
RTA in Japanに応募するための選択肢は3つありました。

  1. Steam版で応募する

  2. GC版で応募する

  3. 実機を買う

しかし、どの選択肢にも何かしらの問題がありました。

各バージョンと問題点

Steam版

Steam版は一番手軽な選択肢です。
普段はキーボードでプレイしているので、普段と同じデバイスが使用できます。

しかし、入力遅延が大きく音のエミュレーション精度が低い。
リセットに時間がかかるのでタイム的にも遅い。
リセット時のセーブデータの挙動も怪しかったので、可能であれば避けたい選択肢です。

GC版

GC版は比較的入力遅延も小さく、音のエミュレーション精度も許容範囲内です。
しかし、一つ大きな問題がありました…

ゲームキューブコントローラーの画像
このコントローラーじゃあクラシックソニックRTAは出来ねぇ…

通常プレイなら特に問題ありませんが、フレーム単位での操作が要求されることが多い"ソニック3&ナックルズ" のRTAは、このスティックと十字キーでは無理です。

実機

最後の選択肢は実機を購入することでした。
実機を入手してしまえば、心配すべきことはコントローラーに慣れることだけです。

実機でソニック3&ナックルズを遊ぶためには、"ソニック&ナックルズ" と "ソニック3" の2つのソフトを購入する必要があります。
特に "ソニック&ナックルズ" は値段が上がっており、本体とソフト2本を揃えようと思ったら2万円を超えてしまいそうな勢いです。

今回の応募のためだけに実機を購入するのは躊躇われました。

選択

悩んだ結果、一番簡単な選択肢であるSteam版で応募をすることに決めました。
決め手は使い慣れたキーボードを使えることです。
実は、以前ソニック2で参加した際もSwitchに変換機を繋ぎ、キーボードでプレイしていました。

そして、応募用の動画を録画した数日後のこと…

https://github.com/NicoHood/Nintendo

Arduinoをゲームキューブコントローラーとして使えるようにするライブラリを見つけてしまいました。

Arduinoの画像
Arduinoはちっちゃいのにいろいろ作れるすごいやつ (写真は互換機)

早速手持ちのArduinoを使い試してみたところ、実際にArduinoでGCを操作することが出来ました!

そうだ、キーボード型コントローラーを作ればいいじゃないか!

そうと決まれば善は急げ、どのようなコントローラーにするかを考えましょう。

キースイッチ

一番重要なキーのスイッチは、普段使っているキーボードのスイッチと同じものにしました。
Kailh ロープロファイル Red Proです。
ボタン数は、十字キーで4つ、ABXYで4つ、スタートとZボタンで2つ、合計で10個に決めました。

Kailh Low profile Red Proの画像
Kailh Low profile Red Pro かわいい

Arduino

次に選ぶのはArduino本体です。
Arduinoには様々な種類があり、公式非公式、大小様々です。

今回選択したのは、Pro Microと呼ばれる非公式のArduino互換ボードです。

Pro microの写真
コンパクトなのにちゃんと使えるいい子

選んだ理由は、コンパクトでコントローラー本体に収めやすいと考えたためです。
また、このPro microは自作キーボード界隈で広く使われており、以前触った経験があります。

スイッチとPro Microは自作キーボードのお店の "遊舎工房" で購入しました。
合計で2,500円程度でした。


ケース

最後に選ぶのはコントローラーのケースです。
コントローラーとして組み立てられるサイズ、かつ大きすぎない、それでいて加工できそうなモノを探していたところ

とてもちょうど良いケース。 (画像は拾い物です。)

ダイソーで100円でした。
高さが2.3cmしか無いけどなんとかなるでしょう。

コントローラー製作開始

ケース作成

まずはコントローラーのキー配置を決める必要があります。

左手と右手それぞれにカーソルキーのような配置のキーを4つずつ、中央の上下に1ボタンずつ置いた。
こんな感じのキー配置

いつも通りのプレイが出来るようにと考えた結果、このようなキー配置にすることに決めました。

この配置でケースに穴を開けていきましょう。
キーボードのスイッチは四角いので、四角く穴を開ける必要があります。
簡単に穴を作る方法は思いつかなかったので、リューターで大雑把な穴を開け、ヤスリで形を整えることにしました。

穴を完成させるまで数日掛かりましたが、無事スイッチがケースに嵌められるようになりました。
(記事にまとめることを考えていなかったので完成まで写真がありません…)

配線

配線はとても簡単です。
ボタンの配線は、すべてのスイッチの足をPro microの任意のピンとGNDに繋ぐ。
GCに繋ぐケーブルは、DataをPro microの任意のピンに繋ぎ、5vとGNDを繋ぐ。
これでケースと配線は完成です!

実際に基板をケースに収めてみたところ、このような感じになりました。

完成したコントローラーの写真
配線が汚すぎるけど動くからヨシッ

プログラム

あとはPro micro用のプログラムを書くだけです。
ライブラリを使って適当に動きそうな感じに書きましょう。

コードを書いたArduinoのIDE画面
こんな感じ。
最終的なソースコードは最後の方に貼ってあります。

完成したらPro microに書き込んで…

自作コントローラーでゲームキューブを操作しているGIF
動いた!

動きました!これにて完成です!

と、言いたかったのですが、ここで問題が発覚します。
どうも今回使ったライブラリは、GCのコントローラーとして動かした場合1フレームの入力遅延が発生してしまうようなのです。

これではいけませんね。
ライブラリの中身を読んで原因を探すことにしました。

入力遅延の原因

入力遅延の原因は、ポーリングのタイミングでした。

この図はライブラリの動作をとても大雑把にまとめたものです。

ボタン入力を取得してから実際に操作をGCに送るまでに、1フレーム近い待機時間が発生しています。
この待機時間が入力遅延の原因でした。

入力の取得をどこかに割り込ませれば遅延を無くせそうです。
割り込ませられそうな場所を探してみた結果、良さそうな場所を見つけました。

「GCから信号を受け取り」「操作を送る」この間に割り込めそうです。
信号を受け取ってから入力を取得し、取得した内容をそのまま送ってしまいましょう。

実際にやってみた

このように書いてみたところ、操作が一切効かなくなってしまいました。

どうやら入力を読むのに時間が掛かりすぎているようです。
ライブラリのコメントには、GCから信号を受け取ってから80マイクロ秒以内に応答する必要があると書かれています。
80マイクロ秒に収まるように入力読み取り部分を高速化しましょう。

※80マイクロ秒 = 0.00008秒

入力読み取りの速度を改善した

Arduino標準の"DigitalRead"を、"PINx"に置き換えました。
互換性と可読性を引き換えに、高速で入力を読み取ることが出来ます。

これで完成のはず!
あとはPro microに書き込むだけ!

だったのですが… 書き込み時にPro microが壊れました…
何をしても治らなかったので、泣く泣くもう一つ買いました。

新しく届いたPro microに書き込んで動作確認をしたところ

スーパースローモーション 960fps撮影

入力遅延解消!
完成!

これでRTA in JapanにGC版で応募できます!
応募した結果は

RTA in Japanの当選画像。ソニック3&ナックルズが採用されてAIM CLIMBがバックアップ。
AIM CLIMBは今回もバックアップ

採用されました!

自作コントローラーでイベントに参加した感想

コントローラーに興味を持ってくれる方がそこそこ居ました。
中には同じようなコントローラーを作った経験があるという方も居て、自作コントローラについて語り合うことが出来たのがとても楽しかったです。

もしこの記事を読んで興味を持った方がいらっしゃいましたら、コントローラーやキーボードなどを自作してみてはいかがでしょうか。

謎の記事でしたが、最後までお読みいただきありがとうございました。


普段はここで配信してます。

余談

コントローラーのソースコードを公開しておきます。
使いたい方、参考にしたい方はご自由にどうぞ。

FC/SFC/MDのコントローラーはArduinoを使えばライブラリを使わなくても簡単に作れます。
興味がある方はコントローラーの構造を調べて作ってみてはいかがでしょうか?