【RTK21】RTKの無線化その3<メッセージ捕捉Pgm>

MovingBaseモードのBaseからRoverへ送信されるメッセージの内容をその1,その2で解析したので、プログラムで捕捉する実験をしました。何故、捕捉する必要があるかは、無線はパケット通信となるので、パケットがたまってから送信する時間差が発生するのでタイミングがずれてしまう不具合が発生します。そのため、時間差を最小にしながらパケットをできるだけ早く送信するプログラムを開発する必要があります。

●Base出力捕捉プログラム
下表の順で出力されますが、バイト数がどのくらいばらつくのかはプログラムで測定してみなしとわかりませんので、ヘッダー文字を頼りに各メッセージを切り取ります。

●プログラムのアルゴリズム
①受信中はSerial.printしないで配列変数に保存しておいて
6メッセージ受信完了したら、休み時間でSerial.printする。
②休み時間はその2で測定した結果30msec以内で受信して、125msec周期で
メッセージ受信するので、90msec空き時間がある。
③受信最初の4072.1のヘッダが来たら時刻を記憶しておき

その時刻から32msec経過したら、休み時間にはいったと判定して
受信データ配列をSerial.printする。
④Serial.printする過程で、各メッセージのヘッダがきたら
改行して、メッセージの区別を行う。
Gistにソースアップしてあります。ESP32 DevkitCで動作確認してます。
M5Stackシリーズでも動作すると思いますが、WiFiUDPで使う場合M5シリーズ
だとアンテナ性能が軟弱なのでUDPでこけるかもしれません。

https://gist.github.com/dj1711572002/c687a3a04654ecbdff76d151d15f491d

void loop() {

if (Serial2.available())
{
digitalWrite(2, HIGH);
f1data[k] = Serial2.read();
dumpflag=0;
//4072.1ヘッダーがあったらタイマー記憶
if ( f1data[k] == 0xD3)// && f1data[k-4] == 0x00)// && f1data[k-2] == 0xFE && f1data[k-1] == 0x80 && f1data[k]==0x01)
{
tin=millis();
}
k++;

}//Serial2.available End

tout=millis();

if (tout-tin>32 && dumpflag==0 ) //受信停止は10msec受信がないと判断
{
digitalWrite(2, HIGH);
dumpflag=1;
//Serial.println();
Serial.print(“*********************Data Num:k=”);
Serial.print(k);
Serial.println(“***********************************************”);
int stime=millis();
for(i=0;i<k;i++)
{

//==============-> RTCM3 4072.1, Size 62, ‘Reference station timing information’ D3 00 38 7E FE 80 01 =============
if (f1data[i] == 0xD3 && f1data[i+3] == 0xFE && f1data[i+4] == 0x80 && f1data[i+5]==0x01)
{
Serial.println();
Serial.print(“===============4072.1==========msec:”);
Serial.println(millis());
}
//==============RTCM3 1077, Size 226, ‘GPS MSM7’ D3 00 DC 43 50=============
if (f1data[i] == 0xD3 && f1data[i+3] == 0x43 && f1data[i+4]==0x50)
{
Serial.println();
Serial.print(“===============1077==============msec:”);
Serial.println(millis());
}
//==============RTCM3 1087, Size 201, ‘GLONASS MSM7 ‘ D3 00 C3 43 F0=============
if (f1data[i] == 0xD3 && f1data[i+3] == 0x43 && f1data[i+4]==0xF0)
{
Serial.println();
Serial.print(“==============1087================msec:”);
Serial.println(millis());
}
//==============RTCM3 1097, Size 127, ‘Galileo MSM7 ‘ D3 00 79 44 90=============
if (f1data[i] == 0xD3 && f1data[i+3] == 0x44 && f1data[i+4]==0x90)
{
Serial.println();
Serial.print(“================1097=============msec:”);
Serial.println(millis());
}
//==============RTCM3 1230, Size 10, ‘GLONASS code-phase biases’D3 00 04 4C E0=============
if (f1data[i] == 0xD3 && f1data[i+3] == 0x4C && f1data[i+4]==0xE0)
{
Serial.println();
Serial.print(“=================1230==============msec:”);
Serial.println(millis());
}
//==============-> RTCM3 4072.0, Size 132, ‘Reference station PVT ‘D3 00 38 7E FE 80 00 =============
if (f1data[i] == 0xD3 && f1data[i+3] == 0xFE && f1data[i+4] == 0x80 && f1data[i+5]==0x00)
{
Serial.println();
Serial.print(“===============4072.0==========msec:”);
Serial.println(millis());
}
// if(f1data[i]==0xD3)
//{
// Serial.println(“*”);
// }
Serial.print(f1data[i],HEX);
Serial.print(“,”);

}
digitalWrite(2, LOW);
//Serial.println();
k=0;
}//if tout-tin end

}//loop end

●プログラムの結果
①4072.1と4072.0は、バイト数が一定だが他は大きく変化する

 

●以後
ようやく無線のプログラムを開始します。受信データの6個のメッセージを何通りか分割して
パケットで送信実験してMovoingBaseの動作を実験していきます。

 

 

コメントを残す

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