Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

Nintendo Switchを自動化する

Posted at

はじめに

この記事は SLP-KBIT AdventCalendar2023 13日目の記事です。

当初は個人開発の概要や進捗をまとめる予定でしたが、締め切りまでに記事を書ける程の理解度に至りませんでした。
本記事では表題の通り、家庭用ゲーム機であるNintendo Switchの自動化について記載します。

Nintendo Switchの自動化とは

Nintendo Switchとは
Nintendo Switch(ニンテンドースイッチ)は、任天堂が開発を行い、2017年3月3日に発売した家庭用ゲーム機です。あまり知られていませんが、GPUはNVIDIAが作っています。発売から約7年間で全世界の売り上げ台数は1億3,246万台(2023年9月末時点)にも上り、据え置き型の家庭用ゲーム機の販売台数としては世界で第2位です(1位はPlayStation 2)。当然私もSwitchユーザーです。
自動化とは
本記事では、私たちユーザが操作することなく外部のコンピュータ等によってゲーム内で任意の操作を実行することを自動化と呼びます。コンピュータをコントローラーとしてNintendo Switchに認識させることで操作を可能にします。PCの他に、ArduinoやRaspberry Piなどのマイコンを使って自動化することができ、比較的安価に実装できます(後述)。

つまり、ゲームを機械にやってもらって楽をしようということです。
機械は疲れないので半永久的に支持した操作を継続してくれます。
活用法の例として、

・RPGのレベル上げ・素材集めを寝ている間にやってもらう
・難しい入力(格闘ゲームのコンボやパーティーゲームの連打など)をマクロとして設定しておいて、代わりに操作してもらう

などが挙げられます。コンピュータが操作している間に自分は学校に行ったり、睡眠をとったり、別のゲームをやったりと有意義に時間を使うことができます。また、近年は画像認識等と組み合わせることによって高度な操作をすることも可能になっています。

自動化の歴史

