カクカクの原因判明
と思ったらrotatemotorのデフォルトだとブレーキがかかるからだった。
ブレーキの反動でかくかくしていたのだ。ブレーキを掛けないためにrotetemotorでfalseと入れるとブレーキがかからないfloat型になりかくかくしなくなりました。コレについて記載したサイトは日本語だと10ページないと思う。
ポイント
角度を回転させるためにRotatemotorではでふぉるとではブレーキを使っている。
秒間10回もステアリングをふるのであれば出力は10から20程度で十分
task main()
{SetSensorColorRed(IN_2);
SetSensorTouch(IN_1);
SetSensorTouch(IN_4);
#define TIME 50
int standerd;
int POW;
int currentsensor;
int previoussensor;
int steering =0;
int presteering =0;
int kp=1;
int ki;
int kd=1;
int P;
int I;
int D;
standerd=20;//変数standerdに初期の光量を入力するこれは以後の出力の基準点となる
previoussensor=Sensor(IN_2);//エラーを防ぐためセンサー値を初期化してからループ
while(true){
currentsensor=Sensor(IN_2);//現在の光量を計測する
NumOut(80,LCD_LINE4,currentsensor);//ディスプレイにセンサー2の数値を表示
NumOut(80,LCD_LINE5,kp);//ディスプレイにkpの数値を表示
NumOut(80,LCD_LINE6,kd);//ディスプレイにkdの数値を表示
NumOut(80,LCD_LINE7,steering);//ディスプレイにsteeringの数値を表示
currentsensor=Sensor(IN_2);//現在の光量を計測する
P=(currentsensor-standerd)*kp;
D=(currentsensor-previoussensor)*kd;
if( P < 0 ){
P = 0 ; }
else{
P = P ;}
if( D < 0 ){
D = 0 ; }
else{
D = D ;}
POW =P - D;
steering = currentsensor-standerd;//ステアリング角は現センサー値と目標値との差
steering = steering - presteering;//今回ステアリング角度より前回ステアリング角をマイナスする。なお前回ステアリング値の初回値はゼロなので一回目のステアリングには影響しない。
if( steering < -40 ){
steering = -40 ; }
if( steering > 40 ){
steering = 40 ; }
RotateMotorEx(OUT_C,15,steering,0,false,false);//ステアリング値正で左回転ステアリング値基準値以下であれば左にかじを切るつまり右エッジ走行
presteering = steering ;
OnFwd(OUT_A,-25 );
Wait(TIME);
}
previoussensor=currentsensor;//モータ出力後現在の値を過去の値に代入し塗り替える
}}