ArduinoとSwitchControlLibraryでポケモンSVの学校最強大会で金策の自動化 part1
ポケモンスカーレットバイオレットで金策を自動化しようと思い、手元にあるArduino Unoを色々といじりました。
つまり、Arduino Unoを用いて、自作のコントローラーを製作しようと思った訳です。
ただ、どうやらArduino Unoに搭載されているチップATMega328P-PUにはUSB→別の機器に信号を送る機能がないようです。
このような事態を回避するためには、そのような通信機能が搭載されている、ATmega32u4が搭載されているボードを使えばよい、ということになります。
以下には、お金稼ぎの自動化を進めていく上でやったこと、参考にした記事、反省点などをまとめていきたいと思います。
やったこと
・準備
とりあえず、手元にはArduino UnoとA to B( Aオス~Bオス)のUSBがあったので、それを使いました。最低限これだけあれば動作すると思います。
・参考にさせていただいた記事
まず、マイコン(今回はArduino)に書き込みを行うための開発環境、Arduino IDE側の設定を行っていかなければなりません。
その後に、今回はGitHubに公開されているSwitch操作用のライブラリを使わせていただきます。
https://github.com/celclow/SwitchControlLibrary
これら諸々の設定の際に参考にさせていただいた記事を紹介します。
ライブラリの用意や開発環境の準備に参考にさせていただいた記事が以下になります。
基本的にはこちらの記事ですべて事足りるのかな、と思います。
また、コントローラーとして認識させる際の注意や、プログラムを書く上で参考にさせていただいた記事が以下になります。
ここで注意点は、上の記事で用いられているライブラリのバージョンは一つ前のもの(v1)であり、GitHubで最新に公開されているバージョン(v2)であることに注意しなければなりません。
v1とv2では、例えばAボタンを押す際に以下のように、書き方に軽微な差があります。
SwitchControlLibrary().PressButtonR(); //v1の書き方
SwitchControlLibrary().pressButton(Button::A); // v2の書き方
・書き込みプログラム(予定)
以上の注意点を用いて書き込むプログラムがこちらになります。
プログラム自体は、ほとんど上の記事を参考にさせていただきました。
取り敢えずはコントローラーとして認識し、Aボタンさえ連打してくれればよいので、以下のようなプログラムになりました。
#include <SwitchControlLibrary.h>
void setup() {
// put your setup code here, to run once:
SwitchControlLibrary(); // 初期化
SwitchControlLibrary().pressButton(Button::R);
delay(50);
SwitchControlLibrary().pressButton(Button::R);
delay(500);
SwitchControlLibrary().pressButton(Button::L);
delay(50);
SwitchControlLibrary().pressButton(Button::L);
delay(500);
SwitchControlLibrary().pressButton(Button::R);
delay(50);
SwitchControlLibrary().pressButton(Button::R);
delay(500);
SwitchControlLibrary().pressButton(Button::R);
delay(50);
SwitchControlLibrary().pressButton(Button::R);
delay(500);
SwitchControlLibrary().pressButton(Button::L);
delay(50);
SwitchControlLibrary().pressButton(Button::L);
delay(500);
SwitchControlLibrary().pressButton(Button::R);
delay(50);
SwitchControlLibrary().pressButton(Button::R);
delay(1500);
}
void loop() {
// put your main code here, to run repeatedly:
while(1){
SwitchControlLibrary().pressButton(Button::A); // Aボタンを押す
SwitchControlLibrary().sendReport(); // Aボタンを押したことを反映
delay(50); // 50 ms 待機
}
}
課題
前述したように、このままではArduino Unoには書き込みを行えません。
もし書き込みを行おうとしても、以下のように、ブートローダーに関するエラーが吐かれると思います。
avrdude: error: programmer did not respond to command: leave prog mode
avrdude: error: programmer did not respond to command: exit bootloader
ATMega328P-PUでも、Power Shell越しにファームウェアを書き替えてしまえば動作できるようですが、今後プログラムを書き換えていく際には少しめんどくさそうなので、今回は見送りました。
この辺については以下の記事が大変参考になりました。
今後の予定
取り敢えずATmega32u4が搭載されているボードをAmazonで、¥1,750でポチりました。
連射コン買うよりもまぁまぁ安いでしょうし、もっと複雑な動作も期待できるので、安い出費だと思いたいです。
また、ATmega32u4が搭載されているボードは他にも安値でいろいろと売られているので、気になる方は調べてみてください。
また手元に届いて、ある程度うまくいったときにはこの記事の続き(Part 2)でも書こうと思います。