【ポケモン剣盾】Arduinoを用いた羽回収の自動化

##0.はじめに
・Arduino IDEを用いて作成したポケモン剣盾自動化プログラムを個人的なメモ書き程度で公開します

・マイコンの導入方法に関しては既に多くの方が分かりやすく説明されてますので省略します



##1.概要
橋に落ちてる羽をひたすら回収するプログラムです
~~皆さんも既にワット所持金ドーピングアイテムがカンストしてると思いますが、~~ドーピングだけじゃ努力値振りが完結しないことが多々あります。だったら細かい調整が効く羽もカンストさせちゃおう！という目的で作りました


##2.スケッチ

```ruby:

#include <SwitchControlLibrary.h>

void setup(){

// 開始直後のズレ調整
PressA();
PressA();
}


void loop() {

// 1つ目
  SwitchControlLibrary().MoveLeftStick(254,134);
  delay(3050);
  SwitchControlLibrary().MoveLeftStick(128,128);
  delay(500);
  PressA(); //Aを3回押す

// 2つ目
  SwitchControlLibrary().MoveLeftStick(255,80);
  delay(1900);
  SwitchControlLibrary().MoveLeftStick(128,128);
  delay(500);
  PressA();
  
// 3つ目
  SwitchControlLibrary().MoveLeftStick(254,155);
  delay(1550);
  SwitchControlLibrary().MoveLeftStick(128,128);
  delay(500);
  PressA();
  
// 4つ目
  SwitchControlLibrary().MoveLeftStick(255,167);
  delay(1330);
  SwitchControlLibrary().MoveLeftStick(128,128);
  delay(500);
  PressA();

// 5つ目
  SwitchControlLibrary().MoveLeftStick(255,35);
  delay(820);
  SwitchControlLibrary().MoveLeftStick(128,128);
  delay(500);
  PressA();

// 6つ目
  SwitchControlLibrary().MoveLeftStick(255,152);
  delay(2651);
  SwitchControlLibrary().MoveLeftStick(128,128);
  delay(500);
  PressA();

// 7つ目
  SwitchControlLibrary().MoveLeftStick(255,60);
  delay(1792);
  SwitchControlLibrary().MoveLeftStick(128,128);
  delay(500);
  PressA();

// 8つ目
  SwitchControlLibrary().MoveLeftStick(255,205);
  delay(1900);
  SwitchControlLibrary().MoveLeftStick(128,128);
  delay(500);
  PressA();

// 9つ目
  SwitchControlLibrary().MoveLeftStick(255,80);
  delay(1885);
  SwitchControlLibrary().MoveLeftStick(128,128);
  delay(500);
  PressA();

// 10つ目
  SwitchControlLibrary().MoveLeftStick(255,205);
  delay(975);
  SwitchControlLibrary().MoveLeftStick(128,128);
  delay(500);
  PressA();
  delay(300);

//時間変更
  SwitchControlLibrary().PressButtonHome();
  delay(50);
  SwitchControlLibrary().ReleaseButtonHome();
  delay(400);
  SwitchControlLibrary().MoveHat(4); // down
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(75);
  SwitchControlLibrary().MoveHat(2); // right
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(75);
  SwitchControlLibrary().MoveHat(2); // right
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(75);
  SwitchControlLibrary().MoveHat(2); // right
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(75);
  SwitchControlLibrary().MoveHat(2); // right
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(75);
  SwitchControlLibrary().PressButtonA();
  delay(50);
  SwitchControlLibrary().ReleaseButtonA();
  delay(850);
  // 設定画面
  SwitchControlLibrary().MoveHat(4); // down
  delay(1300);
  SwitchControlLibrary().MoveHat(8); // center
  delay(50);
  SwitchControlLibrary().MoveHat(2); // right
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(50);
  SwitchControlLibrary().MoveHat(4); // down
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(50);
  SwitchControlLibrary().MoveHat(4); // down
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(50);
  SwitchControlLibrary().MoveHat(4); // down
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(50);
  SwitchControlLibrary().MoveHat(4); // down
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(50);
  SwitchControlLibrary().PressButtonA();
  delay(50);
  SwitchControlLibrary().ReleaseButtonA();
  delay(260);
  // 時間設定
  SwitchControlLibrary().MoveHat(4); // down
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(50);
  SwitchControlLibrary().MoveHat(4); // down
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(50);
  SwitchControlLibrary().PressButtonA();
  delay(50);
  SwitchControlLibrary().ReleaseButtonA();
  delay(300);
  // 時間の変更　進める
  SwitchControlLibrary().MoveHat(2); // right
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(50);
  SwitchControlLibrary().MoveHat(2); // right
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(50);
  SwitchControlLibrary().MoveHat(0); // up
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(110);
  SwitchControlLibrary().PressButtonA();
  delay(50);
  SwitchControlLibrary().ReleaseButtonA();
  delay(50);
  SwitchControlLibrary().PressButtonA();
  delay(50);
  SwitchControlLibrary().ReleaseButtonA();
  delay(50);
  SwitchControlLibrary().PressButtonA();
  delay(50);
  SwitchControlLibrary().ReleaseButtonA();
  delay(50);
  SwitchControlLibrary().PressButtonA();
  delay(50);
  SwitchControlLibrary().ReleaseButtonA();
  delay(125);

  SwitchControlLibrary().PressButtonHome();
  delay(50);
  SwitchControlLibrary().ReleaseButtonHome();
  delay(750);
  SwitchControlLibrary().PressButtonA();
  delay(50);
  SwitchControlLibrary().ReleaseButtonA();
  delay(1000);

  SwitchControlLibrary().PressButtonX();
  delay(100);
  SwitchControlLibrary().ReleaseButtonX();
  delay(500);
  SwitchControlLibrary().PressButtonA();
  delay(100);
  SwitchControlLibrary().ReleaseButtonA();
  delay(2500);

  SwitchControlLibrary().MoveLeftStick(255,0);
  delay(50);
  SwitchControlLibrary().MoveLeftStick(128,128);
  delay(300);

  SwitchControlLibrary().PressButtonA();
  delay(200);
  SwitchControlLibrary().ReleaseButtonA();
  delay(300);
  SwitchControlLibrary().PressButtonA();
  delay(200);
  SwitchControlLibrary().ReleaseButtonA();
  delay(3500);

}

//Aボタンを3回押して離す
void PressA(){
  
  SwitchControlLibrary().PressButtonA();
  delay(100);
  SwitchControlLibrary().ReleaseButtonA();
  delay(100);
  SwitchControlLibrary().PressButtonA();
  delay(100);
  SwitchControlLibrary().ReleaseButtonA();
  delay(100);
  SwitchControlLibrary().PressButtonA();
  delay(100);
  SwitchControlLibrary().ReleaseButtonA();
  delay(100);
  
  }
```


