昨年までは、システムが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でのバイナリ受信方法