M5StickCでGameControllerizer

 M5Atomと基本的に同じ。但し画面があるため、デバッグし易いためM5StickCで行う。

1. Direct Accessモードで確認

Direct Accessモードを利用し書きコマンドでゲームパッドボタン①②に対応する事を確認した。

cmd = bytearray(b'\xc1\x10\x00\x03') # GCの制御コマンド

GcOpsM5/example_direct.py at master · GameControllerizer/GcOpsM5 · GitHub

 

言語仕様はこちらにあるが、制御コマンドはどう理解すればよいのだろうか?

GitHub - GameControllerizer/DSL4GC: Domain Specific Language for Game Control

(b'\xc1\x10\x8f\x05')に変更して解析してみた。

1Byte目 xc1: 不明。変更してもゲームパッド入力できる。

2Byte目 x10: キー押下時間を示している模様。これでおおよそ100~200ms程度。

3Byte目 x8f : 右側(LSB~4bit目)がゲームパッドの⑤~⑧、左側(MSB~5bit目)が⑨~⑬を示しているようだ。

4Byte目 x05: 右側(LSB~4bit目)がゲームパッドの①~④を示している。左側(MSB~5bit目)は不明。 

f:id:jijiken0417:20210411164558p:plain

 

2. Network Accessモードで確認

系とプロトコルは下記。http GETで制御する。

 系:       Node RED -----> M5StickC(UiFLOW) -----> GC -----> PCGAME

 プロトコル:      http GET                            UART       USBHID

 

M5StickC(UiFLOW)のmicroPythonコードは下記。

MicroWebSrcのパス、UARTのPin番号に注意すればOK.

from m5stack import *
from m5ui import *
from uiflow import *
from MicroWebSrv.microWebSrv import MicroWebSrv
import wifiCfg
import ubinascii

wifiCfg.autoConnect(lcdShow = False)
uart = machine.UART(1, tx=33, rx=32)
uart.init(115200, bits=8, parity=None, stop=1)

def handlerCmd(httpClient, httpResponse) :
cmd_base64 = httpClient.GetRequestQueryParams().get("cmd")
if cmd_base64 is not None:
cmd = ubinascii.a2b_base64(cmd_base64)
uart.write(cmd)
httpResponse.WriteResponseOk(
headers = None,
contentType = "text/json",
contentCharset = "UTF-8",
content = "OK")
wait(1)
else:
httpResponse.WriteResponseBadRequest()
wait(1)
routeHandlers = [("/", "GET", handlerCmd)]
srv = MicroWebSrv(routeHandlers=routeHandlers)
srv.WebSocketThreaded = False
srv.Start(threaded=False)

 

一応動いた。btn0を押すと、btn5(に割り当てられたズームアウト)が実行されているのが気になる。

f:id:jijiken0417:20210412003702g:plain

 

所感

 1. http GETする際にM5StickCのIPアドレスを調べないといけないが、ルーターに接続して総当たりで調べた。何か良い方法はないのか・・・?

 2. btn0押すとbtn5が反応するのは何故か・・・?

 3. USB HID機能付きArduino microでも同様の事ができるが、比較した利点は次の通り。

  • Grove Connectorが標準装備であるため、M5やObnizと接続し外部センサとの連携が容易
  • RaspiやJetsonのピンヘッダ互換のためハンダ接続すればLinuxから容易に制御できる。Arduino microだとLinuxと接続する場合、USB-UARTまたはUSB Host Shield経由でUSB接続する必要がある。
  • ESP32 BLE Combo はKeyboardとMouseを同時利用できる。GCがGamepadとKeyboardやMouseと同時できるなら利点は大きい。

 4. Raspi Zeroでも動くため、USB Dance Dance Revolution Matを接続して制御してみたい。

 5. Jetson Xavierの画像認識も組み合わせて...。