【STA25】ログシステム大幅変更<USB経由超高速ログ>

昨年までは、システムが1Base1Rover1IMUと軽かったのでTeensy4,1単独でSDカードログで無事データ計測できていたのですが、
STA25になって、1Base2Rover2IMU2とひずみゲージアンプ100Hzと重くなったので、2CPUでやろうかと思っていたのを
無理してTeensy4.1 1個で組んでみたのですが、実際に計測してみると、データ落ちが酷くて、Roverが1個死に体になってしまいました。
●原因解析
処理ブロックごとの消費時間を調べました。

処理機能 ポート データ 処理内容 消費時間
受信 ソート SD WRITE
BaseCenter
RoverTop
RoverTail
Serial4,6,7

ubx 172byte

120msec

4.5~5.5msec
BaseCenter
RoverTop
RoverTail
Serial4,6,7

ubx 172byte

120msec

1μsec以下
BNO085
2個
Serial1,3    10msec
19byte*2

timePulse8byte

3~4msec

①IMUとひずみゲージアンプデータをログすために10msec周期でLOOPを回さないといけないので、
Base+RoveTop+RoverTailで10msecを超えてしまうので、現在のシステムでは、データ落ちは必然であった。
②R0vetTailを没にしてもギリギリ
=>SDログも大きなパケットにして書き込みと高速になるので、データを大きなバッファにして一気の書き込む
方式をとればBase+Rover2個でも3msecで全部書き込めるはず。しかし、IMUと歪アンプがあるので、はみ出すリスクあり

●発想を変えて給電用USBケーブルでデータをログする。
 今回は、足に巻き付けたモバイルバッテリーから5V電源を防水BOXへ送っているのでUSBケーブルをバラシて使ってました。電源だけはもったいないので、USB D+D-線もつけてあるので、Teensyのプログラム書き換えとかSDカードのファイルのアップロードも防水ボックスをばらさなくてもできるようになってます。
 どうせなら、データログもUSBケーブル経由で、モバイルバッテリの代わりに
タブレットでログさせてしまえという発想です。

●USBログが成り立つ理由
①TeensyのUSBシリアルは、実はUSB2.0でPCと通信してます。ですので、12Mbps以上はでてます。
解説ページでは、9600bpsと定義しても実際は、12~480Mbit/sec出るとあります。確かにPC通信めちゃ速いです。

https://www.pjrc.com/teensy/td_serial.html#:~:text=Unlike%20a%20Arduino%20Uno%20%26%20Mega,12%20or%20480%20Mbit%2Fsec.

●受信したデータを即PCへ流してみた
当初、for ループで Serial.write(data[])と1バイトずつ書いていたのですが、これだと遅くて、データ落ちが時々発生してました。
しかし、上記USBの解説ページには、超高速書き込み方法も解説してます
Serial.write(バッファ名、バッファサイズ)と書けば超高速で転送できると書いてあります。

●早速やってみました。
1ポート172バイト読み込んだ直後にSerial.write(dBuf,size)で、PCのTeraTermのバイナリ受信しながら、各関数の
入口、出口にmicrosec()で時刻を測定してprintするとなんと0~1μsecとほとんど、HardwareSerialの読み込み時間と同じでした。
●データ落ちはあるか
3ポートまとめて5000エポック(4分間)TeraTermでログしたデータをバイナリUBXファイルから実数に変換してCSVにしてみるとなんと全部で0.41%となりましたので、今までの最高成績がでたので、これで行くことにしました。

4611データ中 抜けたり、データが化けてしまったデータ数は19個しかありませんでした。しかも240msec抜けは、
補間すればつかえるので、ほとんどのデータが使えるという好成績でした。

 

●検証プログラム
Arduino  TeensyForumのAndyA様にF9PからのUBXがバラバラで入ってきたときの頭出しのサンプルコードをいただいたものを使わせて
いただいてます。経緯はこちらのForum会話をご覧ください。
AndyA様は、20年来GPSチップの開発をされている方で、GSP技術は難しいとおっしゃってました。確かに、IMUなどのセンサに比べて、マイコン側から扱うのが難しいです。アナログなので、ばらつきがあって、プログラムが破綻しやすいです。
https://forum.pjrc.com/index.php?conversations/t41-3ports-hardwareserial-recieved.13310/#convMessage-15948

https://gist.github.com/dj1711572002/83eb487643e4f53dd17c7e43c6540089

PC側
UBX変換ツール C# コンソールです。
https://gist.github.com/dj1711572002/258842be0b0b5ddfee49ef14ddad2fa9

TeraTermでのバイナリ受信方法

【STA24】IMU100Hz化でログデータ2MB/分と膨大になった<TeraTermバイナリログ方法>

 

コメントを残す

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