スマホRTKモニターは出来たけど、全UBXデータをバイナリーでログも、モニターと一緒に処理するのは、BT受信とスマホでは厳しいだろうということで、LuchBox内のNucleoF446REのSPIにSDカードを接続して、ログすることにしました。
現在は、μSDカードですが、後日、FlashAirのSDカードスロットに変更して
MovingBaseのUBXのフルデータも無線で吸い取れるようにします。
●SDカードログ
以前からセンサデータをSDカードにログすることをトライしてきました。
ロードバイクのパワーメーターの場合数msec周期で休みなく10chのデータが
飛び込んでくるので、マイコンのSDカードプログラムでは、バッファオーバーフローしてしまって、使えなかったのですが、F9Pは、トータルスループットが200msecとセンサとしては非常に遅いデバイスなので、SDカードで余裕でログできました。
だいたいの時間は、BTのスマホモニターデータ送信で5msec+SDへ172バイト書き込み5msec~10msec程度で全部仕事ができてしまいました。
本当に忙しいのは、F9Pから460800bpsで172バイトを送信されてくる瞬間だけで、
あとの190数msecは、暇をもてあそぶという感じです。
●mbedのSDFilesystemライブラリーが動かない
ここ1年半で、mbed OSが大きく変更されて、マルチスレッドになりました。
昔作った、SDファイル用プログラムが全然動かなくなってしまいました。
そこで、KenjiArai様がパッチをあてて公開されている、SDFilesystem.hと
サンプルプログラムで何とか動作させることができました。
mbed内のKenjiArai様のSDカードのNOTEです。
https://os.mbed.com/users/kenjiArai/notebook/sd-card-control-new/#
ここでは、SD CARD CONTROLという、カード用のUTILITYプログラムを公開されてますがここで使われているSDFilesysytemライブラリーでないと現在のmbedOSではSDカード接続できません。
最新のOS5で使いこなすためにはmbedのFORUMで学習しないとできそうもないので、OS5のSDカード読み込みは、PellionDeveiceを始める機会からやります。
●SDカードプログラム
まずは基礎的に動作させる確認用プログラムを作りました。
SDFileSystem.hは、こちらのページからダウンロードします。
https://os.mbed.com/users/kenjiArai/code/SD_Card_Control/
control用のライブラリーは使わないので、SDFileSystem.hだけで動作します。
常に最新のバージョンにしてアップデートしたほうがいいです。
間違えやすいのは、SPIの結線です。
はまるのは、結線が長すぎてノイズだらけになってしまう場合あるのでSPIは注意です。
// example writing to SD card, sford //0a_SDFileSystem_HelloWorld_F446reOK_upOK#include “mbed.h” #include “SDFileSystem.h” Serial pc(USBTX,USBRX); //SDFileSystem sd(PB_5, PB_4, PB_3, PA_4,”sd”); // L432KC SPI3 the pinout on the mbed Cool Components workshop board //SDFileSystem sd(PA_7, PA_6, PA_5, PB_6,”sd”); // FF446 SPSi1 the pinout on the mbed Cool Components workshop board Timer t; int n; int main() { pc.baud(115200); SDFileSystem sd(PA_7, PA_6, PA_5, PB_6,”sd”); // FF446 SPSi1 the pinout on the mbed Cool Components workshop board wait(1); int i; pc.printf(“Hello World!00\n”); mkdir(“/sd/mydir”, 0777); |
●SDカードスロットで性能が違う
中華SDカードスロットを2種類使ってみたのですが、ICがのっている高級なほうが
安定性が良かったです。
SDカードスロットとDIP基板は、なかなか当たりはずれがあるので、
秋月の実績のあるもののほうが安心です。中華スロットは怖いです。
●本番プログラムへ組み込み作業
メモ1:初期設定で、F9Pから時刻データiTowを読んで、ファイル名を時刻にするのですが、F9PからまともにiTowがでてくるまで、待ってからでないと時刻が出てこないので、待ちループをいれて、iTowを得てからファイルOPENしました。
メモ2:MovingBaseモードのUBXデータは、NAV-PVTとNAV-RELPOSNEDだけですが、デリミターが一切ないバイナリデータなのでヘッダをみつけて、判定するのに4バイト比較しないとPVTのヘッダがつかまりません。一度ヘッダを捕まえれば、あとは、172バイトごとにカウントしていけば、ぴったり受信できます。
メモ3:ログの停止機能がついてないので、電源遮断でログが停止するのですが
fclose()をいれなくても自動FLUSHが働いていて常ログされてました。
メモ4:デバッグでデータがSDにきちんと書き込まれているか確認するのにバイナリーエディタとTeraTermを使って、最後は、電卓でバイト数を確認しました。
急に電源オフすると、SDカードのバッファに残ったデータは、SDに書き込まれないで捨てられることがわかりました。大体3センテンスくらいは捨てられます。
●F446REのSDカードログとBTモニター送信機能プログラムソース
mbedオンラインコンパイラです。
あちこちにdebug用pc.printfが埋まってますが、必要ないので消して使います。
//0a_BT_RELPOSNED_Calc_rev05_SD_LunchBox
#include “mbed.h” //pc.printf(“Long_sNo+33,32,31,30=%d,%d,%d,%d\n\r”,bData[sNo+33],bData[sNo+32],bData[sNo+31],bData[sNo+30]); Long=B2L(bData[sNo+33],bData[sNo+32],bData[sNo+31],bData[sNo+30]);//上位ー>下位 //pc.printf(“et:%d,\n\r”,t.read_ms()); } } //======================================================================================================= sprintf(flname,”/sd/%d.ubx”,iTow); //*******************SD WRITING********************************** } |