【パワーメーター】ペダリングSimulatorでデバッグ<LPC1768で>

Processingでペダリングベクトルプログラムへパワーと効率の円錐グラフを作っていくのですが、デバッグ作業をバイクを踏みながらやるのが大変なので、今までは、サンプリングデータのCSVファイルをProcessingで読み込みながらデバッグしていたのですが、今回は、リアルタイムアニメーションなので、Serial通信のスループットの影響もでるので、マイコンから条件を振ったデータを送信してProcesingでUSBシリアル受信処理してリアルタイムアニメーションすることにしました。
●LPC1768でPedaling波形のSimulator
踏力の大きさとペダリング効率をクランク角度毎に増減させながら適当なペダリング波形を作って、Xbeeで出力している場合と同様のパラメータをUSBシリアルへ出力するmbedプログラム作りました。手間がかかったのですが、これから、ペダリングデータをいろいろ処理するプログラムを作るにあたって、毎回バイクからデータをサンプリングしていたら効率が悪いのでSimulatorを作りました。①、②で実際と比較してありますが、TorqueとBend波形が本物とはかけ離れてしまいました。後ろ半分の回転は難しいですがデバッグへの影響は少ないとみてます。
デバッグしながらSimulatorの数値を変更して改良していきます。
①Simulatorでの出力波形

②実際のペダリング波形例

●Simulatorプログラム 備忘録 mbed LPC1768
ポイントは、リアルタイムにデータを出力するのでケイデンスと同期させて角度分解能のWAIT時間を調整するようにしておくことです。
——————————————————————————-

#include “mbed.h”
Serial pc(USBTX,USBRX);
Timer t;
int i=0;
float PI=3.1415;
float timed=0.005;//5msecサンプル
float cadence=120;
float period_1deg;
float kyori=0;
//force moment
float Torque=0;
float Torsion=0;
float Bend0=0;
float Fvc=0;//踏力ベクトル大きさ常に正
float Fzc=0;//接線ベクトルTorque=Lc*Fzc
float Fzc_1=0;
float Fyp=0;
float Ly=6;
int Td=1;//Torque±方向
int Bd=1;//Bend±方向
float Lc=17;//クランク長
float Ang_c=0;//クランク角
float kyokaku=0;//atan(Fzc/Fvc)*180/PI
float Effecs=0;//効率 Effecs=Fzc/Fvc
float Effecs_1=0;
float effecs_ave=0;
float effecs_30=0;
float Shigotos=0;//仕事量
float shigoto_sum=0;
float Powers=0;
float Times=0;
int main(){
pc.baud(115200);
t.start();
period_1deg=(60/cadence)/360;//1度の周期sec
pc.printf(“****************Start period=%3.3f\n\r”,period_1deg);
while(1){
//発生

wait(period_1deg);
i++;
Ang_c=359-i%360;
Effecs=abs(sin(Ang_c/180*PI));
Fvc=10+10*abs(sin(Ang_c/180*PI));//Fvc水平でMAX
if(Ang_c<180){//後ろ半回転
//Fzc=-Fzc;
Fvc=5-5*abs(sin(Ang_c/180*PI));//Fvc水平でzero
//Fvc=Fvc*abs(cos(Ang_c*PI/180));
Effecs=Effecs*0.2;
}
Fzc_1=Fzc;
Fzc=Effecs*Fvc;
Torque=abs(Fzc*Lc);
Bend0=sqrt(pow(Fvc,2)-pow(Fzc,2))*Ly;
Torsion=Fzc*Ly;
//方向定義———————————-
if(Ang_c>=0 && Ang_c<90){//1象限
Fzc=-Fzc;
Torque=-Torque;
Bend0=Bend0;}
if(Ang_c>=90 && Ang_c<180){//2象限
Fzc=Fzc;
Torque=Torque;
Bend0=-Bend0;}
if(Ang_c>=180 && Ang_c<270){//3象限
Fzc=Fzc;
Torque=Torque;
Bend0=-Bend0;
}
if(Ang_c>=270 && Ang_c<360){//4象限
Fzc=Fzc;
Torque=Torque;
Bend0=Bend0;
}
//———-積分———————————
kyori=Lc*PI/180/100;//1度ずつ積分半円周cmをmへ
shigoto_sum=shigoto_sum+(Fzc+Fzc_1)/2*kyori*9.8;//Nm
effecs_ave=(Effecs+Effecs_1)/2;
//pc.printf(“EveryLoop:Ang_c=%3.1f,shigoto_sum=%3.2f,Fzc=%3.4f,Fzc_1=%3.4f,kyori=%3.3f,effecs_ave=%2.3f\n\r”,Ang_c,shigoto_sum,Fzc,Fzc_1,kyori,effecs_ave);
if (int(Ang_c)%30==0){//30度の倍数
Shigotos=shigoto_sum;
shigoto_sum=0;
effecs_30=effecs_ave;
Effecs_1=Effecs;
effecs_ave=0;
//pc.printf(“30do:Shigotos=%3.3f,effecs_30=%3.3f\n\r”,Shigotos,effecs_30);
t.stop();
Times=t.read();
t.reset();
t.start();
Powers=Shigotos/Times;
//pc.printf(“In30:Ang=%3.1f,Pwr=%3.1f,Tim=%3.3f,Sgt=%3.3f,eff=%3.3f,Trq=%3.3f,Trs=%3.3f,Bnd=%3.3f,Fvc=%3.3f,Fzc=%3.3f\n\r”,Ang_c,Powers,Times,Shigotos,effecs_30,Torque,Torsion,Bend0,Fvc,Fzc);
}//ifend
pc.printf(“%3.2f,%3.2f,%3.2f,%2.3f,%3.3f,%3.3f,%3.3f,%3.3f\n\r”,Ang_c,Torque,Bend0,effecs_30,Shigotos,Times,Fyp,Fvc);

}//while loop

}//main END

 

●以後
明日中にProcessingパワーと効率のグラフィックとベクトルの組み合わせたアニメーションプログラムを作ります。
前回のアニメーションは下記YOUTUBEにあります。
これにパワーと効率のアニメーションを加えます。

コメントを残す

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