どうも、ラルフです。

ポケモンの厳選中、逃すを毎回入力するのが面倒なのでどうにかできないかということで色々作りました。

あれもこれもできるようにと頑張ってたら仕舞っておくのがもったいなくなったので公開します。ベースのアイデアは NintendoSwitchをPCから操作する - おいら屋ファクトリー からになります。

※ マクロ機能は用法用量を守りましょう。何か問題が起きても責任は取れません。

概要

ソースコード類はこちらにあります。

こちらの動画をご覧ください。

必要なもの

ハードウェア側

  • マイコン(Pro Micro)(ATmega32U4っていうのが搭載されていればいいらしいけど詳しくはわからない)
  • USB-シリアル変換モジュール
  • ワイヤーとか
    • とりあえずつなげるだけなら、ブレッドボードとジャンパワイヤーがあればなんとかなる
    • なんかいい感じにしたいなら後半参照
  • USB-Aオス – USB microケーブル x 2
    • 家に落ちているものでいいですが、充電専用のやつではないことをきちんと確かめましょう(1敗)

Webアプリ側

  • なるべく最新のJDK

ハードウェアの作り方

物理的なビルド

  • Pro MicroのTxとUSBシリアルモジュールのRx、Pro MicroのRxとUSBシリアルモジュールのTx をそれぞれつなげる
    • きちんとクロスさせましょう
  • Pro MicroのGNDと、USBシリアルモジュールのGNDをつなげる
  • FT234X+ADuM121N使用絶縁USBシリアル変換モジュール の場合は、Pro MicroのVCCとUSBシリアルモジュールのVDDをつなげる
    • もっと小型の方の FT234X 超小型USBシリアル変換モジュール を使っている場合、この端子は5V供給端子になるので繋げてはいけない
    • 自分が使用したのは、回路を物理的に絶縁させている絶縁モジュールというのが使われており、それの動作のためにVCCの入力が必要

ブレッドボード上であればこんな感じにつなげればいいでしょう

リセットスイッチはGNDとRSTをピンセットなりで触ってもいいですが、タクトスイッチがあったほうが便利です。

ファームウェアの書き込み

このような感じでファームウェアをビルド・書き込みします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# macOSの場合
brew tap osx-cross/avr
brew install avrdude avr-gcc

git clone --recursive https://github.com/r-ralph/Switch-Serial-Controller.git
cd Switch-Serial-Controller
cd device

make
# リセットボタンを押して数秒後に下のコマンドを打つ(書き込まれる感じが出るまで連打する)
avrdude -pm32u4 -cavr109 -D -P$(ls /dev/tty.usbmodem*) -b57600 -Uflash:w:SwitchSerialController.hex

この段階で、WindowsであればPCとつなぐと「PRO CONTROLLER」と出て、ゲームパットデバイスとして認識されるようになります。

サーバーの実行とデバイスの接続

以下の手順でサーバーを起動し、サーバーが起動しているPCにデバイスのシリアル変換モジュールの方のUSBを挿します。

1
2
3
4
5
git clone --recursive https://github.com/r-ralph/Switch-Serial-Controller.git
cd Switch-Serial-Controller
cd controller

./gradlew :server:run

デフォルトの設定だと、https://localhost:8080 でアクセスできるようになります。

アクセスするとこんな感じの画面が表示されると思います。

操作方法

Control パネル

動作などの設定をおこなうパネルです。

  • Serial Port
    • データを送信する先のシリアルポートを選択します。複数ある場合はデバイスマネージャなり実際に送るなりで正解を見つけ出してください。
  • Direct Send
    • Onの場合、右側のGamepadパネル上で何かしらの入力があった場合に即座にデバイス側へ送信します。
  • Hold Gamepad Input
    • Onの場合、右側のGamepadパネルの操作がトグル式になります。ボタンの場合はクリックごとにOn/Offが入れ替わり、スティックはドラッグアンドドロップで離した場所に固定されます。
    • Offの場合、ボタンはマウスをクリックしている間だけOnになり、スティックはドラッグアンドドロップ終了時に中央にカーソルが戻ります(実物のコントローラーのような感じになります)

