【ポケモン剣盾】マイコンを使ったきのみ自動回収プログラム

Arduino Uno,Leonardoなどのマイコンを使ったきのみ自動回収プログラムを作りましたので公開します。

Atmega16U2,Atmega32U4用どっちもダウンロード先に置いてあります。

参考にさせてもらいました

目次

ダウンロード先

32U4の人はIDEでauto_berry.inoを,16U2の人はdfu-programmerでJoystick.hexをそれぞれマイコンに書き込んでください。

 

使い方

ランクマッチを行って日付変更バグモードにしておいてください。

木の実のとれる木の前でマイコンをSwitchに接続してください。

ソース全文

#include <SwitchControlLibrary.h>
void setup() {
//recognize the micro controller
SwitchControlLibrary().PressButtonR();
delay(50);
SwitchControlLibrary().ReleaseButtonR();
delay(500);
SwitchControlLibrary().PressButtonL();
delay(50);
SwitchControlLibrary().ReleaseButtonL();
delay(500);
SwitchControlLibrary().PressButtonR();
delay(50);
SwitchControlLibrary().ReleaseButtonR();
delay(500);
SwitchControlLibrary().PressButtonR();
delay(50);
SwitchControlLibrary().ReleaseButtonR();
delay(2000);
}
void loop() {
//main program
GetBerry();
ChangeDate();
}
//press & release A button
void PressA() {
SwitchControlLibrary().PressButtonA();
delay(50);
SwitchControlLibrary().ReleaseButtonA();
}
//press & release B button
void PressB() {
SwitchControlLibrary().PressButtonB();
delay(50);
SwitchControlLibrary().ReleaseButtonB();
}
//press & release Home button
void PressHome() {
SwitchControlLibrary().PressButtonHome();
delay(50);
SwitchControlLibrary().ReleaseButtonHome();
}
//press & release Down button
void MoveHatDown() {
SwitchControlLibrary().MoveHat(4); // down
delay(50);
SwitchControlLibrary().MoveHat(8); // center
}
//press & release Right button
void MoveHatRight() {
SwitchControlLibrary().MoveHat(2); // right
delay(50);
SwitchControlLibrary().MoveHat(8); // center
}
//press & release Left button
void MoveHatLeft() {
SwitchControlLibrary().MoveHat(6); // left
delay(50);
SwitchControlLibrary().MoveHat(8); // center
}
//press & release Up button
void MoveHatUp() {
SwitchControlLibrary().MoveHat(0); // up
delay(50);
SwitchControlLibrary().MoveHat(8); // center
}
//player get berry
void GetBerry() {
PressA();
delay(500);
PressA();
delay(800);
PressA();
delay(3000);
for (int i = 0; i < 15; i++) {
PressB();
delay(500);
}
}
void ChangeDate() {
//home
PressHome();
delay(500);
MoveHatDown();
delay(30);
MoveHatRight();
delay(30);
MoveHatRight();
delay(30);
MoveHatRight();
delay(30);
MoveHatRight();
delay(30);
PressA();
delay(1000);
//system setting
SwitchControlLibrary().MoveHat(4); // down
delay(1500);
SwitchControlLibrary().MoveHat(8); // center
delay(50);
MoveHatRight();
delay(30);
MoveHatDown();
delay(30);
MoveHatDown();
delay(30);
MoveHatDown();
delay(30);
MoveHatDown();
delay(30);
PressA();
delay(500);
//date and time
MoveHatDown();
delay(30);
MoveHatDown();
delay(30);
PressA();
delay(300);
//change date
MoveHatDown();  //year - 1
delay(30);
MoveHatRight();
delay(30);
MoveHatRight();
delay(30);
MoveHatRight();
delay(30);
MoveHatRight();
delay(30);
MoveHatRight();
delay(30);
PressA(); //ok
delay(300);
PressA(); //change date
delay(300);
MoveHatLeft();  //year + 1
delay(30);
MoveHatLeft();
delay(30);
MoveHatLeft();
delay(30);
MoveHatLeft();
delay(30);
MoveHatLeft();
delay(30);
MoveHatUp();
delay(30);
MoveHatRight();
delay(30);
MoveHatRight();
delay(30);
MoveHatRight();
delay(30);
MoveHatRight();
delay(30);
MoveHatRight();
delay(30);
PressA();
delay(300);
//return
PressHome();
delay(500);
PressA();
delay(2000);
}

 

