【RTK2021】F9PにBlueToothダイレクト接続ではまった<ランダムデータ受信アルゴリズム>

今までのLunchBoxシステムでは、F9Pとマイコンを接続してマイコンからBlueTooth送信してました。
今回は、F9PのUART1にダイレクトにBlueTooth SPPモジュール RN42を115200bpsで接続して送信させてみました。

——————————————————————————–
※本BT用Pgm完成してから電池駆動してみたら途中で転送が遅くなってリアルタイム受信できなく
なりました。これは、SimpleRTK2B基板の電流供給能力オーバーになってしまったようで、BlueToothモジュール専用に電池をつないであげれば安定して通信しました。F9P MovingBaseシステムは電流が多い(F9Px2個+ESP32x1個+BTモジュール=100mAx2+80mA+40mA=320mAも食います)ということで、SimpleRTk2Bボードの電源でSimpleRTK2BliteとESP-32とRN42の3個を賄うのは厳しいので、バッテリー対策がモバイル使用では重要課題だと認識しました。
——————————————————————————–

 

■BlueToothの送信データランダムに来る
USBシリアル受信で
完成したプログラムを使ってBlueToothSPP受信すると
なんとエラーでハングして受信できませんでした。
最初に戻って、シリアルポートの生データをログしてみると
なんと、UBX(NAV-PVTとNAV-RELPOSNED)172Byteの1データセットを
2-4回に分けて送信してきてました。しかも、毎回バイト数がばらばらで
掴みようがないほどランダムな送信データで唖然としました。
1回に2バイトから400バイトくらいまでバラバラです。

■以前からBlueToothではまってきてます
何故データがまともに送信されてこないのか原因は不明です。
アンドロイドスマホでPgm組んだ時も苦労しました。

【PowerMeter2020】スマホリアルタイムPgm_BlueTooth受信部大変<バラバラで入ってくる>

 

今回は、VB.NETでWIN10PCでの受信で、内蔵BlueToothをSPP設定して
F9P SimpleRTK2BのUART1に115200bpsでダイレクト接続したRN42モジュールからのバイナリデータ172byteを受信する初めてのこころみでした。
何故バラバラになるのか原因は不明ですが、androidでもWIN10でも発生しているところをみるとRN42の送信バッファの問題ではないかと思います。F9P-マイコン経由でRN42で送信する場合は、マイコン側でデータをソートしてからRN42へ渡しているので、問題は発生してませんでした。
従来通り
マイコン経由のほうが良いかもしれませんので、M5ATOMliteで
送信部を作ってみようかと思います。SPP風に作る方法も以前やりました
いずれにせよ、特殊なアルゴリズムで処理時間を浪費する通信プロトコルでは高速化、信頼性で将来性がないので、WiFI系ESP-NOWを使うことにして、5Gのコストとサイズが下がったら5G化するのが正解だと思います。

 

■バラバラなデータを受信するアルゴリズム
3日かけて、試行錯誤して何とか、このランダムデータをソートして
まともなデータセットに直してから通常のバイナリデータ処理と表、グラフ表示までできるようになりました。
はっきり言って、もうBlueToothは触りたくありません。ESP-NOWのほうが速くて、データもきちんと受信できると思います。
原理1:バラバラでも1セットは172バイト、515文字で受信される
先頭はランダムでも172バイトにひとまとめしてからヘッダを探してソートすればまとめになるはず
ということで下表のアルゴリズムでプログラムを組みました。

コードを見ただけではわからないと思いますので、上の原理図をみながら自分でプログラム作ったほうが早いと思います。
使う文字列処理命令は
①文字切り取り:string2=string1.Substring(開始番号、切取り文字数)
②文字引き算:string2=string0.Replace(string1,””)
string0からstring1を削除してstring2へ渡す

③文字検出:位置番号=string0.Indexof(“検索文字”)
この3個の文字列処理でアルゴリズムを実現しました。

 ‘*****************************受信データソート部****************************************************
        Dim setN As Integer = 515 ‘受信データセット文字数 172バイト*3(文字)-1(最後尾無し)
        Dim slen As Integer = sdata.Length
        If sd2 = “” Then
        Else
            sdata = sd2 + “-” + sdata
        End If
        If sdata.Length < setN Then
            sd2 = sdata
            Exit Sub
        ElseIf sdata.Length > setN Then
            sd1 = sdata.Substring(0, setN) ‘[0]-[setN-1] setN個
            If sdata.Length = setN Then
                sd2 = “”
            Else
                sd2 = sdata.Replace(sd1, “”)
            End If
            If sd2.Substring(0, 1) = “-” Then
                sd2 = sd2.Substring(1, sd2.Length – 1)
            End If
            Dim topN As Integer = sd1.IndexOf(“B5-62-01-07”)
            Dim topStr As String = sd1.Substring(topN, sd1.Length – topN)
            Dim lastStr As String
            If topN = 0 Then
                sd3 = topStr
            Else
                lastStr = sd1.Substring(0, topN – 1)
                sd3 = topStr + “-” + lastStr
            End If
        ElseIf sdata.length = setN Then
            sd3 = sd1
        End If
        ‘*************************************************************************************************

プログラム全体はこちら
https://gist.github.com/dj1711572002/e25ede1f09c9b42c3c10faaafa1509c9

■Bluetooth受信の時間はおそくならないか?
F9Pからは125msecに1回172byte出力されているのに、送信データを細切れにして送ってくるBlueToothでは送信スループットが低下して、最悪測定周期より遅延してデータ落ちが発生するリスクがあります。
<私は、高速データ通信では、BlueToothとかXbeeなどは使わないことにしてます。WiFIベースのESP-NOWがマイコン無線通信でもっとも高速で信頼性が良いです。>
そこで、受信データ回数と時間を測定して平均周期をだしてみました。
平均すると122msec周期で受信できてるので、125msec周期から遅延はしてないので使えます。回数は2-4回でばらばら分割で入ってきてます。

 

■以後
 BlueToothダイレクトは、信頼性的に厳しそうなので、マイコンを挟んでBlueToothとかESP-NOWとかWiFiとか
選択自由なシステムにしたほうが、使い勝手がよさそうなので、M5シリーズをF9Pに接続する実験を始めます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です