やっと学校最強大会が解放されました。
前回マイコンで作成したA連打プログラムをようやく利用できます。これはすごいですね。一晩でお金持ちになっていました。おかげでミントとぎんのおうかんを購入できたのでウインディに天賦の才を授けます。からだ矯正!
ギフテッドは作れる。お次はタウリン漬けにしたいところですが、旅を共にしたウインディなのでまずは努力値を下げる必要があります。世話の焼ける。
努力値を下げるきのみを手に入れましょう。ベイクタウンでエクササイズをすると成功回数に応じてきのみが手に入ります。ジムテストでやったあれです。MAXの151回をクリアするときのみを全種類もらえるとのこと。151回。だれがやるか。
というわけでマイコンの出番です。
見た目がパワーアップしました。エクササイズは指示に従ってボタンを押す必要があります。画像認識が必要です。そこで、Switchの画面をPCでキャプチャして、その情報をもとにPCからマイコンへ、マイコンからSwitchへ操作指示を送ります。追加購入。
もうソフト自体の値段を超えました。ポケモンではなくマイコンをやっている。
あとはインターネットに転がっている手順で環境構築を進めるだけです。しかし、画像認識を用いた自動化は、OSはWindows、マイコンはArduino Unoが主流のようでした。MacとArduino Leonardoという私の組み合わせは情報が少なくて困ったので、ちょっとしたメモを残しておきます。
Poke-Controller-Modifiedをセットアップ
git clone https://github.com/Moi-poke/Poke-Controller-Modified.git cd Poke-Controller-Modified pip install -r requirements.txt
Poke-Controller-Modifiedコード内のCOMポートの型をintからStringへ置換
# SerialController/Window.__init__ self.com_port = tk.StringVar() # SerialController/Settings.__init__ self.com_port = tk.StringVar(value=self.setting['General Setting'].get('com_port'))
Arduino LeonardoへSwitchを操作するためのプログラムを書き込む
LeonardoでPoke-Controllerを動かすプログラム
— ろっこく@ツンデツンデの上で寝ているぬめら(o'~'o) (@Rokkoku_I) 2022年12月24日
(v04 キーボード機能正式対応、McuCommandに園最強大会、日付変更を追加)
■つなぎ方
シリアル変換器TXD ⇔RX←0Leonardo
シリアル変換器GND ⇔GNDLeonardo
■注意事項
Readme.txtをお読みください
■DL先https://t.co/cAHIIoJ59f
準備ができました。一生エクササイズをするプログラムをPythonで書きましょう。
エクササイズ姉さんに話しかけて、モードを選択し、エクササイズ開始まで進みます。ここは画像認識など不要です。
# 無限エクササイズを選択 print('select menu') self.press(Button.A, wait=2.5) self.press(Button.A, wait=1.0) self.press(Button.A, wait=1.0) self.press(Button.A, wait=1.0) self.press(Hat.BTM, wait=1.0) self.press(Button.A, wait=1.0) self.press(Button.A, wait=1.0) self.press(Button.A, wait=1.0) self.wait(16.0)
ここからが本番ですね。エクササイズ中の画面はこんな感じ。
テキストの左側に表情が出ているので、パターンマッチしてこの部分と対応するボタンを押します。また、テキストの変化により次のエクササイズへ遷移したことを検知します。
angry | enjoy | happy | surprised | levelup |
---|---|---|---|---|
|
|
|
|
|
# エクササイズ print('start exercise') while True: # テキストの変化を遷移のトリガーとする if not self.isContainTemplate('../Captures/Exercise/text.png', 0.9): # テキストが変化してから完全に表示されるまで待機する self.wait(0.3) self.camera.saveCapture(filename="Exercise/text", crop=1, crop_ax=[440, 100, 900, 155]) if self.isContainTemplate('happy.png', 0.9): print('happy') self.press(Button.A) elif self.isContainTemplate('surprised.png', 0.9): print('surprised') self.press(Button.B) elif self.isContainTemplate('angry.png', 0.9): print('angry') self.press(Button.X) elif self.isContainTemplate('enjoy.png', 0.9): print('enjoy') self.press(Button.Y) elif self.isContainTemplate('levelup.png', 0.9): print('levelup') self.press(Button.A) else: print('not macth...') else: print('no change') print('wait') self.wait(0.3)
最初はもっと簡素なプログラムでしたが、実行すると途中でsegmentation faultとなりアプリが落ちてしまいました。しかも、少し調べただけでは原因が分かりません。負荷が高いのかもしれないので、ループの最後にself.wait(0.3)
を加えてisContainTemplate
の処理回数を抑えています。
やたらと多いprintもそのためです。もともとはデバッグ用に仕込んでいたものですが、I/Oによって待ち時間ができるためか、アプリが落ちることが減って安定しました。俺は雰囲気でPythonを書いている。知ったこっちゃないです。
とりあえずエクササイズをしてもらいましょう。
うん。勝手にエクササイズをしてくれてました。主人公ちゃんに感情が芽生えたようで嬉しい!でも、スピードアップしたら間に合わなそうですね。何回までいけるのだろうと眺めていたらsegmentation faultでアプリが落ちて画面が見えなくなってしまいました。今も主人公ちゃんはエクササイズをし続けているのだろうか…
ちなみに全ボタンを押し続けるプログラムを書くと151回成功します。二度と画像認識なんてやりません。