【マイコン】ポケモン剣盾のワット稼ぎを自動化!スイッチのVer11以降に対応!

  • 2021年1月16日
  • 2021年2月11日
  • 自動化

マイコンを使ったポケモン剣盾のワット稼ぎを自動化してみました。

ニンテンドースイッチでは2020年12月にリリースされたVer11.0.0以降、UIが一新されましたね。それに対応したコードを紹介していますので、最新の本体を使っている方でも自動化できるものとなっています。

この記事をご覧になる前に

マイコンをまだ導入していない方は、以下の記事を参考に導入してみてください。このブログでは、Arduino Leonardoというマイコンを使っているため、異なる種類のものではうまく動かない可能性があります。

関連記事

マイコンと呼ばれるものをご存知でしょうか? Switchに接続するだけで様々な作業を "自動" で行ってくれるというものです。 導入すれば作業が楽になるだけでなく、寝てる間に色々稼ぐこともできちゃう便利なアイテムなわけですね! […]

マイコンを使って
ポケモン剣盾
自動化しよう!
【導入編】

※2021年2月11日追記:当ブログで使用するライブラリが「NintendoSwitchControlLibrary」へと変わりました。旧ライブラリのコードも残しておきますが、基本的には新しいライブラリをダウンロードして新しいコードを使ってください。

GitHub

A library for microcontrollers that uses Arduino to automate…

ダウンロードして解凍したら、『Arduino』フォルダの中にある『libraries』フォルダの中にコピーすればOKです。(展開を終えたら展開元のzipファイルは削除してしまって構いません。)

作成した経緯

ワット稼ぎに関しては、ネット上にサンプルコードがたくさん転がっています。

Qiita