2017年3月3日 Nintendo Switch発売
2017年3月10日 SwitchとJoy-Conが解析される
Nintendo_Switch_Reverse_Engineeringが公開。発売からわずか1週間で本体とJoy-Con(コントローラー)の通信が解析される。
2017年6月20日 Switch本体更新ver3.0が配信
Nintendo SwitchドックのUSB端子に接続することで他社製のコントローラーが使用可能になった。
2017年6月21日 初の自動化が成功
アップデート翌日に、マイコン(Teensy)をHORI製コントローラーとして本体に認識させるSwitch-Fightstickが公開される。以後、有線による自動化は発展を続ける。
2019年1月4日 自動化ライブラリの公開
Arduino IDEを利用したSwitch Control Libraryというライブラリが公開。コントローラーの操作がライブラリになっており、Arduinoという安価でメジャーなマイコンで簡単に自動化することが可能になる。
2019年12月18日 キーマクロ管理ツールが公開
画像認識と入力キー設定をGUIのみで行えるPC向けのツールが公開される。(NX Macro Controller
2020年1月23日 Bluetoothによる操作が成功
LinuxのBluezを利用してlinuxOSのコンピュータをコントローラーに偽装する仕組みのPythonプログラムであるjoycontrolが公開される。CUI操作であったため、普及しない。
2020年7月22日 Bluetoothによる自動化が成功
上記のjoycontrolをGUI上で操作でき、マクロも組めるjoycontrol-pluginloaderが公開される。これにより、最低限のLinuxの知識があればBluetoothによって無線でSwitchを操作できるようになった。

以上が大まかなNintendo Switch自動化の歴史です。

自動化の方法の比較

マイコンを使う方法とPCを使う方法があります。

マイコンを使う

  • Arduino を使う
    Arduino LeonardoやArduino Micro 、Arduino UNO等で行うことができます。
    前者2つはATmega32U4、UNOはATmega328PというMCU(Micro Control Unit)が乗っている必要があります。
    arduino UNOはHID(ヒューマン・インターフェイス・デバイス)機能(USB接続したとき自身を入出力装置として認識させる機能)が標準搭載ではないため、手順が増えます。
    メリット: 安くて簡単
    デメリット:画像認識等に向かない(ArduinoにはOSが無い)、別途PCが必須(ArduinoにはOSが無い)
  • Raspberry Piを使う
    スペックはRaspberry Pi 3 Model A+以上であれば大丈夫そうです。(A無印はネットワーク接続ができない)
    Raspberry Pi Zero でも出来るらしいですが保証できません。関係ないですがRasPi5が楽しみです。
    メリット: 画像認識等が可能、PCが不要
    デメリット: 値段が高い

PCを使う

まだMac、Windowsでの自動化はできないみたいです

  • Ubuntu Desktop 20.04 LTS
    WSLでは出来ないみたいです。
    メリット: 新たにマイコンを買わなくていい
    デメリット: ハードルが高い(と感じる人が多い)
  • Windows 10/11(VirtualBox + Ubuntu Desktop 20.04 LTS)
    結局Ubuntuです。
    メリット: 新たにマイコンを買わなくていい
    デメリット: 仮想マシンや仮想環境に慣れていないと難しい。また、BluetoothでSwitchに接続する際にWindowsでBluetooth機器が使えなくなる場合がある(解決策求ム)。

結局どれがいいの?

Arduino Leonardoです。(個人的な意見)
導入が簡単で、さらに安いことです。Arduino言語はC/C++がベースなのでコーディングも楽々です。
特にLeonardoは非常に性能のいい互換機がamazonにて安価で購入できるため、おススメです。

画像認識やりたい!

Raspberry Piを使いましょう
Raspberry Piなら画像認識も可能です。消費電力も小さいので自動化にはピッタリ!

マイコンを買いたくない!

PCしかない
まだ日本語の解説が少ないため、少し難しいです。一緒に頑張りましょう。また、PCのメリットとして、ブラウザを通じてネットワークを共有するスマートフォン等からも操作が可能になるというメリットもあることを書き加えておきます。

実際に自動化してみる

私が行った自動化のうち、Arduino Leonardoを使ったものの手順を紹介します。
大雑把な流れは以下の図のようになっています。

20231212_074254614_iOS.png

現在もこの方法で自動化を行うことが可能であり、有線による自動化の仕組みを最も理解しやすいです。しかし、有志の方よりさらに便利なオールインワンパッケージが公開されています(インストールしたら即座に開発環境が整う)。仕組みとか興味ない人はそちらを参考にしてください。

自動化環境を作る

Step1. 必要なものを揃える

・PC(WIndows10以降)
Arduino Leonardo(もしくはその互換機
・USBケーブル(2.0A-MicroB)
Nintendo Switch
Nintendo Switchドック(Nintendo Switch Lite以外)
・Nintendo Switch Liteの場合はドックの代わりにUSBハブが必要

Step2. Arduino IDEをインストールする

公式サイトでArduino IDE 1.8.19をインストールしましょう。最新版ではないので注意。

・Arduino IDEとはArduinoの開発環境のフリーソフトです。
・Arduino IDEでコードを書く->Arduino IDEでコンパイルする->Arduino IDEでマイコンに書き込む
といった風に一連の作業がこれひとつでできます。実際にはVSCでコーディングするんですけどね

Step3. ライブラリをインストールする

NintendoSwitchControllerからダウンロードできます。
・Arduinoのライブラリのあるディレクトリ(/Users/{username}/Documents/Arduino/libraries/ など)に展開しましょう。
・NintendoSwitchControllerとは、Arduino Leonardoのライブラリです。switchの操作が関数として出来上がっているのでコーディングが簡単になります。

Step4. VIDとPIDを書き換える

有線による自動化の最大のポイントです。
SwitchにArduino Leonardoをコントローラーとして認識させるために必要なのが、デバイスIDの書き換えです。
ほとんどのUSBデバイスには製造元を表すVendorIDと、製品を表すProductIDという固有の値をデバイス内部にあらかじめ持っています。
Arduino LeonardoのIDを書き換えて、コントローラーとして認識させようというのが書き換えの目的です。

boards.txtのあるディレクトリ(/Program Files (x86)/Arduino/hardware/arduino/avrなど)を開き、boards.txtを編集することによって書き換えます。
・具体的にはboards.txt内のvidとpidの個所について.vid=0x0f0d.pid=0x0092のように書き換えます。

以上で準備は終了です。

自動化する

Step1. コードを書く

  1. 今回は任意の場所にtest/test.inoを作成する場合を考えます。
    Arduino IDEの仕様上、ディレクトリ内にディレクトリと同名のinoファイルをただ1つ作成する必要があります。

  2. test.inoをVSCで開き、プログラムを書きます。

例えばswitchの本体更新の画面を表示し、Aボタンを連打するコードは以下のように記述できます。

test.ino
#include <auto_command_util.h>

void setup(){
    pushButton(Button::B, 500, 12);/*Switchに認識させるためにBボタンを0.5秒押す*12回連打する*/
    pushButton(Button::HOME, 1000);
    pushButton(Button::X, 800);
    pushButton(Button::A, 5000);
    pushHatButton(Hat::DOWN, 1000, 4);
    pushHatButton(Hat::RIGHT, 1000, 7);
    pushHatButton(Hat::LEFT, 1000);
    pushButton(Button::A, 1000);
    tiltJoystick(0, +100, 0, 0, 1000);
    pushHatButton(Hat::RIGHT, 1000);
    pushButton(Button::A, 1000);
}

void loop(){
    pushButton(Button::A, 500);
}

Arduino言語とNintendoSwitchControllerのについて少し説明します。

まず、NintendoSwitchControllerに用意されている関数には以下のようなものがあります。

コントローラーの操作 関数
左スティック上下 tiltJoystick(0, -100(上)~+100(下), 0, 0, 秒数)
左スティック左右 tiltJoystick(-100(左)~+100(右), 0, 0, 0, 秒数)
右スティック上下 tiltJoystick(0, 0, 0, -100(上)~+100(下), 秒数)
右スティック左右 tiltJoystick(0, 0, -100(左)~+100(右), 0, 秒数)
十字ボタン pushButton(Button::ボタン, 秒数, 回数)
ABXY/+-/HOMEボタン pushButton(Button::ボタン, 秒数, 回数)
ボタンホールド SwitchController().pressButton(Button::ボタン)
ボタンリリース SwitchController().releaseButton(Button::ボタン)
待機 delay(秒数)

コードはArduino言語によって記述される必要があります。Arduino言語はC/C++がベースなので直感的に理解しやすいと思います。
setup関数とroop関数がmain関数に相当します。
Arduino Leonardoが起動したら、まずsetup関数が1度だけ実行され、その後roop関数が永続的に実行されます。
また、繰り返し文の記述や変数の宣言なども同様に可能です。

参考
#include <auto_command_util.h>
int number = 10;
void test(){
  for (int i = 0; i < number; i++){
     /*for文も使える*/
    }
}
void setup(){/*setup関数は1度だけ実行される*/
    /*コードを書く*/
    test();
}

void loop(){/*roop関数は電源が切れるまで実行し続ける*/
    delay(1000);/*ループしたい内容がなければdelay関数を書く*/
}

Step2. コンパイルする

コードが完成したらArduino IDEでコンパイルしましょう。
以下のような流れで簡単にコンパイルできます。

  1. Arduino IDEを起動
  2. ファイル->開く->inoファイルを選択
  3. 画面左上の検証ボタンを押す

Step3. ボードに書き込む

無事にコンパイルできたらArduino IDEでマイコンボードに書き込みましょう。
以下のような流れで簡単に書き込みできます。

  1. Arduino LeonardoをPCに接続する
  2. Arduino IDEを起動
  3. ツール->ボード:->リストからArduino Leonardoを選択
  4. ツール->シリアルポート->リストからCOM (Arduino Leonardo)を選択
  5. 画面左上のマイコンボードに書き込むボタンを押す

Step4. 動作確認

・Nintendo Switch にArduino Leonardoを接続する
・Arduino Leonardoがコントローラーとして認識され、ファイルの内容通りにNintendo Switchが操作されます。

うまくいかない場合は、

・Joy-Conを本体に取り付けた状態で、Switchに接続されている他のコントローラーを全て解除する
・Switch上でコントローラー->持ち方/順番を変えると進み、接続待機状態でもう一度マイコンを接続する

以上を試してみて下さい。

おわりに

ご清覧いただきありがとうございました。
この記事をきっかけにして自動化に興味を持っていただければ幸いです。ゲームしたいけど時間がない貴方はぜひ自動化を導入してみましょう。
また、私は画像認識を用いた自動化にトライしています。有識者の方はぜひ力を貸してください。

参考記事

この記事で取り扱った自動化の方法:苔むした日記帳
上記の方法を簡略化・拡張したもの:ますたーの忘備録

最も大切なこと

以上の記事の内容は、Nintendo Switch利用規約の第1条第5項

本ゲーム機本体、周辺機器、本ソフトウェア等を不正に改造しないこと、および任天堂の許諾を受けていない本ゲーム機の周辺機器およびソフトウェア等を使用しないこと

に該当する可能性がありますので、実装の際は自己責任でお願いします。

0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?