##3.実行の前準備
①育て屋の前に空を飛ぶで移動します
②自転車に乗ります
③マイコンを接続して回収開始！

※育て屋の建物から出た位置で開始するとズレます
※メニューを開いた時に空を飛ぶを選択してること
※ランクマバグによる日付変更のペナルティ回避前提です


##4.一応簡単なスケッチの解説
今回はSwitchの左スティックでの移動になるわけですが”MoveLeftStick(x,y)”というものを使います。x,yはそれぞれ0~255までの数字で指定でき、中央が(x,y)=(128,128)となります。

ここで注意しておきたいのがこの座標、yの0の位置が数学でよく見るxy座標の向きと逆になっています。つまり

(x,y)=(128,255)で下
(x,y)=(128,0)で上

となります。

今回はこれに気を付けて地道に向きとdelayの時間を調整していきました。
羽の真上まで移動してAを3回押す動作を10回繰り返すだけです。
拾い終えたらいつも通り時間変更をして空を飛ぶだけです。



####◯参考
1時間で全部で800枚弱回収できます。
1種類あたり1時間で100枚ちょっとといったところでしょうか。

また31日→1日は復活しないので無駄走りになりますがループは崩れないので気にしてません(気が向いたら対処するかもしれません)


##5.終わりに
他の自動化は多々あれど羽集めはまだ少ないといった現状への一助になればと思い投稿させていただきました
是非羽をカンストさせて快適な育成環境を作り上げて頂けたらと思います

それではこの記事を開いてくれた方、最後まで読んでくれた方、ありがとうございました


何か御座いましたらコメント欄、もしくはTwitter @mega_ringuma までよろしくお願いします