背景 ポケモン剣盾の孵化作業をArduinoで完全自動化するという記事で孵化厳選の自動化、ポイントアップ(ポイント…

しかし、そのほとんどがスイッチのVer11以降に対応していませんでした。そこで、最新の本体にも対応したコードを自分で用意してみることにしました!

ただ、Ver11以降に対応させるだけではおもしろくないので、削れるところは削りつつもシビアなところは少し猶予をもたせるなど、高いパフォーマンスと安定感を両立させており、効率的にワットを稼ぐことができるようにしています。

ワット稼ぎには、ランクバトルを行う手法も存在します。ですが、気軽に使えるシンプルなコードにしたかったため、通常の状態で回すコードを書くことにしました。

ソースコード

実際に書いたコードはこちらになります。

旧ライブラリ(NintendoSwitchControll)を使用している方はこちらをクリック
/**
* 巣穴からワットを回収し続けるスケッチ
*
* 初期条件は以下の通り
* 1.願いのかたまりを投げ入れた巣穴の前にいること
* 2.巣穴のワットは回収済みであること
* 3.インターネットで時間をあわせるがOFFになっていること
* 4.オフライン状態であること
* 5.無線のコントローラーが接続されていないこと
* 6.「設定」から「話の速さ」を「速い」にしておくこと
*/

// ライブラリを読み込むためのコード
#include <auto_command_util.h>

// ワットを回収するシーケンス
void execWattGainSequence()
{
    // 募集開始
    pushButton(Button::A, 3000);
    // ホーム画面 > 設定
    pushButton(Button::HOME, 500);
    pushHatButton(Hat::DOWN, 25);
    pushHatButton(Hat::RIGHT, 25, 5); // SwitchのVer11〜に対応。11未満の場合は、最後の5を4にする必要がある
    pushButton(Button::A, 100);
    // 設定 > 本体 > 日付と時刻
    pushHatButtonContinuous(Hat::DOWN, 2000);
    pushHatButton(Hat::RIGHT, 25);
    pushHatButton(Hat::DOWN, 25, 4);
    pushButton(Button::A, 200);
    // 日付と時刻 > 現在の日付と時刻
    pushHatButton(Hat::DOWN, 25, 2);
    pushButton(Button::A, 500);
    pushHatButton(Hat::RIGHT, 25, 2);
    pushHatButton(Hat::UP, 25);
    pushHatButton(Hat::RIGHT, 25, 3);
    pushButton(Button::A, 50);
    // ホーム画面 > ゲーム画面
    pushButton(Button::HOME, 600);
    pushButton(Button::A, 600);
    // レイド募集中止
    pushButton(Button::B, 1000);
    pushButton(Button::A, 4000);
    // ワット回収
    pushButton(Button::A, 1000);
    pushButton(Button::B, 1000); // ここをBにすることで、月が変わった際にキャンセルできず詰んでしまう問題をスマートに解決できる
    pushButton(Button::A, 1000);
}

// マイコンのセット時に1度だけ行われる処理
void setup(){
    // Switchがマイコンを認識するまでは信号を受け付けないため、適当な処理をさせておく
    pushButton(Button::B, 500, 5);
    // 巣穴をチェックする
    pushButton(Button::A, 1000);
}

// ここに記述した内容がループされ続ける
void loop(){
    execWattGainSequence();
}
/**
 * 巣穴からワットを回収し続けるスケッチ
 *
 * 初期条件は以下の通り
 * 1.願いのかたまりを投げ入れた巣穴の前にいること
 * 2.巣穴のワットは回収済みであること
 * 3.インターネットで時間をあわせるがOFFになっていること
 * 4.オフライン状態であること
 * 5.無線のコントローラーが接続されていないこと
 * 6.「設定」から「話の速さ」を「速い」にしておくこと
 */

// ライブラリを読み込むためのコード
#include <NintendoSwitchControlLibrary.h>

// ワットを回収するシーケンス
void execWattGainSequence() {
    // 募集開始
    pushButton(Button::A, 3000);
    // ホーム画面 > 設定
    pushButton(Button::HOME, 500);
    pushHat(Hat::DOWN, 25);
    pushHat(Hat::RIGHT, 25, 5);  // SwitchのVer11〜に対応。11未満の場合は、最後の5を4にする必要がある
    pushButton(Button::A, 100);
    // 設定 > 本体 > 日付と時刻
    holdHat(Hat::DOWN, 2000);
    pushHat(Hat::RIGHT, 25);
    pushHat(Hat::DOWN, 25, 4);
    pushButton(Button::A, 200);
    // 日付と時刻 > 現在の日付と時刻
    pushHat(Hat::DOWN, 25, 2);
    pushButton(Button::A, 500);
    pushHat(Hat::RIGHT, 25, 2);
    pushHat(Hat::UP, 25);
    pushHat(Hat::RIGHT, 25, 3);
    pushButton(Button::A, 50);
    // ホーム画面 > ゲーム画面
    pushButton(Button::HOME, 600);
    pushButton(Button::A, 600);
    // レイド募集中止
    pushButton(Button::B, 1000);
    pushButton(Button::A, 4000);
    // ワット回収
    pushButton(Button::A, 1000);
    pushButton(Button::B, 1000);  // ここをBにすることで、月が変わった際にキャンセルできず詰んでしまう問題をスマートに解決できる
    pushButton(Button::A, 1000);
}

// マイコンのセット時に1度だけ行われる処理
void setup() {
    // Switchがマイコンを認識するまでは信号を受け付けないため、適当な処理をさせておく
    pushButton(Button::B, 500, 5);
    // 巣穴をチェックする
    pushButton(Button::A, 1000);
}

// ここに記述した内容がループされ続ける
void loop() {
    execWattGainSequence();
}

設定の確認

マイコンを繋げる前に、以下の状態になっていることを確認してください。

  1. 願いのかたまりを投げ入れた巣穴の前にいること
  2. 巣穴のワットは回収済みであること
  3. インターネットで時間をあわせるがOFFになっていること
  4. オフライン状態であること(機内モード推奨
  5. 無線のコントローラー(プロコンなど)が接続されていないこと
  6. 「設定」から「話の速さ」を「速い」にしておくこと

最後に

数時間放置しても問題なく動作していたため、安定性に関してはおそらく大丈夫かと思います。

ですが、万一ループから抜けてしまうようなことがありましたら、@lefmarnaまでお知らせください。

スポンサーリンク