シリアルデータの中身について - KawaSwitch/Poke-Controller GitHub Wiki
PCからマイコンに送っているデータの中身を説明します
- 期待通りにデータが送れているのか
- どこで予期せぬ動作が起きているか
などの確認時に活用してください
不明点があればお気軽にIssueまで
シリアル通信についてはここでは説明しませんがいくつか参考記事を載せておきます
UARTって何だ? (最終アクセス: 2020/01/08)
Arduino 入門 番外編 08 UART通信 とは (最終アクセス: 2020/01/08)
調歩同期の解説 (最終アクセス: 2020/01/08)
送信シリアルデータの確認方法
- メイン画面の"Show Serial"チェックボックスをオンにする
- シリアルデータ送信時に右側のログにデータが表示される(下図)
シリアルデータ解釈の流れ
-
python側からSender.writeRowメソッドを用いてシリアルデータを送信
PokeController/SerialController/Sender.pyにSenderクラスがあります
終端に"\r\n"を付加 -
マイコン側でUSART通信の受信割り込みの処理を行う
PokeController/Joystick.cのISRがシリアルデータの受信時の割り込みハンドラ
ISR: Interrupt(割り込み) Service Routine
付加した終端文字まで来たら受信文字列を解釈用の関数に投げます -
マイコン側で受信データを解釈
受信した文字列によって場合分けした処理を行います(Joystick.cのParseLine関数)
現在はアスキーで送受信しており, そのまま標準sscanf関数で受信データを分割
分割後の先頭データによっておおまかに分けて次の5種類の分岐処理があります
受信データ | 処理 |
---|---|
sscanfエラー | Debugコマンド1 X連打 |
"end" | 操作の停止 |
"p" | pythonコマンド用 |
'MCU用文字列' | MCUコマンド用 |
当てはまらない | Debugコマンド2 HOME連打 |
マイコン側からソフトウェア上でエラーを通知できないため苦肉の策として
エラーが起きた際にはDebugモードとして特定のボタンを連打するようにしています
MCUコマンド
SerialController/McuCommand.pyのMcuCommandクラスで設定するsync_nameを開始時に送信
Joystick.cのcmd_name配列の中の文字列と受信データが一致すればMCUコマンドをスタート
例
mash_a
end
A連打のMCUコマンド
auto_league
end
リーグ自動周回のMCUコマンド
Pythonコマンド
pythonコマンド用のフォーマットは現在次のようになっています
※ver1.0_rcにおける変更について
ver1.0_rc以降は上記フォーマット先頭の'p 'が削除され, ボタンとLスティックの間にHATが追加されています
画像は後から差し替えます
MCUとの区別用のp, ボタンを表すbit列,
LスティックのX方向/Y方向, RスティックのX方向/Y方向
注意
L/Rスティックは0~255(10進数)で解釈されます 中央=128
L/RスティックのY方向は下が正です 0→上入力, 255→下入力
bit列およびL/Rスティックは送受信文字数を減らすため16進数表記です
bit列の解釈のためには16進数→2進数の変換が必要です 参考ページ
bit列は最小1bit, 最大で16bit(=2Byte)のデータとなります
次の表は上画像のそれぞれの文字の意味を下位ビットから順に羅列したものです
頭文字 | 意味 |
---|---|
RS | フラグ Rスティックに変化があれば1 |
LS | フラグ Lスティックに変化があれば1 |
Y | Yボタン |
B | Bボタン |
A | Aボタン |
X | Xボタン |
L | Lボタン |
R | Rボタン |
ZL | ZLボタン |
ZR | ZRボタン |
M | MINUSボタン |
P | PLUSボタン |
LC | Lクリックボタン |
RC | Rクリックボタン |
H | HOMEボタン |
C | CAPTUREボタン |
また, HATボタンは次のような数値で定義されています
数値 | HATボタン |
---|---|
0 | Hat 上 |
1 | Hat 右上 |
2 | Hat 右 |
3 | Hat 右下 |
4 | Hat 下 |
5 | Hat 左下 |
6 | Hat 左 |
7 | Hat 左上 |
8 | Hat センター |
フラグを設けることでスティック入力がない(ホールド後を含む)ときの送受信量を減らします
スティック入力は比較的多いのでフラグを下位ビットに持ってきています
例
10 8
Aボタンの押下
0 6
HATボタン(左)の押下
10 8
0 8
Aボタンを押して離す
2 8 ff 80
左スティックを右に倒す
3 8 ff 80 da da
左スティックを右に, 右スティックを右下に倒す
92 8 80 ff
AボタンとRボタンを押下し, 左スティックを左に倒す