【PowerMete2020】スマホBlueTooth受信リアルタイム速度測定<Bainary-Int変換遅いので間引き>

スマホBlueToothからばらばらなデータ数で受信されてくるパワーメーターデータを整理しながらバッファするプログラムできました走らせてみたら、なんと、1バイト受信から1024バイト受信まで大きなばらつきがありました。これらのデータを1Byteも漏れなく受信できるようになりました。そこで、リアルタイム性が大丈夫か検証実験をしてみました。

●リアルタイム性が重要な理由
パワータップを使っていると1-2秒遅れてパワー値がでてくるので自分が踏み込んだ瞬間の値が判りません。人間が認識できる程度のリアルタイム性が欲しいので、多分数十msecの遅延時間以内でないとダメだと思います。

●プログラム各部での速度比較
①BlueTooth受信をバイナリーでバッファにいれたところのスループット
これは、ばらばらの生データ(data[])をつなぎ合わせて、
バッファbufData[bufN][k]に収納するプログラム部分です。

 

//=================bData TO bufData conversion ==================================
//Conversion number check
setN = int((dn-startNo)/30);
//println(“setN=”+str(setN)+”dn=”+str(dn)+”startNo=”+str(startN));if(setN>0)
{for(bn=0;bn<setN;bn++)
{
bufN_1=bufN;
bufN++;//bufData No
for(k=0;k<30;k++)
{
bufData[bufN%250][k]=char(bData[(k+startNo+bn*30)%1500]) ;
info1=”bufData,[“+str(bufN%250)+”],[“+str(k)+”]=,”+hex(bufData[bufN%250][k])+”,startNo=,”+str(startNo)+”,dn=,”+str(dn)+”,setN=,”+str(setN)+”,j=,”+str(j)+”,millis=,”+str(millis());
//info1=”bufData,[“+str(bufN%250)+”],[“+str(k)+”]=,”+hex(bufData[bufN%250][k]);
output.println(info1);
//println(info1);bufiData[bufN%250][k]= int(bufData[bufN%250][k]);
// println(“bufiData[“+str(bufN%250)+”]”+”[“+str(k)+”]=”+str( bufiData[bufN%250][k])+”,bufData=”+hex(bufData[bufN%250][k])+”millis=,”+str(millis()));
}

ここまでは実時間8msec/datasetで遅延なく受信してました。

➁このバイナリ配列bufData[bufN][k]を整数のパワーメーターデータ変換します。
当初は、256の掛け算を繰り返していたら凄く遅いので、
(京セラのTorqueG01のCPUが遅いということですが)
左シフトとOR演算で、バイナリを整数へ変換する方式にしました。

void bufData2int(int m)
{
rtdata=bufiData[m%250][2] | bufiData[m%250][3]<<8 | bufData[m%250][4]<<16 | bufiData[m%250][5]<<24;
ltdata=bufiData[m%250][6] | bufiData[m%250][7]<<8 | bufData[m%250][8]<<16 | bufiData[m%250][9]<<24 ;
edge=bufiData[m%250][10] | bufiData[m%250][11]<<8 |bufData[m%250][12]<<16 | bufiData[m%250][13]<<24 ;
dNo=bufiData[m%250][14] | bufiData[m%250][15]<<8 | bufData[m%250][16]<<16 | bufiData[m%250][17]<<24 ;
tpower=bufiData[m%250][18] | bufiData[m%250][19]<<8 | bufData[m%250][20]<<16 | bufiData[m%250][21]<<24 ;
antvalue0=bufiData[m%250][22] | bufiData[m%250][23]<<8 | bufData[m%250][24]<<16 | bufiData[m%250][25]<<24 ;
antvalue1=bufiData[m%250][26] | bufiData[m%250][27]<<8 | bufData[m%250][28]<<16 | bufiData[m%250][29]<<24 ;
}

BT受信からこの7個の整数変換までのスループットを測定すると23%も遅延してました。

 

③変換時間はどうしようもないので、4データ一回に間引いて、変換時間を間引き時間内の収める対策をしました。

 

●以後 

グラフ描画でまた遅延が発生するので、間引きで稼ぎます。受信データログはバイナリでログすれば、取りこぼしなくログできるのでM5StackでのSDカードでのログが必要なくなりますので、M5StcicCに母艦を交換することも選択できるようになりました。
スマホの性能が効きますので、もっと性能がよいCPUではどうなるかも後日試してみます。

※その後Aquos ZETA  SH-01Gで同じプログラムを走らせたところ、BlueTooth受信で間引きしなくてもデータ受信できました。Processing KetaiライブラリーでもBlueToothの速度を十分生かせることがわかりました。CPUの性能差を調べたら、
■Aquos ZETA SH-01G SNAPDRAGON801(MSM89774AB,2.3GHz,クワッドコア) 

■KYOCERA TOrque G01(MSM8928,1.4GHz,クワッドコア)と40%ほどクロックが遅いCPUであることが分かりました。

コメントを残す

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