Arduinoを使ってポケモン剣盾の乱数調整の日付変更を自動化してみた

#はじめに
記事を書くのは初めてなので日本語がおかしいと思っても優しく見守ってください。
Arduino Leonardoを使ってポケモンの乱数調整を行う際に必要な日付変更を自動化してみました。最初はマクロコンを購入してやっていたのですが、目は疲れるしミスも多かったので自動でできないかなと思ったのがきっかけです。
#前提
まず前提として、Arduino(以下マイコン)をswitchに挿すとコントローラとして認識され、プログラム通り操作を行うことができる環境(マイコンにプログラム書きこみ、実行が可能)があることを前提にお話しします。前提までは他の方の記事を見たりしながら頑張ってください(Arduino IDEのインストールやライブラリの追加など)。どうしてもわからないときは連絡ください。可能な範囲でお答えできるかもしれません(当方Arduino歴はほとんどありません)。また、任天堂の利用規約(ライセンスなしのコントローラを使用してはいけない)に反する可能性があります。ご理解の上行ってください。私はこの記事を参考に行って起きた問題についての責任を一切負いかねます。
###必要なもの
・Arduino Leonardo(互換品でも可)
私の購入した互換品のURL載せておきます→(https://www.amazon.co.jp/keyestudio-Leonardo-R3開発ボード-USBケーブル-Arduinoと完全に互換性があります/dp/B0786LJQ8K/ref=sr_1_32?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=ZWEYUDMTJYA9&keywords=arduino+leonardo&qid=1580915388&sprefix=arduino+le%2Caps%2C271&sr=8-32)
・Arduino IDE
・パソコン
・USB変換端子
A→C変換、ダイソーなどに売っています。
・C言語の基礎知識
私のプログラムを書き換えたい人は理解が必要です。
#ソースコード
さっそくですが私が作成したソースコードになります。
1回変更するのにプログラムが長くなってしまったので
void oneDay();
void oneMonth();
void oneYear();
という関数にしました。
簡単に説明書きます。



```
  SwitchControlLibrary().PressButtonA();//Aボタンを押す
  delay(100);//0.1秒待つ
  SwitchControlLibrary().ReleaseButtonA();//Aボタンを離す
```
```
SwitchControlLibrary().MoveHat(6); // 左へ行く
  delay(50);//0.05秒待つ
  SwitchControlLibrary().MoveHat(8); // 真ん中に戻す
  delay(90);//0.09秒待つ
```
ちなみに
MoveHatの()の数字なんですが
360°を8等分して
0:上
1:右上
2:右
３:右下
4:下
5:左下
6:左
7:左上
8:真ん中(どこにも倒していない)
ってことだと思います(斜め(1,3,5,7)は使ったことないのでわからないですが)。
ちなみに遅延時間の設定なんですが1000で1秒です。
時間がバラバラですが、これは全動作間の遅延時間を最初0.05秒にしたのですが早くて私のswitchではうまく動かなかったので実際に試して最速で動くように調節した時間なのでもっと早く動かしたいという方は書き換えて最速で動くようにしてみてください。

```cpp:changeDay.ino
#include <SwitchControlLibrary.h>
int flag;//うるう年のカウント
int N;//2月の繰り返し回数
int count;//日を何回変えたかカウント
int last=10000;//ここに変更したい回数を指定(デフォルトだと10000回)
void setup(){
  
}
void loop() {
  for(int i=0;i<2;i++){
   SwitchControlLibrary().MoveHat(4); // down
   delay(500);
   SwitchControlLibrary().MoveHat(8); // center
   delay(500);
  }
  while(1){
//日数-1回の繰り返し
  for(int i=0;i<30;i++){//1月
    oneDay();
  }
  oneMonth();//月変更
  switch(flag){
  case 0://うるう年だったら
    N=28;
    break;
  case 1:case 2:case 3://うるう年じゃなかったら
    N=27;
    break;
    default:
    break;
  }
  for(int i=0;i<N;i++){//2月
    oneDay();
  }
  flag++;
  if(flag==4){//うるう年から3年経ったら
  flag=0;
  }
  oneMonth();//月変更
  for(int i=0;i<30;i++){//3月
    oneDay();
  }
  oneMonth();//月変更
  for(int i=0;i<29;i++){//4月
    oneDay();
  }
  oneMonth();//月変更
  for(int i=0;i<30;i++){//5月
    oneDay();
  }
  oneMonth();//月変更
  for(int i=0;i<29;i++){//6月
    oneDay();
  }
  oneMonth();//月変更
  for(int i=0;i<30;i++){//7月
    oneDay();
  }
  oneMonth();//月変更
  for(int i=0;i<30;i++){//8月
    oneDay();
  }
  oneMonth();//月変更
  for(int i=0;i<29;i++){//9月
    oneDay();
  }
  oneMonth();//月変更
  for(int i=0;i<30;i++){//10月
    oneDay();
  }
  oneMonth();//月変更
  for(int i=0;i<29;i++){//11月
    oneDay();
  }
  oneMonth();//月変更
  for(int i=0;i<30;i++){//12月
    oneDay();
  }
  oneYear();//年変更
  }
}
void oneDay() {//1日変更関数
  delay(200);
  SwitchControlLibrary().PressButtonA();
  delay(100);
  SwitchControlLibrary().ReleaseButtonA();
  delay(100);
  SwitchControlLibrary().MoveHat(6); // left
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(90);
  SwitchControlLibrary().MoveHat(6); // left
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(90);
  SwitchControlLibrary().MoveHat(6); // left
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(90);
  SwitchControlLibrary().MoveHat(0); // up
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(90);
  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();
  count++;
  if(count==last)
   exit(0);
}
void oneMonth() {//1日1月変更関数
  delay(200);
  SwitchControlLibrary().PressButtonA();
  delay(100);
  SwitchControlLibrary().ReleaseButtonA();
  delay(100);
  SwitchControlLibrary().MoveHat(6); // left
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(90);
  SwitchControlLibrary().MoveHat(6); // left
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(90);
  SwitchControlLibrary().MoveHat(6); // left
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(90);
  SwitchControlLibrary().MoveHat(0); // up
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(90);
  SwitchControlLibrary().MoveHat(6); // left
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(90);
  SwitchControlLibrary().MoveHat(0); // up
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(90);
  SwitchControlLibrary().PressButtonA();
  delay(50);
  SwitchControlLibrary().ReleaseButtonA();
  delay(80);
  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();
  count++;
  if(count==last)
   exit(0);
}
void oneYear() {//1日1月1年変更関数
  delay(200);
  SwitchControlLibrary().PressButtonA();
  delay(100);
  SwitchControlLibrary().ReleaseButtonA();
  delay(100);
  SwitchControlLibrary().MoveHat(6); // left
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(90);
  SwitchControlLibrary().MoveHat(6); // left
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(90);
  SwitchControlLibrary().MoveHat(6); // left
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(90);
  SwitchControlLibrary().MoveHat(0); // up
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(90);
  SwitchControlLibrary().MoveHat(6); // left
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(90);
  SwitchControlLibrary().MoveHat(0); // up
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(90);
  SwitchControlLibrary().MoveHat(6); // left
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(90);
  SwitchControlLibrary().MoveHat(0); // up
  delay(50);
  SwitchControlLibrary().MoveHat(8); // center
  delay(90);
  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(50);
  SwitchControlLibrary().PressButtonA();
  delay(50);
  SwitchControlLibrary().ReleaseButtonA();
  delay(50);
  SwitchControlLibrary().PressButtonA();
  delay(50);
  SwitchControlLibrary().ReleaseButtonA();
  count++;
  if(count==last)
   exit(0);
}
```
#動作方法
まずポケモン対戦バグを使って日付を変えるだけでレイドの中身が変わるようにしてください。やり方は検索かければ出てくると思います。
開始日時は"うるう年の1/1"から始めてください。なぜかというとうるう年から始める前提でプログラムを作ったからです。2020年からでいいと思います。始めるときは「現在の日付と時刻」のところに合わせてからやってください。画像参照![S__3612675.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580457/b008d17d-7ee9-5b63-d079-18c05183f035.jpeg)


何回日付を変えるかを把握し、それにあった回数をプログラム5行目のlastに指定してください。私のプログラムをコピペすると10000回動きます。日付の計算はネットやExcelで可能です。
ちなみに1日あたり約1.5秒かかります。たまにちゃんと動作しなくて暴走することがあるので適度に確認してください。
2/25追記 一部内容を変更しました。
#おわりに
乱数調整作業がとても楽になりました。他にもW稼ぎなどもできるようです(他の方が記事を書いていますので詳しくはそちらを参照)。
私はAボタンを連打させて穴掘り兄弟をずっとやらせていました(金冠は出ず...)。
よかったらこの記事を参考にしてみてください。
2/25更新 日付変更の回数を指定できるようにしました。5行目のlast=〇の〇で指定してください。