自作レバーレスコントローラーの基板を GP2040 ベースに変えた

2年半前くらいに、自作のレバーレスコントローラーを作った。
そのときには、 pro micro を使って、この上で動くコードはライブラリを利用しつつも主要な部分は自分で書いていた。

2年半時間が経過して、レバーレスコントローラーの自作はかなり一般的になった。
また、Raspberry PI Pico が発売されて、これの上で動くコントローラー用のソフトウェア GP2040 が開発された。
GP2040 は開発体制が変わったのか、オープンソースで開発が続けるコミュニティ版がフォークして、今は、GP2040-CE という名前で開発が続いているように見えた。

自分としてもいつまでも pro micro で動くコードの面倒を見るのはたいへんなので、GP2040-CE に乗り換えることにした。

配線をどうするか

pro micro でレバーレスコントローラーを作っていた頃は、ユニバーサル基板を使って気合いでボタンを配線していた。
でもまぁ、なんかそれも面倒なので、今回は pro micro 用のターミナルブロックを使うことにした。

例えばこういうの。aliexpress で送料も含めて 1000 円以下で買える。

今回は面倒なので、amazon で似たようなものを買った。

GP2040で使うことを想定した PICO Fighting Boardってのもあるみたいで、これも高くはないのだけど、トータルの値段で言えば汎用のターミナルブロックを使うんでいいような気がする。

GP2040-CE への独自機能の移植

pro micro の頃に、ミスタードリラーやテトリスなどのパズルゲームを遊ぶときに、斜め入力が入るのを避けるため、方向キーについて、最後に押したものを優先して入力として扱うような機能を実装して、設定で切り替えられるようにしていた。

GP2040-CE に乗り換えるにあたり、この機能を移植したいと考えた。

GP2040-CE は、オープンソースである。
なので、ビルド環境さえ整えてしまえば独自の機能を追加できる。
しかも、ソースコードを眺めていたところ追加機能を作りやすいように、プラグイン用のインタフェースがコード内に用意されていることが確認できた。

なのでさっと作った。

この機能が欲しい人居るんだろうか。いればプルリクエスト送ってもてもいいのかもしれないけど、、

GP2040-CE は、2023年の頭くらいにいくつかの git submodule に分割された。
その影響で、変更が複数のレポジトリにまたがる形となって若干面倒ではあった。

あと、Build 手順のドキュメントが古く、2023年4月1日時点では、書いてある通りにビルドすることはできなかった。
けど、 issue に手順をアップデートする予定があることが記載されているので、そのうち改善されると思う。

人に自作 hitbox を作ってあげた。あと連射性能の計測をした。

1ヶ月に1回は更新したい本blogは、無事3ヶ月更新が空きました。
今年もよろしくおねがいします。

で、以前に自作 hitbox を作ったというエントリを書いたのですが、その後友人にほぼ同様のものを実費+おこづかいで作ってあげました。
少しミスもあったんですが、全体的に自分用のものを作ったときと比べて随分工作精度が上がった気がします。
ソフトウェアも使い回せるし、作れば作るほどうまくなっていって良さそうなのでは?という気持ちがあります。

ボタンの色がなんかスゴイですが、友人の希望によりこの色です。すでに友人の手元にこれは行ったのですが、気に入ってくれているようです。よかった。

で、最近、STEAM版の Mr.Driller アンコールのフレーム落ちの対策ができて、またやる気が高まってきたので、コントローラーの連射速度の調整をしました。

やはり以前のエントリで、コマンドの入力フレームを計測するために、Unityでソフトを書いたという内容を書いたのですが、これを改造して、秒間何回連射しているのか計測できるようにしました。

コントローラーの中には sparkfun pro micro を用いており、タイマー用のライブラリには MsTimer2 を使っています。
MsTimer2 でタイマを設定するインタフェース MsTimer2::set(unsigned long ms, void (*f)()) では、割り込み周期のミリ秒単位での指定と、タイマが切れた際に呼び出す関数の指定ができるようになっています。
ゲームでは60フレームが用いられることがありますが、 60フレームの際の 1フレームの時間は、おそよ16.6666ms であり、ボタンの on と off をそれぞれのフレームで交互に入力するためには、その2倍の 33.3333ms 周期でボタンの押し下げと離しを行う必要があります。しかし、MsTimer2::set(unsigned long ms, void (*f)())の時間は ms 単位であるため、正確に指定することはできず、やむなく 34ms としました。

