2021/11/23

【BDSP×Arduino01】孵化厳選自動化 (自転車グルグル)

 ※本記事は、ポケモンBDSPの預かり屋での孵化厳選を自動化するプログラムについて解説した記事です。ポケモンBDSPの操作をArduino Leonardoで自動化しております。「Arduinoって何?」って方は剣盾の00回目の記事を、Arduinoの環境構築(ライブラリ含む)は01回目の記事をご覧ください。

 

このプログラムは、過去にポケモン剣盾用に作成した孵化厳選プログラムを、BDSP用に改変したプログラムです。基本的な動作は剣盾第08回の記事と同様となります。

 

2021/11/27追記: Ver.1.1を公開。孵化にかかる時間の設定を修正。また、一部環境でSwitch本体のスリープがうまくいっていなかったので修正。

 

本記事では、このプログラム(スケッチ)でできることや原理を解説したうえで、スケッチを配布しています。とにかくスケッチが欲しいという方は下へと読み飛ばしてください。


 

きっかけ、動機

ポケモンBDSP購入、とりあえず殿堂入りしました。ランクマッチや証厳選のようなやり込み要素は少ないので今のところはやり込むつもりも自動化しまくるつもりもありません。

・・・が、伝説捕獲などの準備にあたって孵化くらいはしようかと思いました。剣盾の厳選環境に慣れ過ぎた今となってはDP時代の孵化厳選があまりにも苦労なため自動化します。



これで何ができるの?

主な動作は剣盾第08回の記事と同様となります。新しいタマゴを貰う→1個ずつ孵化、ではなく、貰い続ける→5個ずつまとめて孵化、を繰り返します。また、今回は孵化ロードを直線上に進むのではなく、スティックをグルグル回す動作で歩数を稼ぎます。

自動化する1番のメリットは、コントローラーのLスティックを消耗させないことかもしれません。


原理、おおまかな流れ

概要

主な動作は剣盾第08回の記事と同様に、預かり屋からタマゴを受け取り、それを孵化させます。

 

フィールド上での動きについて

ダイパリメイクにあたり、ドットの原作DPと同様にズイタウンや209、210番道路には上下一直線が長く続く1本道、通称 孵化ロードがあります・・・が、今作は直線に自転車を走らせるよりも、スティックをグルグル回して斜め移動も駆使する方が歩数を多く速く稼げます。そこで今回は、直線ではなくスティックをグルグル回すことで孵化を行います。

なお、預かり屋の正面すぐのフェンス左下にてこの動作を行います。これによりタマゴの受け取りもすぐ近くで行うことができ、空を飛ぶなどによる定期的な位置調整も必要ありません。

 

その他の動作について

上記の移動方法以外は剣盾第08回の記事と同様です。詳しくはこちらをどうぞ。

なお、剣盾とのボックス面での違いとして、捕まえたポケモンやもらったタマゴなどは常にボックス1から優先されて詰められます。なので、必ず自動化開始前に表示するボックスはボックス1にしてください。

 

準備、必要なもの

本スケッチでは、マイコンを挿す前に以下の準備が必要となります。

1.自転車をプラスボタンの上方向に登録(あるいは任意の位置となるように下記プログラムを書き換え)

2.育て屋(はらっぱ)にあらかじめタマゴができる組み合わせを預ける(まずまず以上を推奨)

3.手持ちポケモンの先頭を「炎のからだ」などの特性持ちのポケモン、2-6番目を適当なポケモン(タマゴ以外)にする

4.タマゴを孵化させるためのボックス数を、本スケッチの GOAL に指定する。
 伴って、GOALと等しい数の、ボックス1から始まるBOXを空にし、さらに1つ前のBOXに空きを5匹分以上空ける(手持ち2-6番目が入る予定)

5.空にしたボックス1を表示した状態でBOXを閉じる

6.Xボタンを押したメニュー画面で「ポケモン」が左上、「タウンマップ」が左下にあるように並び替える

7.自転車のギアはマッハの状態にする(ダートの場合はBボタンを押して切り替える)

8.設定について、テキストスピードを速い、ボックスへ自動で送る、ニックネーム登録しないを選択

 

作成したスケッチ

作成したスケッチはこちら。ver1.1。

2021/11/27追記: Ver.1.1を公開。孵化にかかる時間の設定を修正。また、一部環境でSwitch本体のスリープがうまくいっていなかったので修正。

