【パワーメーター2019】USBシリアル複数ポート同時受信Pgm出来た<4msecずれる>

左右クランクの波形の周期関係がずれて重なってしまう現象の解析を継続してます。
 左右でUSBシリアル2ポートでPCで同時受信してTeraTerm2個立ち上げて受信して
1msec以内の同期誤差でデータを測定できるのですが、リアルタイムグラフで見られないので
ペダリング動作をいろいろ変えながら現象を観察することができませんでした。

●TeraTerm以外で2ポート同時受信するプログラム
 VBAでは、遅いし、VB.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 data

void 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ポート同期誤差測定と同様です。

【パワーメーター2019】TeraTermのタイムスタンプ精度<1秒後に同期する>

この方法で測定した結果をEXCELでみると MASTERマイコンに対して、SLAVEマイコンのタイムスタンプデータが4msecほど遅れてリセットされてました。

確認のために、TeraTermで受信した場合は、やはり1msec以内でしたので、素人プログラムでは、
4msec遅延してしまうという結果でした。

●以後
4msec遅延が一定なので、グラフを書くときに、補正させれば同期はできるはずなので
  リアルタイムグラフを作ります。



 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です