ライントレースロボット ステアリング型 オンオフ制御
こちらが完成形ただし幅が2chのニチバン黒テープをあっさりまたぐ。
ETロボコンは幅が3chのラインで最小R半径は30chとかなりシビアな戦いをしている。
1単位あたりのタイムを50ミリSECに変えてもそれほど挙動は変わらないし、
このへんがNXTの限界なのか?コードが長過ぎて悪いから遅い反応しかできてないのか?
ううーむ曲がれない。
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 kp=1;
int ki;
int kd=1;
int P;
int I;
int D;
standerd=20;//変数standerdに初期の光量を入力するこれは以後の出力の基準点となる
previoussensor=Sensor(IN_2);//エラーを防ぐためセンサー値を初期化してからループ
while(true){
NumOut(80,LCD_LINE4,SENSOR_2);//ディスプレイにセンサー2の数値を表示
NumOut(80,LCD_LINE5,kp);//ディスプレイにkpの数値を表示
NumOut(80,LCD_LINE6,kd);//ディスプレイにkdの数値を表示
NumOut(80,LCD_LINE7,steering);//ディスプレイにsteeringの数値を表示
if(Sensor(IN_1)==1){
kp = kp + 1 ;
}
if(Sensor(IN_4)==1){
kd = kd + 1 ;
}
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;
if(currentsensor<28){
steering=steering+20;//steering値更新steering値プラマイ30以上であるならそれ以上推移しない
if(steering >41 ){
steering = 40;}
RotateMotor(OUT_C,60,steering);//motorsyuturyoku
OnFwd(OUT_A,-25 );
Wait(TIME);
RotateMotor(OUT_C,60,-steering);
}
else{
steering=steering-20;//steering値更新
if(steering <-41 ){
steering = -40;}
RotateMotor(OUT_C,60,steering);
OnFwd(OUT_A,-25 );
Wait(TIME);
RotateMotor(OUT_C,60,-steering);
}
previoussensor=currentsensor;//モータ出力後現在の値を過去の値に代入し塗り替える
}}