本スケッチを実際に使用した動画はこちら↓


 
/**
* BDSP用、タマゴの回収、孵化を自動化。
* 育て屋正面のフェンス左下の角にてスティックをグルグルさせて歩数を稼ぎ、タマゴをもらう。
* 一定個数集まったら5個ずつ手持ちに加えて孵化を開始する。
*
* 初期条件は以下の通り
* 1.自転車をプラスボタンの上に登録(あるいは任意の位置となるように下記プログラムを書き換え)
* 2.育て屋(はらっぱ)にあらかじめタマゴができる組み合わせを預ける(まずまず以上を推奨)
* 3.手持ちポケモンの先頭を「炎のからだ」などの特性持ちのポケモン、2-6番目を適当なポケモン(タマゴ以外)にする
* 4.タマゴを孵化させるためのボックス数を、本スケッチの GOAL に指定する。
*  伴って、GOALと等しい数の、ボックス1から始まるBOXを空にし、さらに1つ前のBOXに空きを5匹分以上空ける(手持ち2-6番目が入る予定)
* 5.空にしたボックス1を表示した状態でBOXを閉じる
* 6.Xボタンを押したメニュー画面で「ポケモン」が左上、「タウンマップ」が左下にあるように並び替える
* 7.自転車のギアはマッハの状態にする(ダートの場合はBボタンを押して切り替える)
* 8.設定について、テキストスピードを速い、ボックスへ自動で送る、ニックネーム登録しないを選択
*/

#include <auto_command_util.h>

int box_count = 0;

//消費するbox数を入力(×30個のタマゴを孵化)
#define GOAL 1

// 卵を持って自転車で往復し、「おや?」とメッセージが出るまでの時間(秒)を設定
// ココドラ(8960歩/2)の場合305秒程度
// 360×[孵化させるポケモンの孵化歩数(MAX10240)]/10240くらいを目安に設定

const int TIME_TO_HATCHING_SEC = 360;


// ラテラルタウンのジムチャレンジ、乗り物をRスティック回転でまわずための関数、をLスティック用に流用
// 「1秒あたりの回転数(round/sec)*10」、「回転させる時間(ミリ秒)」、「回転方向(時計回りなら1/反時計なら-1)」をそれぞれ指定する
// ~(50, 3000, -1);の場合、反時計回りに5.0 round/secを3秒間(3秒で15回転)行う
// 回転数は100を割り切れる数でない場合はずれるため注意
// 開店時間のうち1周に満たない端数は切り捨てる

void guruGuruLeft(int drps, int msec, int direc){
    // 残り時間
    int jikan = msec;
    // 1回転あたりにかかる時間(ms)/10(cs)
    int cspr = 1000/drps;
    // 残り時間が1回転当たりの時間を上回る限り、1回転ずつ時間を消費する
    while(jikan >= cspr*10){
      // 1回転を10分割して入力する
      SwitchController().setStickTiltRatio(0, -100, 0, 0);
      delay(cspr);
      SwitchController().setStickTiltRatio(59 * direc, -81, 0, 0);
      delay(cspr);
      SwitchController().setStickTiltRatio(95 * direc, -31, 0, 0);
      delay(cspr);
      SwitchController().setStickTiltRatio(95 * direc, 31, 0, 0);
      delay(cspr);
      SwitchController().setStickTiltRatio(59 * direc, 81, 0, 0);
      delay(cspr);
      SwitchController().setStickTiltRatio(0, 100, 0, 0);
      delay(cspr);
      SwitchController().setStickTiltRatio(-59 * direc, 81, 0, 0);
      delay(cspr);
      SwitchController().setStickTiltRatio(-95 * direc, 31, 0, 0);
      delay(cspr);
      SwitchController().setStickTiltRatio(-95 * direc, -31, 0, 0);
      delay(cspr);
      SwitchController().setStickTiltRatio(-59 * direc, -81, 0, 0);
      delay(cspr);
      jikan = jikan - cspr *10;
    }
}

// こちらは回りながらA連打。1回転あたり1回のA押し離し
// こちらは長時間の使用により、左下への移動を少し長め

void guruGuruLeftWithA(int drps, int msec, int direc){
    // 残り時間
    int jikan = msec;
    // 1回転あたりにかかる時間(ms)/10(cs)
    int cspr = 1000/drps;
    // 残り時間が1回転当たりの時間を上回る限り、1回転ずつ時間を消費する
    while(jikan >= cspr*10){
      // 1回転を10分割して入力する
      SwitchController().setStickTiltRatio(0, -100, 0, 0);
      SwitchController().pressButton(Button::A);
      delay(cspr-3);
      SwitchController().setStickTiltRatio(59 * direc, -81, 0, 0);
      delay(cspr);
      SwitchController().setStickTiltRatio(95 * direc, -31, 0, 0);
      delay(cspr);
      SwitchController().setStickTiltRatio(95 * direc, 31, 0, 0);
      delay(cspr+3);
      SwitchController().setStickTiltRatio(59 * direc, 81, 0, 0);
      delay(cspr+3);
      SwitchController().setStickTiltRatio(0, 100, 0, 0);
      SwitchController().releaseButton(Button::A);
      delay(cspr+3);
      SwitchController().setStickTiltRatio(-59 * direc, 81, 0, 0);
      delay(cspr);
      SwitchController().setStickTiltRatio(-95 * direc, 31, 0, 0);
      delay(cspr);
      SwitchController().setStickTiltRatio(-95 * direc, -31, 0, 0);
      delay(cspr-3);
      SwitchController().setStickTiltRatio(-59 * direc, -81, 0, 0);
      delay(cspr-3);
      jikan = jikan - cspr *10;
    }
}