34msごとにボタンを押すと、1秒あたりおよそ 29.41 回の連射になるのですが、これが正しく unity で書いたソフトから検出することができ、pro micro や OS のレベルで遅延が起こり、入力が抜けてしまうということはないということが確認できました。

これ以上速度をあげようと思うと、ライブラリを用いず、自力でタイマーを叩く必要が出てくるので、そのへんはおいおいやるかもしれないしこれで満足してやらないかもしれないです。
どうしようかなぁ。

レバーレスコントローラー(hitbox あるいはガフロコンって呼ばれるもの)を作った。格ゲーにおける優位性をちょっと測定した。

ふと、手元にあった、ピンの少ない Sparkfun Pro Micro 互換機で、ゲーム用のコントローラーを作ってみたらそれなりに作れたので、通常通りにピンが付いている Sparkfun Pro Micro を買ったり、ドリルを買ったりホールソーを買ったり、ボタンを買ったりしてレバーレスコントローラー自作してみました。


本 blog エントリではこの自作したレバーレスコントローラを自作レバーレスコントローラーと呼びます。また、製品として売られているレバーレスコントローラである HitBox を hitbox と呼びます。

普通、レバーレスコントローラーを作る場合には、あり物のコントローラーの基板を乗っ取ったり、あるいは Brook の UNIVERSAL FIGHTING BOARD を基板として使うのが定番のようです。Brook の UNIVERSAL FIGHTING BOARDは12000円くらいします。でも今回は、既存のコントローラーの基板やBrook の UNIVERSAL FIGHTING BOARD の代わりに Sparkfun Pro Micro とこれの上で動く自作のプログラムで代用したので、2000円くらいで済ますことができました。もしも Pro Micro 安い互換機を使えば更に安くすることができますね。

ちなみに、今回作った自作レバーレスコントローラーで使ったSparkfun Pro Micro は2000円くらいで、それ以外のボタンやケースやら配線のためのもろもろが6000円で、合計8000円くらいでした。ちなみに、 PC と Nintendo Switch で使えることは確認済みでです。一方 PS4 では使えないことを確認しています。でも、PS4でそんなにゲーム遊ばないから、今回はこれで良いということにしています。

レバーレスコントローラーと SOCD (Simultaneous Opposite Cardinal Direction/反対方向同時入力)

今回、わざわざ Pro Micro を使ったのは、安く仕上げるためであると同時に、コントローラーの挙動を細かく変更するためでもあります。

レバーレスコントローラーの作成にあたっては、SOCD(Simultaneous Opposite Cardinal Direction/反対方向同時入力)に対する考慮が必要となります。
SOCDとは、通常、レバーや十字キーでは入力できない、左右の同時押しあるいは上下の同時押しをどのように扱うかについてのアルゴリズムのことです。

格闘ゲームにおける SOCD

hitbox では、左右同時押しは横方向はニュートラルとして扱い、上下の同時押しは上入力として扱われます。格闘ゲーム向けのにおいては、この hitbox の SOCD の扱いが、デファクトスタンダードとなっているようです。
Brook の UNIVERSAL FIGHTING BOARDは、ジャンパピンを用いた設定により、hitbox と同等とすることが可能です。

レバーレスコントローラーの格闘ゲームプレイ上の利点の定量化

格闘ゲームにおいて、レバーレスコントローラーによる操作は、一部レバーを用いた従来のコントローラーよりも高速に可能であるとして、多くのプレイヤーが現在利用していることがインターネットを検索することによって確認できます。
しかしながら具体的にはどの程度有利であるかについては、レバーレスコントローラと従来のレバーによるコントローラそれぞれの操作の習熟度に伴い個々人で異なること、またその簡易な計測方法が存在しないことといった理由で、計測が行われてこなかったのではないかと考えました。

そこで今回、キーディスプレイおよび各入力の継続フレームの表示のみを行うプログラムを unity を用いて作成し、これを用いて測定を行える環境を作りました。

まだ十分な回数をこなせておらず、統計として不十分なので、いくつかの測定結果及び感想を書いておきます。
なお、自作レバーレスコントローラーの SOCD は、hitbox に準拠した設定としています。また、比較対象に使っている通常のレバーありコントローラーには、 RAP V4 隼を用いました。

