クランクの左右トルクデータをXbee無線通信で母艦NUCLEOF446REで受信しようとしたのですが左右を割り込みで受信しても、数msecから最悪20msecも処理がかかるため、Xbeeから4msec周期で送信されるデータを取りこぼしてしまうため。マイコンでのLoggingは、やめて、右用と左用でマイコンを2つ用意して、USBシリアル2ポートでPCでLoggingできるか実験してみました。
●PCのスレッドの切り替え速度を測定
マイコンから最高速度でPCへ転送した場合、PCがどこまで
正確に、データをログできるか測定してみました。
■やり方:
10byteASCIIデータを460800bpsでPCへ転送、
PC側は、USBシリアル2ポートをTeraTerm2個g立ち上げてマルチタスクで受信
時間測定は、1万個データ転送に要した時間を1万で割って、1データ転送あたりのスループットを転送速度とします。
NUCLEOF446REを2個使いました。coretexM4 180MHzです。
https://os.mbed.com/platforms/ST-Nucleo-F446RE/
mbed側のプログラムは、F446RE2個に同じものを書き込みます。
Tickerを使って周期を指定して送信します。
1万個データを送ったら、経過時間を送信します。1万回で平均してスループットを
求めると安定した通信か不安定か実力が見えます。
#include “mbed.h” Serial pc(USBTX,USBRX); InterruptIn Lup(PB_3); //DigitalOut Rup(PB_3); Timer t; Ticker tick; int i=0; int mark=0; void douki(){ mark=1; } void ti(){ i++; pc.printf(“%d,%d\n\r”,i,mark); mark=0; if(i%10000==0){ pc.printf(“*************Time10K=%d\n\r”,t.read_us()); //t.reset(); } } int main() { pc.baud(115200); Lup.rise(&douki);//Lup EdgeRise do Up tick.attach_us(ti,1000);//100usec douki t.start(); while(1) {} } |
PCは、愛用のThinkPad X230 Corei5-3230M 2.6GHz 8GMmeory SSD240GB
USB 3.0です。USB3.0のUSBハブでPCと接続しました。
●最高速度測定結果
460800bpsで10byteデータを転送した場合USBシリアル2ポートでTeraTerm2個で同時受信した場合、
結果1:460800bpsでは、250μsec周期が最高速度となる。
結果2:10-100μsecでスレッドの影響があるが100μsec周期以上なら、スレッド影響はでない。
結果3:115200bpsの場合は、1msec周期が最高速となる
●実際に使うモバイルPCでロギングを実験してみた。
171mmx151mmx30mmと小さいのでフロントバッグにすっぽり入ります。
バッテリは4時間近くもつので、50-60km走行データログできます。
2009年製造のUMPC(UltraMobilePC)である
FMV BIBLO LOOX U/C 40Nを愛用してます。
WINDOWS XPフル ATOM A530 1.6GHz HDD60GB USB1 BT1 WIFI
https://www.itmedia.co.jp/pcuser/articles/0902/24/news051.html
https://www.fmworld.net/fmv/pcpm0904/biblo_loox/lu/method/index.html
これで、1時間半ほど連続してTeraTerm2個でのロギング実験した結果
1msec周期±10μsecで2ポート同時ロギング可能でした。
●UMPCのロガーは高性能で誰でも簡単に使える
非力なマイコンで、苦労してデータを高速にロギングするのがバカバカしくなる結果です。要するにサイズと電池を犠牲にすれば、サンプリング周期1msec~250μsecまで
多CH同時長時間ロギングが可能なので、旧型UMPCは、電子工作実験では、非常に有用な携帯ロガーになることが判りました。RASPIなどで、データをロギングするより遥かに高性能なロガーがだれでも簡単に操作できるので、これからもUMPCでのロギングを普及させたいと感じてます。
●マイコン側
UMPCに接続するマイコンは、UARTが2個以上ないといけませんので
coretex M4以上でないといけませんので、電池とスペースは食います。
小さくて使えそうなM4 マイコン探してみます。
●データの同期
左右クランクのデータ同期は、右用母艦から信号を送って左用マイコンでエッジ割り込みでデータのマーキングして、同期すればOKです。データの同期精度は、数十μsecですのでマイコンで、割り込みをいれても遅延をこのレベルに抑えられないと思いますのでPCロガーの圧勝だと思います。要するに電池とサイズで力ずくでデータを高速に
ロギングすればいいということでした。
※2日後
USBって480Mbpsなのに、なんで数十kbps程度の通信で
苦労しなければいけないのか不思議だなと素朴な感想を
持ちました。折に触れてUSBの転送速度とマイコンの
USBシリアルについて、学習したいと思います。
こちらのページでUSBの速度について解説がありますが
普段、空気のように使っているUSBですが、奥が深いことが
判ります。USBを利用する場合の基礎知識としてあったほうが
真実がわかっていいと思いました。
http://mcn.oops.jp/usb/spec/480mbps.htm