コントローラーで送受信するデータ

通信モジュール

現在(2025/03/12)は、双葉電子のFEP02TJを主に使用している。('FEP-02')
周波数帯は920MHz帯で無線モジュール。UARTを用いた通信が可能。部のほとんどのものがボードレート38400[Symbol/sec(bit/s)]に設定されている。

RXとTX

マイコンボードのピン配置などでUART1_RXUART2_TXなどと書いてあるものを見たことがあると思う。RXReceiveの略でTXTransmitの略でそれぞれ受信する送信するという意味だ。無線モジュールを使用しない場合の多くはArduinoなどの送信側のTXF446REなどの受信側のRXをつなぎ送受信する。

送信側

主にArduino Uno Rev3USB Host Shieldを接続し、USB Host ShieldDUALSHOCK4などのコントローラーを接続し、Arduinoでコントローラーのデータを読み取りそれをシリアル通信を用いて受信側に送る。受信データは以下の表の内容になって全てで11byteある。

byte数data説明
0byte0xaf先頭データを表す
1byteunsigned charLアナログスティックのX座標
2byteunsigned charLアナログスティックのY座標
3byteunsigned charRアナログスティックのX座標
4byteunsigned charRアナログスティックのY座標
5byteunsigned charL2アナログボタン
6byteunsigned charR2アナログボタン
7byteunsigned charディジタルボタンセット1
8byteunsigned charディジタルボタンセット2
9byteunsigned charチェックサム用SUM
10byte0xed終端データを表す

ディジタルボタンセット1

bit数data説明
0bit0/1TRIANGLE
1bit0/1CIRCLE
2bit0/1CROSS
3bit0/1SQUARE
4bit0/1UP
5bit0/1RIGHT
6bit0/1DOWN
7bit0/1LEFT

ディジタルボタンセット2

bit数data説明
0bit0/1L1
1bit0/1L3
2bit0/1R1
3bit0/1R3
4bit0/1CREATE / SHARE / SELECT
5bit0/1OPTIONS / START
6bit0/1PS
7bit0/1TOUCHPAD / N/A

N/A:なし
CREATE,OPTIONS,TOUCHPADDUALSENSEの場合、SHARE,OPTIONS,TOUCHPADDUALSHOCK4の場合、SELECT,START,N/ADUALSHOCK3の場合。
ボタンセットはボタンが押されている時に対応する各bitが1になるようにしている。

bit数16進数表記2進数表記
0bit0x010000 0001
1bit0x020000 0010
2bit0x040000 0100
3bit0x080000 1000
4bit0x100001 0000
5bit0x200010 0000
6bit0x400100 0000
7bit0x801000 0000

チェックサム用SUM

SUM = (LアナログスティックのX座標) + (LアナログスティックのY座標) + (RアナログスティックのX座標) + (RアナログスティックのY座標) + (L2アナログボタン) + (R2アナログボタン) + (ディジタルボタンセット1) + (ディジタルボタンセット2)

受信側

NUCLEO-F446REなどでFEPを通してArduinoから送られてきたデータはある処理をされて使用するデータに格納される。その処理はざっくり言うと以下の図のような処理になる。
rev.drawio.png
各環境や言語によって使われる関数などは違うがだいたいはこのような感じの処理をしている。
各環境の受信側ライブラリ(現在あるもの)

ボタンセットの値の読み取り方

送信側ではボタンが押されたらbit論理和代入をしている。例えば0x100x04のボタンが押されている場合は0001 0000 + 0000 0100 = 0001 0100になる。そうすると送信側では、0x14が送信される。受信側では各ボタンの判定を行えば良く、ボタンが押されているかどうかは論理積を用いる。0x10の場合は0x14 ・ 0x10 = 0x10になる。このようにしてボタンの状態を読み取る。