左右クランクの波形の周期関係がずれて重なってしまう現象の解析を継続してます。
左右でUSBシリアル2ポートでPCで同時受信してTeraTerm2個立ち上げて受信して
1msec以内の同期誤差でデータを測定できるのですが、リアルタイムグラフで見られないので
ペダリング動作をいろいろ変えながら現象を観察することができませんでした。
※2022年1月追記 USB HOST付きマイコンが便利
その後、GNSS RTK開発テーマでUSBの端末を4個接続しなければならなくなりました。USB HOST機能付きのマイコンが入手しやすくなってきたので、USBHOST機能を使ってUSB4ポート接続してみました。ポート間の遅延は、1msec以内ですが、各ポート名がUSBハブによってばらつくので、初期化時に順番をチェックする機能が必要です。PCのUSBでポートを合体させるよりマイコンで合体させてからPCへ送信したほうが、データの扱いが楽になります。
※2020年10月追記ー本記事は2019年版の古い記事ですので最新の情報をご覧くださいー
ここ数年で実現したかったUSB複数ポート受信でデータを同期させるプログラムVB.NETで実現できました。ポイントは、バッファを1データを読み込み毎にクリアすることです。詳細はこちらのページにあります。
●TeraTerm以外で2ポート同時受信するプログラム
VBAでは、遅いし、VB.netは、未だ慣れないので、
(2020年後半でVB.NET自在に使えるようになりました研究お仕事の用途なら.NETプログラムお勧めします)
Processingで複数シリアルポートができるが検索するとありました。
https://kousaku-kousaku.blogspot.com/2008/10/arduino-processing.html
単に、2つのポートを定義すればいいだけでした。
早速書いて動作させてみました。サンプリング中のWINDOWをCTRLP5を使って表示させてます
受信プログラムで道草くたいたくないので、バッファとして60万個の配列変数を2個宣言して、
1msec周期のマイコンからのマイクロ秒タイムスタンプを記憶させます。
終わりにしたいときは、q キーをおして割り込みをいれると、それまで記憶していた
配列変数をコンソールの表示してからファイルにログして終わるプログラムです。
// Example by Tom Igoe import controlP5.*;//Display library ControlP5 cp5tl; Textlabel tl1,tl2;//for Display import processing.serial.*;//USB Serial library PrintWriter output;//Filing library int lf = 10; // Linefeed in ASCII int cr=13; //Carriage Return in ASCII String myString1 = null;//1st Recieved data as string String myString2 = null;//2nd Recieved data as string String [] splt_arry=new String[100]; Serial myPort1; // 1st serial port Serial myPort2; //2nd serial port int i,j; int elapsedTime; int startTime; int endTime; int endFlag=0; String [] mystringArry1=new String[600000];//1stArray declaration Buffer memory recived 600K data String [] mystringArry2=new String[600000];//2nd Array declaration Buffer memory recived 600K datavoid setup() { //===================Display setup=================== size(600,100); background(0,0,0); PFont font; font=createFont(“Times New Roman”,30); textFont(font);cp5tl=new ControlP5(this); tl1=cp5tl.addTextlabel(“lable1″); tl1.setText(” Data Sampling ==>Push ‘q ‘ save CSV&Stop”); tl1.setFont(font); //======================================================= // ********************Serial setup=********************** //List all the available serial ports printArray(Serial.list()); // Open the port you are using at the rate you want: myPort1 = new Serial(this, Serial.list()[1], 115200); myPort1.clear(); myPort2 = new Serial(this, Serial.list()[2], 115200); myPort2.clear(); // Throw out the first reading, in case we started reading // in the middle of a string from the sender. myString1 = myPort1.readStringUntil(lf); myString1 = null; myString2 = myPort2.readStringUntil(lf); myString2 = null; //********************************************************** //——————Save FIle setup————————————————————– String filename = nf(year(),4) + nf(month(),2) + nf(day(),2) + nf(hour(),2) + nf(minute(),2) ; // 新しいファイルを生成 output = createWriter( filename + “.csv”); i=0; j=0; //———————————————————————————————– }void draw() { while (myPort1.available() > 0 && myPort2.available() > 0) { myString1 = myPort1.readStringUntil(cr);if (myString1 != null) { i++; splt_arry=splitTokens(myString1,”\n”); myString1=splt_arry[0]; //print(“1-“,i,myString1); mystringArry1[i]=myString1; } myString2 = myPort2.readStringUntil(lf); if (myString2 != null) { j++; splt_arry=splitTokens(myString2,”\n”); myString2=splt_arry[0]; //println(“2-“,j,myString2); mystringArry2[j]=myString2; } } }void keyPressed(){ int k; String matome; String[] datastr=new String[100]; if( key == ‘q’ ){ for(k=0;k<i/2;k++){ matome=mystringArry1[k]+”,”+mystringArry2[k]+”\n\r”; print(matome); output.print(matome); /*output.print(“-1”); output.print(mystringArry1[k]); output.print(“2-“); output.println(mystringArry2[k]); */ } output.flush(); output.close(); exit(); }} |
●このプログラムでの2ポートの同期誤差測定
測定方法は前回TeraTermの2ポート同期誤差測定と同様です。
この方法で測定した結果をEXCELでみると MASTERマイコンに対して、SLAVEマイコンのタイムスタンプデータが4msecほど遅れてリセットされてました。
確認のために、TeraTermで受信した場合は、やはり1msec以内でしたので、素人プログラムでは、
4msec遅延してしまうという結果でした。
●以後
4msec遅延が一定なので、グラフを書くときに、補正させれば同期はできるはずなので
リアルタイムグラフを作ります。
※2020年7月追記
2019年は、複数のマイコンから無線IFからのmsec単位の時系列データ同時受信の同期で苦労しました。
●大変だった理由
理由1:遅いマイコンの受信処理だとリアルタイムなデータ順でログできなかった。
理由2:無線IF(Xbee、BlueTooth)では、115200bpsで通信データ落ちが発生してしまうため、5分以上ログするとデータ間の同期ずれ発生
結局、マイコンでデータをどうじ受信しないでPCで同時受信することになったのですが、ロードバイクのデータをPCもしくはラズパイを持ってログしなければならないというのも嵩張るので、使い勝手が悪く、結局常用はできないという結果になりました。
●2020年では、マイコンと無線を変更して、2019年の課題をクリアできました。
ESP32系のCPUでWiFi系無線規格を使うことで、高速で精度のよいマルチチャンネル無線データ通信が実現できました。
おかげで、過去3年間使ってきた、Xbeeは、2020年以降は出番がなくなりました。
特に、ESP32系のM5Stack,M5StickC,M5Atomシリーズは、オールインワンで
超小型の実装されているので自分でCPUシステムを基板に組むより小型でIMU、DISPLAY、コネクタ類の高密度実装ができているので、電子工作の手間を大幅に省略してくれて、コストパフォーマンスが良いデバイスだと感じました。
無線もBlueTooth(BLEとClassicBT)とWiFiがついているのでなんでも使えます。特に、ESP32独自規格のESP-NOW無線通信規格がIOT系の電子工作では、非常に使い勝手がよく、無線データ通信は、これ一本で簡単に速く正確にできるようになりました。
特に複数マイコンからの高速データ受信が超簡単にできるので、最大5個からの無線同時受信まで簡単にできてしまいました。
ESP-NOWの記事群は下記カテゴリーにあります。
http://shinshu-makers.net/shinshu_makers/category/%e3%83%87%e3%83%90%e3%82%a4%e3%82%b9/esp-now/
事例1