lefmarna / NintendoSwitchControlLibrary

A library for microcontrollers that uses Arduino to automate Nintendo Switch games.
MIT License
87 stars 15 forks source link
arduino arduino-leonardo controller library microcontroller nintendo nintendo-switch switch

NintendoSwitchControlLibrary

Arduino を使って Nintendo Switch のゲームを自動化する、マイコン用のライブラリです。

demo

⭐️ このライブラリについて

このライブラリは celclow 氏のSwitchControlLibraryを参考にして作られています。

SwitchControlLibrary は自由度が高いものの、コードが冗長になりやすい点、ArduinoSTL を使用するためコンパイルに時間がかかる点などがネックでした。

そこで、一般的によく使われる入力のパターンを厳選して関数にまとめることにしました。

ボタンを押して離すまでの処理が 1 行で書けるようになり、より効率的に自動化プログラムを組むことができるようになります。連打や長押しの処理にも対応させ、汎用性の高いプログラムに仕上げました。

そしてなにより、ArduinoSTL を使わずにこれらの処理を実装することに成功しています。これによりコンパイルが高速に行えるほか、依存関係に悩まされなくなっていることも特徴です。

🔹 導入方法

必要なもの

動作環境

詳しい導入の手順については、ブログで解説していますので、そちらをご覧ください。

マイコンを導入して、ポケモン剣盾を自動化しよう!【Mac・Windows】|ポケモニット

⚠️ 注意点

Arduino Leonardo については、ブログ内で紹介しているものを推奨しています。その他の Arduino では動作確認を行っておりません。異なるものを使用している場合には、質問にも一切答えられませんので予めご了承ください。

Arduino IDE やボードのバージョンは、基本的に最新の安定版のものを使って動作確認しています。古いバージョンでも使えるとは思いますが、動作を保証するものではありません。

なお、Nintendo Switch のバージョンには指定がありません。どのバージョンでも問題なく動作するはずです。

📄 使い方

ライブラリを使いたいファイルの先頭に以下のように記載してください。

#include <NintendoSwitchControlLibrary.h>

これでライブラリを読み込み、各種コマンドを使うことができるようになります。

単体で完結しているため、ArduinoSTL や SwitchControlLibrary といった別のライブラリを読み込む必要はありません。

SwitchControlLibrary とは競合するため、同時に読み込むことはできませんが、NintendoSwitchControlLibrary は SwitchControlLibrary(v2 系)を継承して作られているため、SwitchControlLibrary のコマンドも使用することが可能となっています。(ArduinoSTL を使用していない都合で、十字キーのコマンドのみ動作が少し異なりますが、基本的には同じように使うことができます)

⌨️ コマンド一覧

ボタン

十字キー(方向ボタン)

スティック

スティックの座標は、128 を基点として 0〜255 の値を指定します。

0・128・255 の 3 つの値は Stick で定義されているため、置き換えて使用することもできます(0 = MIN, NEUTRAL = 128, MAX = 255)

また、引数にボタンを渡すことでボタンを連打しながらスティックを傾ける操作を行うことができます。

スティックぐるぐる

SwitchControlLibrary を使ったその他のコマンド

このライブラリは SwitchControlLibrary のコマンドも内蔵しているため、合わせて使用することもできます。(v2 系を採用しています。v1 系とは互換性がないことに注意してください

上記のもので対応できないものがある場合には、活用してみるといいかもしれません。

サンプルとして、ポケモン剣盾でバックアップデータの読み込みを行うコマンドを用意してみました。

SwitchControlLibrary().pressButton(Button::B);
SwitchControlLibrary().pressButton(Button::X);
SwitchControlLibrary().pressHatButton(Hat::UP); // ※SwitchControlLibraryと異なり、moveHatは使えません。 pressHatButtonに統合されています。
SwitchControlLibrary().sendReport();            // B、X、↑ボタンが同時に送信される
delay(100);
SwitchControlLibrary().releaseButton(Button::B);
SwitchControlLibrary().releaseButton(Button::X);
SwitchControlLibrary().releaseHatButton();      // ※SwitchControlLibraryと異なり、引数は指定しません。(十字キーをニュートラルポジションに戻す処理となる)
SwitchControlLibrary().sendReport();            // B、X、↑ボタンを同時に離す

🎁 さいごに

このライブラリは暫定的なものなので、要望や改善案、追加してほしい機能などありましたら、Issuesから気軽に投げかけてくださいませ。

画像認識のような高度なものを作るのは難しいかもしれませんが、入力プログラムの応用の範囲でしたら対応できるかと思います。

©️ ライセンス

MIT