PID値をめぐるはてしない物語 NXT 本体ボタン編 if(ButtonPressed(BTNRIGHT, false)){
PID値をいちいち入力してコンパイルしているのめんどくさいからNXT本体のボタンを押すと数値を追加するようにした。
buttonpressed文について説明しているページはグーグルが日本語でキャッシュしているページにはない。
nxc チュートリアルページをみて格闘40分出来ました。
いままでNXT本体のボタンを使った自販機のLEGOとかどのようにしていたのか気になっていたがコレでクローンコピーが出来る。なにより、タッチセンサーを新たに購入する必要が無くなったためコレは大きいと思う。
しかしボタンを押したときの構文をはっけんすることすらこんなにかかる!!
NXC職人は日本にはいないのか?
↓から類推するの大変だった。
Constants to specify which button to use with button module functions. More...
Defines
#define BTN1 0
#define BTN2 1
#define BTN3 2
#define BTN4 3
#define BTNEXIT BTN1
#define BTNRIGHT BTN2
#define BTNLEFT BTN3
#define BTNCENTER BTN4
#define NO_OF_BTNS 4
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
task main()
{SetSensorColorRed(IN_2);
SetSensorTouch(IN_1);
SetSensorTouch(IN_4);
#define TIME 100
int standerd=20;//変数standerdに白黒の中点を入力するこれは以後の出力の基準点となる
float POW;
int currentsensor;
int previoussensor;
float kp=0.5;
float ki;
float kd=0;
float P;
float I;
float D;
previoussensor=Sensor(IN_2);//エラーを防ぐためセンサー値を初期化してからループ
while(true){
NumOut(60,LCD_LINE1,SENSOR_2);//ディスプレイにセンサー2の数値を表示
NumOut(60,LCD_LINE2,standerd);
NumOut(60,LCD_LINE3,kp);//ディスプレイにkpの数値を表示
NumOut(60,LCD_LINE4,ki);
NumOut(60,LCD_LINE5,kd);//ディスプレイにkdの数値を表示
if(ButtonPressed(BTNLEFT, false)){
standerd = standerd + 1 ;
}
if(ButtonPressed(BTNRIGHT, false)){
kp = kp + 0.1 ;
}
if(Sensor(IN_1)==1){
ki = ki + 0.1 ;
}
if(Sensor(IN_4)==1){
kd = kd + 0.01 ;
}
currentsensor=Sensor(IN_2);//現在の光量を計測する
P=(currentsensor-standerd)*kp;
I=*1/2*0.1;
D=*2/0.1*kd;
POW =P + I+ D;
OnFwd(OUT_C,40 - POW);
OnFwd(OUT_A,40 + POW);
Wait(TIME);
previoussensor=currentsensor;//モータ出力後現在の値を過去の値に代入し塗り替える
}}