// 空を飛ぶを使うためにマップを開く
void openMap(){
    pushButton(Button::X, 1000);
    pushButton(Button::PLUS, 1200);
}

// カーソルの位置へ空を飛ぶ
void selectFlyingPoint(){
    pushButton(Button::A, 1000, 3);
    pushButton(Button::B, 1000, 7);
}

// ズイタウンからズイタウンへ空を飛ぶ
void flyingFromZui(){
    openMap();
    selectFlyingPoint();
}

// ズイタウンポケセンから育て屋のフェンスまで移動する
void meetBreeder(){
    // ポケセンから上に9,左に10歩の育て屋さんのところまで徒歩で移動
    // 左へ5歩程度移動

    pushHatButtonContinuous(Hat::LEFT, 1300);
    delay(500);
    // 上へ方向転換のみ
    SwitchController().pressHatButton(Hat::UP);
    delay(50);
    SwitchController().releaseHatButton();
    delay(500);
    // 正確に上へ8歩移動
    pushHatButton(Hat::UP, 300, 8);
    // ここで自転車に乗る
    pushButton(Button::PLUS, 1200);
    // ここでは大切なもの登録の上に設定。各自で要変更。
    pushHatButton(Hat::UP, 500);
    // 左へ5移動、フェンスにぶつかるまで
    pushHatButtonContinuous(Hat::LEFT, 1500);
    delay(500);
}


// ズイタウンポケセンから育て屋さんに移動し卵を受け取る
// 育て屋建物出てすぐ、左下のフェンスの角からスタート

void getEggFromBreeder(){
    // 15秒グルグル
    guruGuruLeft(40, 15000, -1);
    // 位置調整のため左下へ
    tiltJoystick(-80, 80, 0, 0, 1000);
    // フェンス左下から、育て屋爺さんまで右上移動
    SwitchController().setStickTiltRatio(90, -45, 0, 0);
    pushButton(Button::A, 100, 15);
    SwitchController().setStickTiltRatio(-90, 45, 0, 0);
    // タマゴをもらう、その後左下角へ戻る
    pushButton(Button::A, 100, 40);
    SwitchController().setStickTiltRatio(0,0, 0, 0);
    delay(500);
    
}

// メニューを開き、BOXを開く
void openBox(){
    // ボックスを開く、メニューのカーソルはあらかじめ「ポケモン」を「マップ」の真上にする
    pushButton(Button::X, 1000);
    pushHatButtonContinuous(Hat::UP, 1500);
    pushButton(Button::A, 2000);
    pushButton(Button::R, 2000);
    //範囲選択モードに
    pushButton(Button::Y, 300, 2);
}

// openBox後、孵化した手持ちのポケモンを預ける
// box_line : 何列目にポケモンを預けるか

void changeHatchedPoemonInBox(int box_line){
    // box_lineが0以外であれば、孵化した手持ちを(line-1)列目に置き、line 列目にカーソル合わせ
    if(box_line>0){
        // 手持ちの孵化したポケモンを範囲選択
        pushHatButton(Hat::LEFT, 300);
        pushHatButton(Hat::DOWN, 300);
        pushButton(Button::A, 500);
        pushHatButtonContinuous(Hat::DOWN, 2000);
        pushButton(Button::A, 500);
        // ボックスに移動させる
        pushHatButton(Hat::RIGHT, 300, box_line);
        pushHatButton(Hat::UP, 300);
        pushButton(Button::A, 500);
        //隣のラインの卵にカーソル
        pushHatButton(Hat::RIGHT, 300);
    }
    //box卵を範囲選択
    pushButton(Button::A, 500);
    pushHatButton(Hat::DOWN, 300, 4);
    pushButton(Button::A, 500);
    //手持ちに移動させる
    pushHatButton(Hat::LEFT, 300, box_line+1);
    pushHatButton(Hat::DOWN, 300);
    pushButton(Button::A, 500);
    // ボックスを閉じる
    pushButton(Button::B, 1500, 3);
}

//手持ちをボックスに詰めて置き、次のボックスへ移る
void temochiOkizari(){
    // 手持ちの孵化したポケモンを範囲選択
    pushHatButton(Hat::LEFT, 300);
    pushHatButton(Hat::DOWN, 300);
    pushButton(Button::A, 500);
    pushHatButtonContinuous(Hat::DOWN, 2000);
    pushButton(Button::A, 500);
    //ボックス一覧へ
    pushHatButton(Hat::UP, 300, 3);
    pushHatButton(Hat::RIGHT, 300);
    pushButton(Button::A, 500);
    // 端詰でおいていく
    pushButton(Button::A, 500);
    pushButton(Button::B, 500);
    // ボックスを移動
    pushButton(Button::R, 2000);
    // ボックスを閉じる
    pushButton(Button::B, 1500, 3);
}

