ラズパイからアケコンへのキー出力

マクロアケコン
高速屈伸!

ラズパイからリュウをコントロール

SFVでは下を入力するとしゃがみます。対戦の中では、下を連打することを屈伸と呼び、相手を挑発することを意味します。とりあえずの動作確認として、下を連打してリュウを挑発させます。特にリュウだとグツり度合いが高いので、リュウを選びました。ゴメンねリュウ。

コード

RPiパッケージのGPIOを使います。GPIO21から

・レバー下入力1フレーム
・レバーニュートラル1フレーム

を交互に50回入力します。同時に、同じ接点に接続したGPIO20を読んで、正しく情報を読めるか確認します。

import RPi.GPIO as GPIO
from time import sleep

T = 1/60  # 1フレーム
PIN_OUT = 21  # 出力(レバー下)
PIN_IN = 20  # 入力(レバー下)

GPIO.setwarnings(False)  # ポートクリアのwarningを抑制
GPIO.setmode(GPIO.BCM)  # GPIO使用準備
GPIO.setup(PIN_OUT, GPIO.OUT)  # 出力ポート準備
GPIO.setup(PIN_IN, GPIO.IN)  # 入力ポート準備

input_val=[0]*100  # 入力情報記録用

for k in range(100):
    if k % 2 == 0:  # 2フレームごとに
        GPIO.output(PIN_OUT, GPIO.HIGH)  # レバー下を入力
    else:
        GPIO.output(PIN_OUT, GPIO.LOW)  # レバー下を離す
    input_val[k] = GPIO.input(PIN_IN)  # ポート状態入力
    sleep(T)  # 1/60待つ

print(input_val)  # 入力確認
GPIO.cleanup()  # GPIOクリア
[1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0]

1と0が交互に入力されており、入力も正しく働いているようです。

実際の動き

YouTubeではコマ落ちしてます。

ラズパイでリュウを屈伸させる(SFV, 単一キーテスト)

60fpsはYouTubeで再現できなかったのので、こちらからどうぞ。

まとめ

こんな動きのリュウに遭遇したら、グツるっていうか引きますね。でもよく見ると、プログラム開始のタイミングなどによっては、動きがスムーズではありません。これはおそらく、ゲーム上の1/60秒とラズパイ上の1/60秒が異なるためでしょう。

普通こういった計測系では、一方から出力された同期信号を使って同期をとるのですが、ゲームから同期信号を取る方法がわかりません。ていうか、やり方のアイディアがあればください。

そこで次回は、まず事実確認ってことで、きちんとオシロスコープでラズパイの出力を観察することにします。やっとオシロの出番です。

コメント

Bitnami