クランクへの取り付けが完了したので、母艦M5Stackのデータ処理プログラム整備してます。
左右別々で上死点同期信号付きで順不同で受信されるので、順序をそろえて、1本のデータにまとめてUSBシリアルとSDカードへ出力する機能を追加しました。
●ESP-NOW 左右データ順は時々狂う
数百データに一回くらい左右のデータの受信順序が逆になります。
そこで、MACアドレスを見ながら左右2つのデータを1本にまとめるプログラム
作りました。
M5StackのESP-NOWのプログラムの受信は、OnDataRecv()という割込み関数内で全て実行されます。私は、この割込み関数内にデータ処理を全部詰め込んであります。
大きな配列をグローバルに定義して関数内で使うとどうも安定しなかったことがあったので外に出すのは処理が終えたデータをSDカードとUSBシリアルへ出力するだけで
loop()では、受信データを扱わないことにしました。
//************************************************************************************************* //*****************************受信関数(コールバックデフォルト)*************************************** //*************************************************************************************************** //*************************************************************************************************** void OnDataRecv(const uint8_t *mac_addr, const uint8_t *data, int data_len) { char macStr[18]; /* //———————1SET OUTPUT parameters———————————————– char Macadr,Macadr_1; int dNo,dNo_1; int tdata,tdata_1; int cNo,cNo_1; //———————————————————————- */ snprintf(macStr, sizeof(macStr), “%02X:%02X:%02X:%02X:%02X:%02X”, mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); //——–受信データ記憶—————————————— Macadr_1=Macadr; dNo_1=dNo; tdata_1=tdata; cNo_1=cNo;//debug //Serial.print(“value2=”); //Serial.print(value2); //Serial.print(“value2_1=”); //Serial.println(value2_1); //debugged value0=data[0]+data[1]*256+data[2]*256*256+data[3]*256*256*256;//dataNo 8msec sampling value1=data[4]+data[5]*256+data[6]*256*256+data[7]*256*256*256;//tdata Torque data value2=data[8]+data[9]*256+data[10]*256*256+data[11]*256*256*256;//cNo JOushiten Cycle No /* ===============DEBUG TrueData===================================== Serial.print(“TRUE:”); Serial.print(“,”); Serial.print(mac_addr[5],HEX); Serial.print(“,”); Serial.print(value0); Serial.print(“,”); Serial.print(value1); Serial.print(“,”); Serial.print(value2); Serial.println(“”); */ //——受信データ更新—————- Macadr=mac_addr[5]; dNo=value0; tdata=value1; cNo=value2; //if(value2!=value2_1){edge=1;} //if(value2==value2_1){edge=0;} edge=1000*abs(value2-value2_1); //———————————– /*Serial.print(“Macadr=”); Serial.print(Macadr,HEX); Serial.print(“Macsdr_1=”); Serial.print(Macadr_1,HEX); Serial.println(“::”); */ if(dNo==dNo_1 && Macadr!=Macadr_1 )//1SET OUTPUT OK? { value2_1=value2; //————-L-R Junban———————– if(Macadr==0x30) { lMacadr=Macadr; rMacadr=Macadr_1; ltdata=tdata; rtdata=tdata_1; ldNo=dNo; rdNo=dNo_1; lcNo=cNo; rcNo=cNo_1; } if(Macadr==0xE8) { lMacadr=Macadr_1; rMacadr=Macadr; ltdata=tdata_1; rtdata=tdata; ldNo=dNo_1; rdNo=dNo; lcNo=cNo_1; rcNo=cNo; } //======================data Log to SD Card============================================= String sdStr;//Macadr,dNo,tdata,tdata_1,cNo,cNo_1 //sdStr=”True:”+String(mac_addr[5],HEX)+”,”+String(value0)+”,”+String(value1)+”,”+String(value2);sdStr=String(ltdata)+”,”+String(rtdata)+”,”+String(ldNo)+”,”+String(lcNo)+”,”+String(rcNo)+”,”+String(lMacadr,HEX)+”,”+String(rMacadr,HEX); file.println(sdStr); //=============LR==================== |
●ローラ台でのペダリングをCPLTでリアルタイムで見た
リアルタイムに左右踏力を見ながら漕ぐと楽しいです。
パワーメーターだと1秒ごとに数値がでるだけなので、面白くないです。
■全てのペダリング波形でいえることですが、上死点下死点で踏力がゼロにならないで、しばらくは推進力が働いてます。
安定してペダリングを回していくと左右波形も似た形状になってきました。
●以後
左クランクは携帯用モバイルバッテリなので、電流下限制限がついてるので、落ちてしまいます。そこで、LEDで必要な電流を流しながらモバイルバッテリを使えるようにしないといけませんでした。
パワー値に近い値として左右波形の上死点ー下死点間での積分値のプログラムを作って
半回転毎にM5StackのDIPLAYに表示しようと思います。
更に、PowerTapのパワー値もANT+モジュールで受信してM5Stackへいれて、リアルタイムに比較できるようにしたいです。
本命は、シートチューブのひずみ波形とクランクの波形比較なので、そこからしないといけません。
4Chのサドル下基板と母艦M5StackとのUART通信での時間精度を確認実験してみます。