Log

いろいろ

ポケモンDX2

やっと学校最強大会が解放されました。

ポケモンDX - Log

前回マイコンで作成したA連打プログラムをようやく利用できます。これはすごいですね。一晩でお金持ちになっていました。おかげでミントとぎんのおうかんを購入できたのでウインディに天賦の才を授けます。からだ矯正!

ギフテッドは作れる

ギフテッドは作れる。お次はタウリン漬けにしたいところですが、旅を共にしたウインディなのでまずは努力値を下げる必要があります。世話の焼ける。

努力値を下げるきのみを手に入れましょう。ベイクタウンでエクササイズをすると成功回数に応じてきのみが手に入ります。ジムテストでやったあれです。MAXの151回をクリアするときのみを全種類もらえるとのこと。151回。だれがやるか。

というわけでマイコンの出番です。

シリアル変換を搭載したArduino Leonardo

見た目がパワーアップしました。エクササイズは指示に従ってボタンを押す必要があります。画像認識が必要です。そこで、Switchの画面をPCでキャプチャして、その情報をもとにPCからマイコンへ、マイコンからSwitchへ操作指示を送ります。追加購入。

もうソフト自体の値段を超えました。ポケモンではなくマイコンをやっている。

あとはインターネットに転がっている手順で環境構築を進めるだけです。しかし、画像認識を用いた自動化は、OSはWindowsマイコンArduino Unoが主流のようでした。MacArduino 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を操作するためのプログラムを書き込む

準備ができました。一生エクササイズをするプログラムを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回成功します。二度と画像認識なんてやりません。