【RTK22】PollingしてF9P4個からチップIDを取得するPgm作った<受信タイミングにコツ>

USB HOSTをTeensy4.1で動作させて、4枚のボードからデータを受信するのですが、いかんせんUSB名とボードの組み合わせがばらばらで、入ってきたデータがどのボードから来たものか区別できないことに気づきました。
そこで、F9Pの識別をすべくInterface descriptionを眺めながらチップの識別できるセンテンスをさがしました。
実際は、F9P2個とF9H2個ですが、同じSimpleRTK2B基板に乗っているのでここでは、便宜上F9Pと呼んでます。
手作りのUSB4ポートハブにTennsy4.1のUSBHOSTを接続して4個からのデータをひとまとめにして処理ログします。

●UBX-SECがあった。
interface descriptionの197ページにありました。 HPG1.13用です。
このセンテンスOUTPUT扱いですが、Pollで返信があるので、Pollを使って取得できました。

●このセンテンスをどうやって実行すればいいのか?
Ucenterで手動で、右クリック Pole message とやると、チップIDがでてきますので、これをプログラムで
やれればいい訳です。Poll命令については、Ublox FAQに回答がありました。
https://portal.u-blox.com/s/question/0D52p00009q7BQHCA2/how-to-poll-ubx-messages
センテンスのペイロードがゼロのものをF9Pへ送信すれば、中身を入れて返信してくれるそうです。
F9PのほとんどのセンテンスがPollできますので、覚えれば欲しいときに送信してデータを得ることができます。
F9Pのperiodicセンテンスばかりでは不足するので、Pollingは重要だと思います。


●POLL送信するコードをUcenterから拾う。
ヘッダとチェックサムだけつけて、中身をゼロにすればいいのですが、チェックサムの計算が面倒なので
Ucenterの Binary Consoleを見れば送信しているコードが判ります。
VIEW-BinaryConsoleを開いたまま、UBX-SECのUNIQID(UniqueChipID)を右クリックして
Poll messageをクリックします。するとBinary consoleに下記コードがでてきます。
送信データがB5 62 27 03 00 00 2A A5 となっていて
戻りデータが B5 62 27 03 09 00 01・・・となってUBX-SECでチップIDが戻ってきてます。

 

●上記手動動作をプログラムで行う。
手順1:USB HOST Serialを起動して各ポートがbeginしてから、Pollingに入る。
=>今回はTeensy4.1のUSB HOST経由ですが、F9Pのシリアルポートでもpolling動作できると思いますがシリアルポートが空いていればいいのですが、私のシステム構成では空いてなのでUSBポートを使ってます。
手順2:各ポートにB5 62 27 03 00 00 2A A5を送信して、戻ってきたらバッファを全部読み込みます。
ハマった点1:Polling中でも、定期的な測位データが同じUSBポートから入ってきますので、Pollの戻りコードだけ
抽出する処理をしないといけません。
下記コードは、userialb0ポートのチップIDを読み込む部分です。
1)b0IDflagは、IDを取得済みで1,未取得で0です。
2)buf[2048]と大きなバッファを用意してどんな返信データがきてもバッファエラーしないようにしてます。
3)bufsize分だけforループを回して、ヘッダ4バイト B5 62 27 03がでてくるデータ番号をさがします。
4)ヘッダが見つかったら、ヘッダ番号+10バイト目からIDコード5バイトがあるのでb0ID[]配列に格納します。
5)格納が終了したら、b0IDflag=1にして、buf[]もゼロにして、他のポートで同様な処理を行います。

//————————–b0ID—————————–
if(b0IDflag==0){
for (i=0;i<8;i++){
userialb0.write(uniqID[i]);
}
i=0;
//Serial.println();
if(userialb0.available()>15){//SEC header search
while(userialb0.available()>0){//buffer read
buf[i%2048]=userialb0.read();
//Serial.printf(“buf[%d]=%x\n\r”,i,buf[i]);
i++;
}
int bufsize=i-1;//default SEC 17bytes
Serial.printf(“——-b0_bufsize=%d——–\n\r”,bufsize);
for(i=0;i<bufsize-3;i++){
if (buf[i]==0xb5 && buf[i+1]==0x62 && buf[i+2]==0x27 && buf[i+3]==0x03){
// b0ID[0]=buf[i+10];b0ID[1]=buf[i+11]; b0ID[2]=buf[i+12]; b0ID[3]=buf[i+13]; b0ID[4]=buf[i+14];
Serial.printf(“start i=%d:b0_Id=”,i);
for (j=0;j<5;j++){
b0ID[j]=buf[i+10+j];
Serial.print(b0ID[j],HEX);
Serial.print(“,”);
}
b0IDflag=1;
Serial.println();
break;
}
}
}
for(i=0;i<2048;i++){
buf[i]=””;
}}//b0ID flag end

GISTにプログラムアップしてありますが、Teensy4.1用です。

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

●実行結果
USBポート名 USERIALB0,USERIALB1,USERIALB2,USERIALB3の4ポートから
順不同に、b0,b1,b2,b3の4個のF9PチップID5バイトを読み込めました。

●以後
Teensyのプログラム、ループがESP32の6倍以上速いので、ループはμsec単位で片付いてしまいます。
そのため、ループがすぐに回る感覚を身につけないと、タイミングを逃してしまうので、慣れが必要です。
しかし、速いCPUは正義だと感じてます。なんでもできそうな気がしてます。

コメントを残す

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