NXTプログラミング(5)


モーターを出来る限り正確に制御したいので詳しくテストしていく。
まず、モーターの状態は、COMポートをopenしたあと、NxtCommunicator.GetOutputStateで取得できる。


try
{
NxtGetOutputState s = nc.GetOutputState(NxtMotorPort.PortB);

label5.Text =
string.Format("Power:{0} RotationCount:{1} Tacho:{2}/{3} {4} {5} {6} {7}",
s.Power,
s.RotationCount,
s.TachoCount,
s.TachoLimit,
s.Mode.ToString(),
s.RegulationMode,
s.RunState,
s.TurnRatio);

// もっかい取得
s = nc.GetOutputState(NxtMotorPort.PortC);

label6.Text =
string.Format("Power:{0} RotationCount:{1} Tacho:{2}/{3} {4} {5} {6} {7}",
s.Power,
s.RotationCount,
s.TachoCount,
s.TachoLimit,
s.Mode.ToString(),
s.RegulationMode,
s.RunState,
s.TurnRatio);
}
catch
{
return;
}


準備完了。さっそくモーターを回す。



nc.SetOutputState(
port, // 出力ポート
(sbyte)power, // 出力パワー(0〜100)
NxtMotorMode.MotorOn | NxtMotorMode.Brake | NxtMotorMode.Regulated,
NxtMotorRegulationMode.MotorSpeed,
0, // turnRatio
NxtMotorRunState.Running,
0 // tachoLimit(タコメータの限界?)
);


ステータスの戻り値である、RotationCountとTachoCountの違いがわからない。モーターを回してみたところ、同じだけ同じように増える。常に同じ値を示している。回転した角度が返ってくる。回し続ければ、360を超えてもintの範囲で、いくらでも増える。逆回転させれば減り続ける。


二つのモーターを同時に回転させるためにBポートとCポートに対して個別にSetOutputStateを送っている。BポートとCポートのRotationCountの差は1%程度。無負荷でNxtMotorRegulationMode.MotorSpeedを指定しているから、もっとぴったり同じように回るのかと思ったが、そうでもないようだ。停止させるときに、若干すべって回りすぎているように思う。


手でモーターを回してみたところ、RotationCountとTachoCountが増えた。きちんと回転数を1度単位で取得できるようだ。これなら、アナログ時計みたいなものも作れそうだ。(実際に作った人がいるらしい)


オレンジのボタンを押して電源を落とすまでは、RotationCountとTachoCountはリセットされない。COMポートをcloseして再度openしても前の値は残ったままである。こうなっているほうが便利なような気はするが、わかっていないと間違った制御をしてしまう。


何せこういう仕様なので、NXTで何か複雑な自動制御を行ないたいときは電源を入れる前に初期位置に手動で移動させてやる、というのが基本になる。