スマートキャリブレーションシステム開発で、負荷側のロードセルと被負荷側の5分力センサを2個のMASTERとして、ESP-NOWでPC側SLAVEに同期転送するプログラムを作って同期時間精度を測定しました。
●同期の方法
slaveのM5AtomliteからブロードキャストでデータNoを送信して、受信したMasterが測定データを返信する
返信データ末尾にデータNoを添付することで、
2個のMasterから同時受信したSlaveが2個のデータを
データNoをそろえて一本化する方式
●結果
20msec周期狙いで、
Slaveが21msec±2msec周期
Master1のSCP1が21msec±4msecのばらつきで送信
Master2のDum5が21msec±2msecのばらつきで送信
Master1が同期受信から送信まで1msec±4msec
Master2が同期受信から送信まで1msec±2msec
20msec周期に対して遅延は5msec以内でおさまっているので、取りこぼしは発生しないが、10msec周期以下は無理なことがわかった。高速化するには、プログラム処理速度を工夫する必要がある。
●測定で使ったプログラム
Slave受信部の割込みコールバック関数
//************************************************************************************** // ===============受信コールバック関数で全部受信============================================ //******************************************************************************************* void OnDataRecv(const uint8_t *mac_addr, const uint8_t *data, int data_len) { char macStr[18]; 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]); //=========================Data align======================================== // SPC SingleAxis data: data[0]=Force,data[1]=accX,data[2]=accY,data[3]=accZ,data[4]=sdata //Dummy 5Axis data: data[0]=FP1,data[1]=Fx,data[2]=Fy,data[3]=Fz.data[4]=FP3,data[5]=FP2,data[6]=sdata //val[0]=Force,val[1]=accX,val[2]=accY,val[3]=accZ,val[4]=sdata, //,val[5]=FP1,val[6]=Fx,val[7]=Fy,val[8]=Fz,val[9]=FP3,val[10]=FP2,val[11]=sdata int strNo=0; int sdata_1=0; String dstr[12]={}; //Serial.println(mac_addr[5],HEX); if(mac_addr[5]==0xCC){strNo=0; }//SPC_SingleAxis 5data//ここで、データがどのMASTERからきたか判別 if(mac_addr[5]==0x2C){strNo=5; }//Dummy 5Axis 7data //====binary 4byte data to integer 4byte data====================== int datanum=int(data_len/4); for (i=0;i<datanum;i++) { val[i+strNo]=data[i*4]|data[i*4+1]<<8|data[i*4+2]<<16|data[i*4+3]<<24;//Left Shift OR //Serial.printf(“val[%d]=%d\n\r”,i+strNo,val[i+strNo]);} //Serial.printf(“val[4]=%d,val[11]=%d\n\r”,val[4],val[11]);if(val[4]==val[11] && val[4]==stime && stime-stime_1>0) //ここで、全データがそろったか判定して1本化 { Serial.printf(“%d,%d,%d,%d,%d,%d,%d,%d\n\r”,val[0],val[1],val[5],val[6],val[4],val[11],stime,rt0); stime_1=stime; }} //************************************************************************************************* |
①SlaveのM5AtomLite用
https://gist.github.com/dj1711572002/d223a49f5e1e2ca792dd60dded646ce2
②Master1のM5StickC用(1chLCと3軸加速度データ)
https://gist.github.com/dj1711572002/7738beb7ee763cbe7003b9d08aaf82a8
③Master2のM5Atomlite用(AD7194 6分力データ)
https://gist.github.com/dj1711572002/693a00100aa261796675037c766bc4b6
●実際にSCPから負荷して5分力センサのレスポンスをCPLTでみた
鉛直下向き押しで、1ch 押し力Forceと 4chFzの波形が重なっているので同時測定1本化ができている。
●以後
負荷とレスポンスで統計処理して相関係数のプログラムへ進みます。