Gamepad パネル

見ての通り、コントローラーの入力をおこなえる画面です。

コントローラーの下にテキストボックスがありますが、この部分に現在のコントローラーの入力値が表示されます。

この値は、後述のマクロで使用することができるフォーマットです。

HoldをOnにした状態でこのテキストをコピーし、マクロを組み立てる みたいなケースを想定しています。

Macro パネル

マクロを記述する事ができ、右上の「START MACRO」で実行を開始します。

1行に1コマンドを記述することができ、コマンドは以下のようなものが使えます。

  • コントローラーの状態の変更
    • 入力値をセミコロンで区切った形式
    • ボタンは「A,B,X,Y,L,R,ZL,ZR,LCLICK,RCLICK,START,SELECT,HOME,CAPTURE」
    • 十字キーは「HAT@{0-8}」
      • 8が何も選択されていない状態、0が12時の方向で、45度ずつ時計回りに数字が増えていく
    • スティックは 「(L|R)STICK@{角度:0~360},{傾き:0~1}」
      • 角度は3時の方向が0、反時計回りに増える(単位円と同じ感じ)。傾きは0が倒していない状態、1が完全に倒した状態。
    • 入力例
      • 「A;HAT@0」:Aを押しながら十字上を押している
      • 「LSTICK@180,0.5」:左スティックを左側に半分傾けた状態
  • 待機
    • 指定されたミリ秒の間待機する(直前の入力値を維持する)
    • 「wait {ミリ秒}」
    • 入力例
      • 「wait 1000」:1秒待機
  • ラベル
    • 後述のジャンプでのジャンプ先に指定できる
    • 「:{ラベル名}」
    • 入力例
      • 「:head」:headという名前のラベルを作る
  • ジャンプ
    • 特定の名前のラベルにジャンプする
    • 「goto {ラベル名}」
      • 「goto head」:headという名前のラベルの位置にジャンプする

マクロの記述例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# A→B→X→Yと1秒ごとに押していく

:head
A
wait 1000
B
wait 1000
X
wait 1000
Y
wait 1000
goto head
1
2
3
4
5
6
7
8
# 左スティックを上に入れながら、Aボタンを連打する

:head
A;LSTICK@90,1
wait 50
LSTICK@90,1
wait 50
goto head

デバイスをいい感じに作る

ここから先は、ハードウェアの方をブレッドボード上ではなくいい感じに仕上げた過程の防備録です。

こんな感じに仕上げます。

なお、これを作るのがはんだこて人生2度目ぐらいの電子工作に関してはド素人の状態ではじめました。

ブレッドボードそのままではなく、何かしらのケースに入れたい。けどアクリルを自分で加工する力はないというわけで、既製品のものを使うことにしました。ケースとユニバーサル基板が手軽に入手できるサイズで、一番小さなものがRaspberry Pi Zero向けのものだったので、以下の2点をベースに配置を決めていきます。

このユニバーサル基板だと、Pro MicroとUSBシリアルアダプターがそれぞれいい感じの位置に配置できます。

配線はこのような感じにしました。

画像下側の4列が、1-3行目、2-4行目とそれぞれ結線されているので、1-2列目には何も置かないようにする必要があります。

ユニバーサル基板への実装で使用したのはこれらのパーツです。

最後に、基板とケースを固定するためのネジ類も別途いいサイズのを用意しました。ネジ径は、Raspberry Pi向けの基板とケースなので、m2.6サイズのものになります。

なんとなくBoothとかで売っている感じのいい感じにすることができます。

試してはいませんが、ちょうどPro Microの内側にUSBシリアルアダプターが隠れられるサイズのため、ユニバーサル基板の両面にそれぞれのパーツを配置するようにすればもっと小型化できるようにはなると思いますが、ケースが自作になりそうだったので諦めました。