// 孵化シーケンスを実行、ポケセン前から開始
void execHatchingSequence(){
    for(int box_line=0; box_line<6; box_line++){
        // ボックスを開き、孵化したポケモンを次のタマゴと入れ替える
        openBox();
        changeHatchedPoemonInBox(box_line);
        // 設定された時間+100秒のあいだ、ぐるぐる
        for(int t = 0; t < TIME_TO_HATCHING_SEC + 100; t++){
          guruGuruLeftWithA(40, 1000, -1);
        }
       
// 孵化が終わったら、左下へ進み続ける
        SwitchController().setStickTiltRatio(-80, 80, 0, 0);
        pushButton(Button::A, 100, 50);
        SwitchController().setStickTiltRatio(0, 0, 0, 0);
        delay(500);
    }
}

void sleepNow()
{
  SwitchController().pressButton(Button::HOME);
  delay(1500);
  SwitchController().releaseButton(Button::HOME);
  pushButton(Button::A, 1000);
  while(true){
    delay(60000);
  }
}

void setup(){
    //画面起動    
    pushButton(Button::B, 300, 12);
    // ズイタウンからスタート、空を飛ぶ
    flyingFromZui();
    // 育て屋出てすぐ、フェンス左下角へ移動
    meetBreeder();
    // タマゴ回収を行わない場合は以下をコメントアウト↓↓↓
    // タマゴ回収をボックスの数×30

    for(int egg_num=0; egg_num< 30*GOAL; egg_num++){
      getEggFromBreeder();
    }
    //受け取り終えたら、初期手持ちを1つ前のボックスにおいていく
    openBox();
    pushButton(Button::L, 1000);
    temochiOkizari();
    //1度ボックスを閉じる
    // タマゴ回収を行わない場合は以上をコメントアウト↑↑↑

}

void loop(){
    if (box_count >= GOAL) {
    sleepNow();
    }
    else {
    //30個孵化、ボックス移動
    execHatchingSequence();
    openBox();
    temochiOkizari();
    box_count++;
    //boxcount増加
    }
    
}

 

最後に

本スケッチを使用することで、ある程度効率よく孵化厳選が可能となります。理想個体の厳選、あるいは色違いの厳選にお役立てください。


剣盾なら150秒くらいで済んでたタマゴの孵化に360秒かかるって、しんどいなぁというのが本音。剣盾の快適さに慣れた後の数世代前の厳選環境はきつい。

プログラムの不備、改善点などありましたらコメントやお問い合わせからお願いいたします。

Arduino Arduino Leonardo (ピンソケット・ピンヘッダ実装済) 【A000057】
by カエレバ

 

