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目)は不明。
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 ubinasciiwifiCfg.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(に割り当てられたズームアウト)が実行されているのが気になる。
所感
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の画像認識も組み合わせて...。