計測対象 自作レバーレスコントローラー レバーありコントローラー
←ため→ のニュートラル経過フレーム数 0フレームあるいは1フレーム 1から3フレーム。8割くらい2フレーム。
標準的な昇龍拳入力開始から完成まで(623入力) 7フレームくらい 7フレームくらい
昇龍拳のhitbox 向け入力開始から完成まで(639入力) 大体6フレームくらいだけど4フレームで完成したときもあった やってない

回数をこなした統計は、また追々測って行こうと思います。

あと、すでにレバーレスコントローラーの操作になれた人のフレーム情報も見てみたいので、汎用的な作りにして配ったりしたい。
今は、とりあえず図り始められる環境を作ることを優先して、PC環境依存でベタ書きになっていて人に配れたものではないので。

格闘ゲーム以外における SOCD

現在、製品として入手可能な hitbox を始めとするレバーレスコントローラーは格闘ゲーム用に使うことを想定している事が多いですが、もちろん他のゲームに使うことも出来ます。
ただし、他の種類のゲームに用いるときには、 SOCD の扱いは格闘ゲームとは別の考え方をするべきなのではないかと考えています。
通常 SOCD は、左右の同時押しあるいは上下の同時押しを考慮しますが、斜めの入力を行う必要がなく上下左右の4方向の入力のみを想定するテトリスなどのパズルゲームでは、格闘ゲームでの利用を想定した SOCD とは異なるアルゴリズムがより適しているのではないかと考えていました。例えば、上下左右の4方向をすべて排他し、最後に押されたものを優先するのが良いのではないかと考えました。
このような SOCD についての挙動の変更は、既存のコントローラの基板や Brook の UNIVERSAL FIGHTING BOARD では実現不可能であるため、これを自由にコントロールするために、Pro Microで自作する必要がありました。

格闘ゲーム以外においてはどうするのが良いのかについても追々考えていきたいですね。

ミスタードリラーアンコール(Steam版)のワールドトリルツアーで世界記録を出した (2020年8月14日時点)

2020年6月11日に、SwitchとSteamでミスタードリラーアンコールが発売された。
日本ではミスタードリラーアンコールという名称だが、海外ではミスタードリラー ドリルランドという名称で販売されており、内容としては2002年にゲームキューブ向けに発売されたミスタードリラー ドリルランドの移植である。
Steamの方はSwitchを始めとする据え置き型ゲーム機のように世代交代により遊べなくなる可能性が低く、かつPCで利用可能なアケコンがすでに手元にあるという理由で、自分はSteam版を購入した。

ミスタードリラーアンコールには、現代向けに難易度を低く調整したカジュアルモードと、2002年のドリルランドと同様の難易度になっているクラシックモードがある。
自分は、カジュアルモードとクラシックモード両方のワールドドリルツアー Level2 (1000m) で1位を取ることができた。

一度 6月27日にクラシックモード ワールドドリルツアー Level2 (1000m) で1位になった。このときには、PS3用の連射付きのFighting Commander 3 Pro というパッドで遊んでいた。

で、寝て起きたら2位になっていた。
パッドで遊ぶのは辛いと分かっていたので、サンワのレバーを取り寄せて、RAP V4 隼という普段使っているアケコンののレバーを交換し、4方向にガイドを設定してこれを使うようになった。
RAP V4 隼は、隼レバーと呼ばれるレバーが使われているのだけれど、これは8方向専用のレバーであり、サンワのレバーのようにガイドを回転させて4方向にしたりできない。きょう日アケコンを買うのなんて格ゲー遊ぶ人が大部分といえばそりゃまぁそうなんだけど、なんだかパズルゲーム勢がないがしろにされているようで辛いよ。
↓はお家に届いたサンワのレバー。

で、1位まで220点差まで詰めたものの

その後、更に高いスコアを出した人が現れ3位に転落。
で、この頃から体調が非常に悪くなり、ゲームに対するモチベもじゃんじゃん下がって、仕事以外では布団に寝そべって youtube を眺めるばっかりの生活がしばらく続いた。
なお、youtube では最近は Bad Gear というグルーブボックス的な音楽機材を扱うやつばかり見ている。
あと、最近は各ゲーマーがtwitchなどでストリーミングしたもののバックアップが youtube に上がっていたりして、それを見たりもしていた。
最近はウメハラ氏が、Hit Box というレバーを廃して、上下左右をボタンで入力するコントローラーを使っている、みたいな情報が入ってきたりして、ふーん。と思ったりしていた。