75 件のコメント:

  1. 素晴らしいプログラムをありがとうございます.お陰様で厳選が捗っています.
    一点,気づいた点があるので報告します.+100秒ぐるぐるのfor文で+450秒になっています.

    また,終了後にsleepNow();が繰り返されて画面がついたり消えたりするので,フラグを設けて終了したら「sleepNow(); -> delayの無限ループ」とし,画面が消えるように変更して使用しています.

    何かの参考になれば幸いです.

    返信削除
    返信
    1. 報告ありがとうございます。報告通り、プログラムにミスがありましたのでVer1.1を修正版として公開しました。
      450秒については作成途中の数字が修正されていませんでしたので、+100に修正しました。
      sleepNowについて、Type-Cにマイコンを挿したときに起動を繰り返すのを確認しました。switchドックを使っていると電源が切れた時点でマイコンの動作も止まるため気づいておりませんでした。delayの無限ループを追加しました。

      削除
  2. こちらのプログラムはArduino uno でも使用可能でしょうか?

    返信削除
    返信
    1. コンパイルしてHEXファイルを出力してそのHEXファイルをUNOに書き込めば使えるかと思います

      削除
  3. よくみると、記事に使用不可と書かれておりました。すみません。

    返信削除
  4. 孵化歩数が10240の場合はどこを調節すればいいですか?

    返信削除
    返信
    1. 初期設定が最大歩数の10240なので調整不要です

      削除
    2. 通りすがり さん、返信ありがとうございます。
      初期設定が10240用にしているので調節不要です。歩数が少ない場合は
      const int TIME_TO_HATCHING_SEC = 360;の数字を調節してください。

      削除
  5. このコメントは投稿者によって削除されました。

    返信削除
  6. Found programmer: Id = "�����"; type = �
    Software Version = �.�; Hardware Version = �.�
    avrdude: error: buffered memory access not supported. Maybe it isn't
    a butterfly/AVR109 but a AVR910 device?
    avrdude: initialization failed, rc=-1
    Double check connections and try again, or use -F to override
    this check.

    avrdude: error: programmer did not respond to command: leave prog mode
    avrdude: error: programmer did not respond to command: exit bootloader
    と表示されました。何がうまくいかなかったのでしょうか。

    返信削除
    返信
    1. エラーメッセージを読む限り、「起動直後に読み込むプログラムにアクセスできない、デバイス間違えてない?」みたいです。
      まずは、使っているマイコンがArduino Leonardo(ATmega32u4)であるかを確認してください。(Arduino UNOなどと間違えてないか)
      Leonardoで間違いない=デバイスが正しいのであれば、次にIDEの設定を確認してください。IDE左上の「ツール」内、「ボード」と「シリアルポート」について、マイコンを挿したときにそれぞれ「Arduino Leonardo」「COM〇(おそらく1以外の数字、3など)」で認識しているか確認してください。異なるようであれば設定してください。
      それでもダメなら、その下にある「書き込み装置」が「AVRISP mkII」になっているか確認、設定してください。

      削除
  7. マイコンをスイッチにさしても認識してもらえず、
    board.txtも書き換えサイトの手順はすべて行っているのですが
    c:\Arduino\libraries\NintendoSwitchControlLibrary-master」に、無効なライブラリ「Missing 'maintainer' from library」があります。
    と表示されてしまいます。
    ボード情報の取得をしても書き換えた文字列にならず、なにか必要な手順がございますでしょうか。

    返信削除
    返信
    1. おそらくマイコンに書き込めておらず、ライブラリ関連のエラーで中断されているのかと思います。
      「Missing...」をメッセージ通り解釈するのであれば、ライブラリの情報にmaintainer(保守者)情報が欠落しているということになります。Nintendo...-masterフォルダ内に「example」「src」フォルダ、README.mdともう1つ[library.properties]というファイルがあるかと思います。このファイルをテキストエディタで開き、
      https://github.com/interimadd/NintendoSwitchControll/blob/master/library.properties
      と一致しているか確認してください(特にmaintainer=のところ)。
      あとは、試しにNintendo...-masterフォルダを1度削除し、DL&解凍しなおしたものを同じところ(Cドライブ直下)か、「ドキュメント」内にあるArduino>librariesフォルダに入れてみてください。

      削除
    2. ご返信ありがとうございます。
      エラーメッセージは消えたのですが依然としてスイッチ本体にさしても通電するだけでして、コントローラーとして認識してもらえてないようです。
      ボード情報を取得しても以下のように表示され
      BN: Arduino Leonardo
      VID: 2341
      PID: 8036
      ボード情報が書き換わっていないようです。

      削除
    3. ツール→ボード:"Aruduino Leonald"→ボードマネージャ...→Aruduino AVR BoardsまでいってAruduino AVR Boardsのバージョンを1.8.3に下げたら動くかもしれません。

      削除
    4. このスケッチで使用してるライブラリはNintendoSwitchControll-master
      あなたが使ってるライブラリとは別物です

      削除
  8. 無駄にある余り卵を孵化させたいのですが
    【卵回収を行わない場合は以下をコメントアウト】
    のところをコメントアウトし
    ➝ボックス1を卵で埋める
    ➝手持ちは5匹あけておく

    の手順で行えばいいかと思ったのですが
    問題が発生していて

    自転車に乗ってくれない
    次の卵孵化に移ってくれないじょうたいです


    どのようにしたらいいのでしょうか





    返信削除
    返信
    1. プログラミングよくわかってないですが
      なんとか孵化させるだけの方法は
      自己解決できましたので共有です。

      自転車はなぜか登録が外れているだけでした
      また、タマゴ回収を行わない場合は
      「以上をコメントアウト」
      の、上にある
      openbox
      pushbutton
      temochokizari
      というのをコメントアウトせずにいたら
      余ったタマゴ孵化をボックス単位で自動化できるようになりました

      手順は
      手持ち埋めた状態
      ボックス1を卵で一杯に
      育て屋に何も預けない

      お騒がせしました

      削除
    2. 自己解決したようで良かったです。
      推測ですが、1つ目のコメントでの「次の卵孵化に移ってくれない」は、自転車に乗ってくれない(登録されてなかった)ことにより孵化歩数が足りず、手持ちを入れ替えるべき段階で孵化ムービーが流れてしまっていたことにあるかと思います。
      おそらく手持ちを空で始めるのであればスケッチのコメントアウト箇所通りに、手持ちを埋めて始めるのであればopenbox以下3行を残して書き込めば動くかと思います。

      削除
  9. このコメントは投稿者によって削除されました。

    返信削除
  10. 卵を受け取る時間を指定したい(長くしたい)場合修正箇所は
    void getEggFromBreeder(){
    // 15秒グルグル
    guruGuruLeft(40, 15000, -1);
    の第2引数の部分でよろしかったでしょうか。
    40秒以上を指定するとぐるぐるをスキップして爺さんに話しかけに行ってしまします。
    (計算がおかしい?)
    卵受け取りの時間を40秒以上に指定する方法をご教授願いますでしょうか。

    返信削除
    返信
    1. 時間の変更箇所は合っています。15000の箇所を40000に変更してうまく動かないのはオーバーフローしているためかと思います。
      int型が16bit, -32768~32767あたりまでしか対応していないようです。40秒にしたい場合は、次の行にguruGuru…をもう1文追加し、30秒以内の範囲で時間を変更してください。

      削除
  11. Twitterでもご報告させていただきましたが、この記事に掲載されているプログラムを改変する事で色卵の作成に成功しました。ありがとうございました。

    返信削除
  12. 初めまして。
    先日こちらのプログラムを導入し利用させて頂いております。
    気になることがあるのですが、タマゴ回収中のグルグルが徐々に元の位置からずれていくことがあり、大抵はじいさんに話かける直前に左下の角に進むことで問題なくなるのですが、時々(特にBOX設定数が多いとき)に右上進行時にじいさんに接触せずに通過しズイの遺跡の方向に行っていることがあります。
    グルグルの位置ズレの原因など、何かお心当たりあれば教えて頂きたいです。
    マイコンはkeyestudioのarduino micro互換ボードで基本的には問題なく動作しております。
    ライブラリも読んでなんとなく秒数設定等をしているため自分でも改めて確認しようと思いますが、グルグル用の関数には触れていないと思います。

    返信削除
    返信
    1. もしかすると、グルグルしたあとに左下方向へ進むところで、柵にぶつかった時に移動が遅くなり、うまく左下角まで辿り着けていないことが考えられます。グルグルしたあと、[左下へ]と書かれている箇所(卵受け取りと孵化の2箇所)について、斜め移動の時間を増やすか、[下へ移動]、[左へ移動]の2動作に変更するかしてください。例えば、
      // 位置調整のため左下へ
      tiltJoystick(-80, 80, 0, 0, 1000);
      の1000を3000くらいにしてみてください。

      削除
    2. ご返信ありがとうございます。
      左下2動作への変更は思いつきませんでした。
      早速試してみようかと思います。

      削除
  13. 私のSwitchでは孵化を5BOX以上連続で行う設定で繋ぐとゲーム側でエラーが発生してゲームが落ちるので孵化は4BOXまでに抑えたほうがいいかと思います。
    卵の受け取りだけなら20BOXでも問題なく受け取れました。

    返信削除
    返信
    1. ご返信ありがとうございます。
      こちらは7BOX程度でも何度かうまくいっているのですが、今後何かあった際には気にしてみようと思います。

      削除
  14. コンパイルしようとすると
    auto_commnd_util.h:No such file or directory
    となり完了できません。
    なにか解決方法ありますか?

    返信削除
    返信
    1. 正しいディレクトリにauto_commnd_util.hを保存すれば可能

      削除
    2. 十二天将さんの通り、auto_commnd_util.hが正しく入っていないとのエラーです。NintendoSwitchControllライブラリのDLしたファイルの1つなので、NintendoSwitchControllライブラリのフォルダがlibrariesにあるか、解凍してあるか、その中にauto_commnd_util.hがあるか確認してください。

      削除
  15. ゲーム側がエラーで落ちる対策としてループする作業にズイタウンへ飛び、育て屋まで歩く動作を入れて運用してます。

    返信削除
  16. お疲れ様です。arduino初心者です。
    こちらの記事とyoutubeのほう拝見させていただきました。
    コメントでも同じような質問があったと思いますが、
    解決しなかったので質問いたします。
    マイコンに書き込みまではうまくいったのですが
    スイッチ(有機EL)に接続しても動き始めません。
    以下確認済み事項
    ・IDEのツールバーのボード、シリアルポートはleonardoになっています
    ・boardsの書き換えはサクラエディタを使用
    ・電源on直後に接続
    ・ほかのコントローラーは接続していません

    このほか確認する箇所などあれば教えていただきたいです。
    すみませんがよろしくお願いします。

    返信削除
    返信
    1. 書き込み時にエラーなどが出ない状態で動かないのであれば、boards.txt関係のミスの可能性が高いです。
      編集後、元の場所に置いたファイルを開き直し、leonardo.vidやleonardo.build.vid、同様にpidについてCtrl+Fキーで検索、すべて数字が変わっているか確認し直してください。

      削除
    2. 返信ありがとうございます。
      確認いたしました。
      vidは計5行0x0f0dに書き換えられています。
      pidは計5行0x0092に書き換えられています。

      削除
  17. 孵化にかかる時間は孵化サイクル×9と記載したほうが時間の計算は楽ですね。
    孵化サイクル5なら5×9で45
    孵化サイクル20なら20×9で180
    孵化サイクル40なら40×9で360

    返信削除
  18. 年末年始にしようさせていただきましたが、情報通り、5ボックス以上続けてしまうと落ちますね
    homeボタンを押したあとの動作も安定しないので、スリープの関数からhomeボタンを抜いて運用しています。
    プログラムを見ても原因が分かりませんが、homeを押す長さが足りない場合や、押したあとに何故かカーソルがぐるぐる動く場合があり、不具合の起こり方が変則的です。
    他の方も同様の現象は発生していますでしょうか?

    返信削除
    返信
    1. ゲームが落ちる対策としては
      loopの中にあるopenBOX();の上に
      flyingfromZui();
      meetbreeder();
      を追加すれば大丈夫です。
      挙動としては1BOXの孵化が終われば空を飛ぶをして預け屋の所まで歩き、孵化作業を開始します。

      削除
    2. 横から失礼致します。
      あれ以降私の方でも(その場を離れているので曖昧ですが)ゲームが途中で一度落ちている可能性があります。
      述べられていた対策を試してみようと思いますが、原因はなんなのでしょうか?

      削除
    3. エラーの発生原因は不明ですが、画面が真っ白になったのち、エラーが発生しましたとの表示が出てゲームが終了するのを確認してます。

      削除
    4. BOX数を増やすと立ち位置がズレる可能性は把握していましたが、ソフト自体のエラー落ちは見落としていました。
      マイコンで行う動作は人力でも可能な内容のみなので、エラー落ちはマイコン側の問題以前にソフト自体が不安定になるバグのようなものではないかと考えています。バグ?の起こる原因として考えられるのは
      ①ズイタウンに長居し過ぎ、②位置ズレで育て屋建物に誤入室→意図せず荒ぶり負荷がかかる、③A連打し過ぎ、あたりが浮かびます。そのうち①②の対策として、上にもあるように1BOXごとに空を飛ぶ(=マップ切り替え&位置調整)が有効なのかと思います。

      削除
    5. タマゴ受け取り自体は26BOX分の受け取りで長居していてもエラー落ちせずに問題無くできていましたので①は限りなく無いと思います。
      誤入室する事無く孵化作業を繰り返してもエラー落ちしたので②の可能性も無いです。
      ③の可能性はあると思います。

      削除
    6. お二方ご返信ありがとうございます。
      仰っていた通り空を飛ぶを挟むことで15BOX分問題なく孵化出来ました。
      タマゴ受け取りは出来ているあたりAの入力回数による影響という仮説は正しい気がします。
      また、確かめようがない上そんなことはないとは思うのですが、ソフト側で意図的に落としている可能性もあるかと思いました。

      削除
    7. メニューバグ対策でボタンの押し過ぎで落ちてる可能性はありますね。通常ならスティックぐるぐるしながらA連打はしないですから。

      削除
  19. このコメントは投稿者によって削除されました。

    返信削除
  20. とても素晴らしいプログラムを配布していただきありがとうございます
    おかげで厳選作業がはかどっています。

    前提条件で「ポケモンの名前を付けない」に設定しないとプログラムが正しく動作しないと思うので追記していただけるとありがたいです。(自分が名前を付けるをオンにしていたため正常に動作しなかったので・・・)

    すごい初歩的なことなのですがよろしくお願いいたします。

    返信削除
    返信
    1. ニックネーム登録しないに設定するととスケッチに書いてますけれど。

      削除
    2. 本当でした、自分の確認不足です申し訳ございません

      削除
  21. 最高の記事でした。ありがとうございます
    個人的な事ですが色タマゴ作成用にタマゴを受け取り終わった後にレポートを書きたいのですがどこに何を入れればいいか分かりません。
    もしよろしければご教授ください

    返信削除
    返信
    1. レポートを書くためのボタン操作をイメージして、そのボタンを押す操作をプログラムに書き加えればできるよ。
      実際にそういう改変したプログラム使ってるし。

      削除
    2. タマゴの受け取りはvoid setup内で行っていますので、括弧内の最後にメニューを開く(X)→Rボタンでレポートを開く→...のように文を追加してみてください。
      実際に手動でレポートを書く流れを動かしてみて、それをもとにボタンの回数や時間などを調整してください。

      削除
    3. temotiokizariの所で改行してその下に
      Xボタンを押す
      Rボタンを押す
      Aボタンを押す
      この3工程を行う文を書き込めばレポート書けます。

      削除
  22. 英語ROMで使用中に自転車乗った直後に上方向に進む不具合が発生したので、meetbreederの最後に下方向に進む操作を加えたところ正常に使えるようになりました。

    返信削除
    返信
    1. どうやら気づかないうちに便利ボタンの登録が1つだけになっていたのが不具合の原因だったようです

      削除
  23. いままでうまく動いていたのですが、孵化した個体をボックスに入れて卵を手持ちに入れる動作のところで、孵化した個体をボックスに入れる動作でなぜかラインが一つずれます。コードは変えていないので、なぜこのような挙動になるのか分かりません。何かハードやIDEの面で心当たりはないでしょうか。

    返信削除
    返信
    1. ラインが1つずれるというのは、手持ちをつかんで空白の場所に置くべき場面で、本来入れるべき列に対して左の列に置こうとして置けないということでしょうか?そうであれば、試しにchangeHatchedPoemonInBox内の入力ごとの待機時間を延ばしてみてください。

      削除
  24. 昨日からこちらのコードを使用し始めたのですが、動画のようにタマゴ回収ができない状況です。
    作成したスケッチからダウンロードしたinoファイルをそのまま書き込んで使用しています。

    状況として、空を飛んでポケモンセンターから預かり屋左下でグルグルしておじいさんに話しかけるまでは問題ないのですが、受け取ったときに先頭のポケモンとタマゴを交換してしまっていざ孵化の段階になるとバトルできるポケモンがいないという状況になり交換できずうまく孵化ができません。

    考えついている対策法としては受け取ったときにBボタンを挟むということぐらいです。
    皆さんはこういう修正を各自でされているものなんでしょうか?
    書き込み方法がおかしく正しく動いていないのかそれとも修正して使っているのか判断できていないので、教えていただければ幸いです。

    返信削除
    返信
    1. スケッチに書いてある初期条件ができていないだけだと思います。

      削除
    2. すいません、おっしゃる通りで自動でボックスに送る設定ができていませんでした。
      ありがとうございました。

      削除
  25. すいません、原因がわからなくなったので教えてください。
    昨日まで自動孵化が動作していることを確認できたのですが、今日孵化歩数の設定を変更して再度書き込みを行いSwitchに接続をすると自動孵化が始まりません。
    接続時にL,ONが点灯してその後一瞬だけRX,TXが点滅してその後は何も状況が変わりません。
    コントローラーを外した後に接続しても同様です。
    またArduino IDEでも「ボードへの書き込みが完了しました。」と記載されているのが確認できています。
    何か原因がわかりますでしょうか?

    返信削除
    返信
    1. マイコンの故障の可能性あり

      削除
    2. 故障以外の可能性としては、書き込みは問題なくできているようなので、boards.txtが正しく編集されているか確認しなおしてください。Arduino IDEが更新されている等の場合、boards.txtが上書き保存されているかもしれません。

      削除
    3. 十二天将さん
      ミドリカワセミさん
      返信ありがとうございます。

      やはり故障の可能性があるのですね・・・
      買ったばかりなのにという感想もあるのですが、むき出しのまま使っているので故障してもおかしくないなという感じです。

      IDEの更新も疑って再度boards.txtも確認してみましたが、更新日時や差分確認でも設定が変更されているような様子はありませんでした。

      もう一台マイコンを購入して試してみます。

      削除
    4. 新しくマイコンを購入しても同様の状況になって、色々と調べていました。
      ボード情報を取得してみると書き換えたはずのベンダーID(vid)とプロダクトIDが書き換えられていない状態でした。
      ログを追っていくと、
      C:\Users\\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.○○
      のboards.txtを参照しているようでした。
      中身を見てみると初期のままだったので、こちらを変更すると無事Switchで動くようになりました。
      何故こうなったのか分からないですが、今後ほかの人が同様の状況に陥った時のために対処の一例として記載しておきます。

      削除
  26. 始めまして。自分の環境だけかもしれませんが備忘録として書いておきます。

    1ボックス目を埋めて、次のボックスへ移動する際の挙動が怪しいです(temochiOkizari周り)
    具体的に申し上げると、二度目の"pushButton(Button::A, 500);"が認識されていないのか、孵化した手持ちをボックスへ置いてくれない状態。

    DelayTimeの調整でなんとか動くようになりましたが、バージョンの問題ですかね・・・?

    環境
    本体: Ver. 13.2.1
    ソフト: Ver. 1.1.3

    返信削除
  27. すみません、他のポケモンでは問題なく機能していたのですが、自分もココドラを孵化してみたら毎回孵化しないまま進んでしまうのですが、ココドラならそのままでいいんですよね?

    返信削除
    返信
    1. 追記孵化歩数を増やす場合360の部分をいじればいいんでしょうか?

      削除
    2. 360の部分をいじってください。ただし、360あれば全てのポケモンを孵化できる想定です。
      360に設定すればカビゴンやフカマル等の孵化歩数最大組(10240歩、サイクル40)を孵化できるように調整しているつもりです。公開している動画と動きが違わないか(歩数に差がでていないか)、ほのおのからだ/マグマのよろいの特性持ちポケモンを手持ちに入れているか確認してください。

      削除
    3. ココドラは8960歩、サイクル35の比較的孵化歩数が多いポケモンです。大半のポケモンであれば360の半分、180の設定でも孵化できるのに対して、ココドラは必要歩数が多かったために何らかの原因で孵化できていないと思われます。

      削除
    4. ヒードランを入れているので問題ないと思われます
      自転車も問題なしです
      コードもいじってないので問題なく。ver1.1
      考えられる原因がないため困っています
      今のところ孵化のために二周することになってしまっています

      削除
    5. 420に調節しても孵化できませんでした

      削除
    6. ヒードランの特性はほのおのからだ(夢特性)でしょうか?
      捕獲してから特性パッチを使用していないのであれば、基本的にはもらいび(通常特性)になっており、孵化歩数が減りません。ハードマウンテンでマグカルゴを捕まえる等してください。

      削除
    7. 途中でブビィからヒードランに変えたのが問題でした
      ありがとうございます

      削除
    8. 歩数を少なくしてみたら孵化したものをボックスに入れる際におかしくなります
      一列目を孵化した後に二列目に孵化したポケモンを入れようとしてばぐります

      削除
    9. こちらではそのような現象は確認できておらず、原因は分かりません。
      孵化したポケモンをボックスに移す動作は
      void changeHatchedPoemonInBox(~
      に従っています。原因箇所のボタン入力の間隔を長くしたり、回数を調整してみたりしてください。

      削除

【ポケモンSV×arduino06】道具プリンター乱数自動化(藍の円盤)

 ※本記事は、ポケモンSVの藍の円盤(DLC)にて、 道具プリンター を決まった日時に起動することで 特定のアイテム、ボールを狙って量産する操作を自動化 するプログラムについて解説した記事です。ポケモンSVの操作をArduino Leonardoで自動化しております。 本記事の内...