前回は、長い「たわごと」で終ってしまったので、今回こそは「NXTねた」にしたいと思います。
今回使うセンサーは HiTechnic社のGyroセンサーです。
(基本です・・・かね!?)
このセンサーは、NXTとはアナログ接続のようで、値の読み取りが早いそうです。
まずは、このプログラムを動かしてみます。
task main()
{
SetSensorHTGyro(S1);
int i;
while(true)
{
Wait(1000);
i=SensorHTGyro(S1,0);
TextOut(0,LCD_LINE1," ");
NumOut(0,LCD_LINE1,i);
}
}
センサーを使う場合の宣言が SetSensorHTGyro( ) です。 カッコの中はセンサーを接続するポート番号を入れます。
センサーからの読み出しは SensorHTGyro( ) 関数を使います。 カッコの中の第一パラメータはセンサーを接続するポート番号で、第二パラメータはoffset と呼ばれるものです。 (これはあとで説明します。 とりあえず、最初は「0」を入れておきます。)
プログラムを実行すると、何やら数値が表示されます。
1秒毎に数値が表示されるハズなのですが、数値はそうは変わらないと思います。
ジャイロセンサーは温度などに敏感に反応するので、そのときの環境で出力の値が微妙に変化するらしいです。
そのため、使う前に、いわゆる較正が必要です。
このプログラムは、較正するための値を出力します。
私の手元では 「-8」が表示されました。
では、この数値を先ほど出てきた offsetのところにセットします。
i=SensorHTGyro(S1,-8);
このように変更して、プログラムを実行すると「0」が表示されます。
(多少の誤差があるので、たまに「-1」や「1」が表示されます・・・)
これで準備が整いました。
センサーを回転してみます。
右回りに回転すると、正の数値が表示されます。
でも、回転を止めると・・・また「0」に戻ります。
逆回転(左回転)すると、マイナスの数値が表示されます。
つまり、回転すると数値が増えたり減ったり・・・止めると「0」
これが角速度です。
停止しているときは角速度は0
右回転をすると角速度が正の値
左回転をすると角速度はマイナスの値
今度は、プログラムを少し進化させて、以下のように修正します。
task main()
{
SetSensorHTGyro(S1);
int i,j=0;
while(true)
{
Wait(1000);
i=SensorHTGyro(S1,-8);
j+=i;
TextOut(0,LCD_LINE1," ");
NumOut(0,LCD_LINE1,i);
TextOut(0,LCD_LINE2," ");
NumOut(0,LCD_LINE2,j);
}
}
これで、変数j には、ジャイロセンサーの値が累積されます。
LCDの1行目は、ジャイロセンサ-の値(角速度)
LCDの2行目は、角速度の累積した値が表示されます。
では、実行してみます。
最初は、1行目も2行目も「0」が表示されています。
ゆっくりとセンサーを右に90度回転します。
途中で1行目の数値が「15」とか「20」とか表示され、2行目にはどんどん加算されていきます。
90度回転したところで止めると・・・
1行目は「0」に戻り、2行目には「80」位の数値が表示されます。
今度は、左にゆっくり回転してセンサーをもとの方向に戻します。
1行目の数値は「-10」とか「-20」とか表示され、2行目の数値はどんどん減ります。
元の方向に戻ったら(90度左に回転し終わったら)停止します。
再び1行目の数値は「0」に戻ります。2行目は・・・「0」ではないけど、「0」に近い数値が表示されていますね。
この、2行目に表示された数値が、「角速度を積分した角度」に相当する値になります。
このプログラムのループは1秒なので
j+=i;
は、正確には
j+=i*1;
となります。
変数i は角速度、数値1は時間(1秒間)
だから、変数j には、角速度×時間 の累積が格納されます。
これが積分! って、気が付くと数学が楽しくなる・・・カモ!
続く・・・