8月に入って体調も改善してきた。
ドリラーを遊びたいけど、わざわざPCのキーボードを机の上から退けて、アケコンを机の上に置くのが面倒だな、という気持ちになっていた。
そんなとき、ふとウメハラ氏が使っているという Hit Box のことを思い出した。
いっそのことキーボードで遊んじゃえばいいじゃん、Hit Box みたいなもんじゃん。と思った。
アケコンを4方向レバーに換装したとはいえ、方向を変える度に何フレームかニュートラルに入った状態になりロスが生じている。でも、キーボードで遊べばそのロスを減らせる可能性があるのでは?と気づいた。

自分は ergodox ez というファームウェアが書き換え可能なキーボードをかれこれ3年弱使っている。なので、ファームウェアを書き換えて、ゲームを遊びやすい配置にキーをアサインし直した。あと、掘りボタンの連射速度が早くなるようにギリギリまで調整した。(ergodox ez のファームウェアであるところの qmk において、キーの自動連射を実装したくて、かつ日本語を読める人は殆ど存在しないと思うのでこれについてはここでは詳しく説明しません。興味ある人はtwitterで聞いてください。)

で、キーボードによる1回目のクリアで2位になり、2回目のクリアで1位になった。

その後、1位になった時の記録は超えていないけど、4方向レバーに換装したアケコンを使っていたときと比べて平均的にスコアが伸びている感じはあるので、キーボードでのプレイに移行したのには効果があったのかな、と思っている。

あと、カジュアルモード ワールドドリルツアー Level2 (1000m) も初回のクリアで1位を取った。

一番ベーシックなモードであるワールドドリルツアーの1000mでいいスコアが出れば個人的にはもう思い残すことはないので、このあとはのんびり色々遊んでいこうと思う。

自分の好きなゲームが発売されて、それを思い切り遊ぶためにアケコンのレバー取り替えたり、キーボードのファームウェアいじったりと工夫して、それでちゃんとスコアも伸ばすことができて、なんだかいい人生だなって思ったよ。

あつまれどうぶつの森のメインテーマをremixした。あとどうぶつの森と娘の関係のこととか。

あつまれどうぶつの森のメインテーマであるところの、みんなあつまれ(海外ではWelcome Horizonsというタイトル)をremixしました。
発売前から CM やらの動画で聞いて、いいなーと思っていて、なんだか耐えられず作りました。

けけハウスと、アーバンけけもすごくお気に入りなので、なんかやりたいところです。勢いがついたらやります。

3DS で発売された前作、とびだせどうぶつの森もそうだったのですが、あつまれどうぶつの森では一貫して感じににルビが振ってあります。
なので、一部難しい表現や知らないことがゲームの中で色々起こるのでサポートが必要な場面はあるものの、まだ5歳の娘も自分で遊ぶことができるので、ここ最近は自分よりも遥かに長い時間娘のほうがどうぶつの森を遊んでいます。
おかげで、ひらがなを随分すらすらと読めるようになったり、数字が読めるようになったり、ゲーム内の動物が言っていることを理解できるようになったりとできることがどんどん増えてきています。このままお金の計算や、色んなものをいい感じに配置するためのマスの計算やらできるようになってくれると良いなぁ。と思います。

ゲーム規制条例がどうだとか最近ありますが、我が家ではこんな感じなので、ゲームが悪いとはどうしても思えなかったりします。
ゲームの中とはいえ色んな経験を積んでいるなーという感じがします。
子供は物理的に体を動かすことも大切ですが、色んな情報がコンピュータ上のデータとして記録されたり、それにソフトウェアを通じてアクセスする世の中にもなってきているので、そういった考え方にゲームを通して慣れていくってのも、むしろ教育の一環としてむしろ必要なんじゃないかとすら思うこの頃です。

少し話が変わりますが、ここ最近のコロナの影響で、娘が通っていた運動教室が、一箇所に集まって従来通りに行うことのリスクが高いということで、zoom を使ってのオンライン運動教室になりました。
なんか、運動教室をオンラインでって本当にできるのか?って思っていたのですが、とりあえず1回やっていたのを横からちょろっと眺めた範囲では、ちゃんと成立していたのでびっくりしました。
よく考えたら親戚とLINEでビデオ通話とか日頃からやってるわけだし、こういうのには子供のほうが慣れたりしているのかもしれないなーって思いました。

ゲームも含め、いい感じにテクノロジーを活用して過ごしていきたいですよね、と思いました。