ラズパイからリュウをコントロール
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ではコマ落ちしてます。
60fpsはYouTubeで再現できなかったのので、こちらからどうぞ。
まとめ
こんな動きのリュウに遭遇したら、グツるっていうか引きますね。でもよく見ると、プログラム開始のタイミングなどによっては、動きがスムーズではありません。これはおそらく、ゲーム上の1/60秒とラズパイ上の1/60秒が異なるためでしょう。
普通こういった計測系では、一方から出力された同期信号を使って同期をとるのですが、ゲームから同期信号を取る方法がわかりません。ていうか、やり方のアイディアがあればください。
そこで次回は、まず事実確認ってことで、きちんとオシロスコープでラズパイの出力を観察することにします。やっとオシロの出番です。
コメント