解説

初期設定

setup()でSwitchにマイコンを認識させるためにRLを連打してます。
setup()は一回だけ実行されます。

void setup() {
//recognize the micro controller
SwitchControlLibrary().PressButtonR();
delay(50);
SwitchControlLibrary().ReleaseButtonR();
delay(500);
SwitchControlLibrary().PressButtonL();
delay(50);
SwitchControlLibrary().ReleaseButtonL();
delay(500);
SwitchControlLibrary().PressButtonR();
delay(50);
SwitchControlLibrary().ReleaseButtonR();
delay(500);
SwitchControlLibrary().PressButtonR();
delay(50);
SwitchControlLibrary().ReleaseButtonR();
delay(2000);
}

 

メインプログラム

loop()の中身が無限ループするようになってます。
きのみの回収と日付変更をループすようになってます。

void loop() {
//main program
GetBerry();
ChangeDate();
}

 

ボタン関数

SwitchControlLibraryはボタンを押すと離すが別々に用意されています。
めんどうなのでひとまとめにして関数化しました。

void PressA() {
SwitchControlLibrary().PressButtonA();
delay(50);
SwitchControlLibrary().ReleaseButtonA();
}

 

きのみを回収する

木を一回だけ揺らしてあとはBボタン連打してます。
何回揺らすと汚いリスが出てくるのか分からなかったので一回だけ揺らすようにしてます。

void GetBerry() {
PressA();
delay(500);
PressA();
delay(800);
PressA();
delay(3000);
for (int i = 0; i < 15; i++) {
PressB();
delay(500);
}
}

 

日付変更

今回は乱数消費と違って日付を進める必要がないので年だけを-+1してます。
これをすることで日付が31→1のときの処理を考えなくていいので楽です。

void ChangeDate() {
//home
PressHome();
delay(500);
MoveHatDown();
delay(30);
MoveHatRight();
delay(30);
MoveHatRight();
delay(30);
MoveHatRight();
delay(30);
MoveHatRight();
delay(30);
PressA();
delay(1000);
//system setting
SwitchControlLibrary().MoveHat(4); // down
delay(1500);
SwitchControlLibrary().MoveHat(8); // center
delay(50);
MoveHatRight();
delay(30);
MoveHatDown();
delay(30);
MoveHatDown();
delay(30);
MoveHatDown();
delay(30);
MoveHatDown();
delay(30);
PressA();
delay(500);
//date and time
MoveHatDown();
delay(30);
MoveHatDown();
delay(30);
PressA();
delay(300);
//change date
MoveHatDown();  //year - 1
delay(30);
MoveHatRight();
delay(30);
MoveHatRight();
delay(30);
MoveHatRight();
delay(30);
MoveHatRight();
delay(30);
MoveHatRight();
delay(30);
PressA(); //ok
delay(300);
PressA(); //change date
delay(300);
MoveHatLeft();  //year + 1
delay(30);
MoveHatLeft();
delay(30);
MoveHatLeft();
delay(30);
MoveHatLeft();
delay(30);
MoveHatLeft();
delay(30);
MoveHatUp();
delay(30);
MoveHatRight();
delay(30);
MoveHatRight();
delay(30);
MoveHatRight();
delay(30);
MoveHatRight();
delay(30);
MoveHatRight();
delay(30);
PressA();
delay(300);
//return
PressHome();
delay(500);
PressA();
delay(2000);
}

 

さいごに

はてな記法でソースコードのシンタックスハイライトしてるんですけど</>cってどこから消すかどうやって編集するかよく分かんないんで誰か教えてくださいw

質問はコメント欄までお願いします。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次