NXTプログラミング(7)
■ モーターの同期制御
次にモーターの同期制御のテスト。同期制御は、2つの出力ポートに対して、NxtMotorRegulationMode.MotorSynchronizationを指定してモーターを動かすと実行される。2つ目のSetOutputStateをNXTが受信するまで1つ目のモーターも回らない。
試しにB,Cのモーターを同期的に回してみる。
nc.SetOutputState(
NxtMotorPort.PortB, // 出力ポート
(sbyte)power, // 出力パワー(0〜100)
NxtMotorMode.MotorOn | NxtMotorMode.Brake | NxtMotorMode.Regulated,
NxtMotorRegulationMode.MotorSynchronization,
turnRatio,
NxtMotorRunState.Running,
0
);
nc.SetOutputState(
NxtMotorPort.PortC, // 出力ポート
(sbyte)power, // 出力パワー(0〜100)
NxtMotorMode.MotorOn | NxtMotorMode.Brake | NxtMotorMode.Regulated,
NxtMotorRegulationMode.MotorSynchronization,
turnRatio,
NxtMotorRunState.Running,
0
);
turnRatioに0を指定してみると、tachoCountがほぼ一致するように回転が始まった。rotationCountではなく、syncするのはtachoCountである。
つまり、Bポートのモーターを360度正回転、Cポートのモーターを360度逆回転させ、
Bポート : rotationCount = 360 , tachoCount = 360
Cポート : rotationCount = -360 , tachoCount = -360
としてから、いったんモーターのカウントをリセットし、
Bポート : rotationCount = 0 , tachoCount = 360
Cポート : rotationCount = 0 , tachoCount = -360
syncさせながら回転させた場合、CポートのモーターがBポートの値に追いつくためCポートは正回転,Bポートは逆回転を始める。
Bポート : rotationCount = -360 , tachoCount = 0
Cポート : rotationCount = 360 , tachoCount = 0
おそらく「tachoCountの目標値」は、tachoLimitに0が指定されていると内部的には増え続けるはずで、このあと、徐々にtachoCountは増加する方向にB,Cポートのモーターは正回転し続ける。
この「tachoCountの目標値」がstatusとして取得できないのでこの部分の挙動を追いかけにくい。私がわかっていることは、tachoLimitとして非0を指定した場合(tachoLimitはunsignedで、あくまで絶対値である。この符号はpowerとして指定している方向だと考えることが出来る)、powerの符号の方向に「tachoCountの目標値」が毎回移動するということだ。
そして、ここまで書いてきたように、tachoLimitを指定して制御するのは現在の「tachoCountの目標値」が見えないために挙動を調べるだけでも一苦労で、どうもこの周辺はバグ持ちのような気がするので君子危うきに近寄らずである。