スマホ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であることが分かりました。