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は正義だと感じてます。なんでもできそうな気がしてます。