シリアルデータの中身について - KawaSwitch/Poke-Controller GitHub Wiki

PCからマイコンに送っているデータの中身を説明します

  • 期待通りにデータが送れているのか
  • どこで予期せぬ動作が起きているか

などの確認時に活用してください

不明点があればお気軽にIssueまで

シリアル通信についてはここでは説明しませんがいくつか参考記事を載せておきます
UARTって何だ? (最終アクセス: 2020/01/08)
Arduino 入門 番外編 08 UART通信 とは (最終アクセス: 2020/01/08)
調歩同期の解説 (最終アクセス: 2020/01/08)

送信シリアルデータの確認方法

  1. メイン画面の"Show Serial"チェックボックスをオンにする
  2. シリアルデータ送信時に右側のログにデータが表示される(下図)

シリアルデータ確認

シリアルデータ解釈の流れ

  1. python側からSender.writeRowメソッドを用いてシリアルデータを送信
    PokeController/SerialController/Sender.pyにSenderクラスがあります
    終端に"\r\n"を付加

  2. マイコン側でUSART通信の受信割り込みの処理を行う
    PokeController/Joystick.cのISRがシリアルデータの受信時の割り込みハンドラ
    ISR: Interrupt(割り込み) Service Routine
    付加した終端文字まで来たら受信文字列を解釈用の関数に投げます

  3. マイコン側で受信データを解釈
    受信した文字列によって場合分けした処理を行います(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コマンド用のフォーマットは現在次のようになっています

python_format
※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ボタンを押下し, 左スティックを左に倒す