BNO085 STAシステムに組み込みました。100Hzで姿勢角が出力できるので、そのままログできるようにプログラム改造しました。5か月ぶりにシステムプログラムいじるので、思い出すのに3日かかりました。
●苦労した点
BNO085の出力100Hzとなると、10msecなので、STA全システムのループを10msec周期に余裕を持たせて回さないといけません。実際は、4-6msecで回ってます。ログしてない時は、1msec以内でSerial受信検知ループしてます。
SDカード書き込み、BlueTooth送信、PC出力などやりながら、Base ,Rover,IMUのデータを受信する仕事があるので、Teensyの能力フルで使わないとできません。ESP32系では絶対できないシステムです。
ESP32系のシリアルは、別コアのバックグランドで動いてますが、WiFiとか無線もバックグランドで動いているので、プログラムが忙しくなるとシリアルがデータ落ちします。そもそもUARTが2本しかありません。
●BNO085 の100Hzデータ受信 UART-RCVモード
①周期が10msecでシステムループで間に合うか?
普通のI2CのIMUと違って、UART-RCVモードは、垂れ流しで送ってきます。ばらつくのでいつ入ってくるのか判りません。システムのメインループで、面倒をみているとデータ落ちしてしまうので、Teensy Hardwareシリアルで、解決できました。ハードバッファが自動的に受信してくれるので、RTKの120msec周期と10msecを独立して受信できます。BNO085の受信部分を備忘録しておきます。
①全部で19バイトを漏れなく読み込まないとバッファが空にならないから、要らないデータでも読み込む。
②ハードバッファサイズは256バイト確保してあるが、19バイトになったら、読み込むので、19バイトしか
使ってない。setup でhard serialのバッファを宣言しておきます。
static uint8_t serialbuffer5[256];//バッファは、static変数配列で宣言しておく。32byteの倍数で確保すること
//Serial3 def BNO085 |
③RTKシステムの1周期120msecあるので、IMU周期10msecで12回分ため込むためにバッファ配列dBuf5[228]
を用意して12回分のデータを保持する。