この記事は高知工科大 Advent Calendar 2016の6日目の記事です。
TWE-Lite 書式モード
6日目のtakamasavvvです。
KUTの去年のカレンダーでは、TWE-Liteにちょろっっと触れました。
使い方は本とかwebとかにたくさんあるので、今回は、TWE-Liteの気になるところとその解決(?)策としての書式モードを紹介します。
電波だしね、切れるときもある
TWE-Lite は他の小電力無線と比べて長距離通信出来るという特長を持っていますが、無線である以上、外乱ノイズは存在します。
下に透過モード(何の対策もされてないシリアル通信)の実験の様子と受信時の様子を貼っておきます。
机の上で15cmくらいの距離を連続して通信していますが、数分に一回程度データが壊れる時(赤矢印)があります。
この頻度は周りの環境に左右され、2.4GHzであるTWE-Liteは地面付近だとほとんど通信できないような状態になります。
その辺の話はフレネルゾーンとか減衰とかの話になるのですが、本筋ではないので今回は割愛します。
「別に気にしないよ」と言う方には話はここまでですが、これを防ぎたい方は何かしらの対策が必要でしょう。
書式モード
対策の手段はTWE-Liteの機能に幾つか実装されていますが、今回はその一つである「書式モード」を使用します。
簡単に言うと、データをパケットにしてチェックサムを付けます。(それだけですね)
その中でも、簡易版送信コマンドのASCII形式を使用します。
送信コマンドは、対象データの頭に送信先の論理IDとデータ種類の値が入ります。
データ種類は任意なので、送信データが何のデータなのかを自分で定義することが出来ます。
その送信コマンドの頭にASCII文字の ; (コロン)を付け、後ろにチェックサムと改行文字のASCII文字でもあるフッター[CR][LF]を付けます。
チェックサムは送信コマンドの各バイトの和を8bit幅で計算し2の補数をとります。
つまり送信コマンドの各バイトの総和 + チェックサムバイトを8bit幅で計算すると0にります。
例. 送信コマンド:00A01301FF123456
コマンドの各バイトの和を8bit取る
0x00 + 0xA0 + ... + 0x56 = 0x4F
2の補数を取って
0x4F + 0xB1 = 0
よりチェックサムは0xB1
となります。
送信時に限っては、チェックサムとフッターを省略して"X"
で表現することも可能です。簡単だね!!!
受信時は、送信先論理ID → 送信元論理IDと変換された状態で出力されます。
受信時はチェックサムは自分で解くことになります。 ファイトだよ!!!
注意
まあASCII形式では当たり前っちゃ当たり前なんですが、ASCII文字以外は割り当てられないので、0x80
以降のデータは死にます。
なんだったら0x00~0x1f
も制御文字として読まれて当たり所が悪ければ死にます。
ということは数値をそのままぶっこむと死亡率がぐんと高くなってしまいます。
ということで自分が考えたファッ○ンな発想としては、「数値も文字で表す」というものでした。
こんな感じ
//宛先:0x00 コマンド:33 Xはチェックサム
foo = 200 //0xC8なのでこのままデータ入れるとアウト
sprintf(uartbuf, ":0033%dX",foo); //sprintfで文字列そのままぶっこめばいいのよ!!
ASCII形式なんていうものを使ってる時点で間違っている(でもデバックは文字だから見やすい)のですが、なんやかんやでその方法を使って9軸センサ+気圧データを5Hzでダウンリンク出来てるんで許してください(*ノω・*)テヘ
(良い子の皆はこういう時はbinary形式に移行しような)
最後に
来年くらいには他の形式をやってSDKまで手を出して見たいけど、TWE-LiteのSDKちょっと人類が手を出す感じになっていないので時間かかりそう。
21日は進捗が出れば進捗ダメですRaspberryPiZeroをいじめ抜く記事書きたい。
TWE-Lite 皆やろう!!