最近,気づいたのであるが,「288話」とか「289話」でググるとこの「こうしろうのMindStorms日記」が上位にリストアップされる。1999年の秋に始まった本連載は,もう丸十年を経過した。手前味噌だが,この長寿ぶりは珍しいものなのかもしれない。

 さて,前々回(第289話),前回(第290話)を読んでいただいた方には,きっと合点がいかないことがあると思う。

 「回転数,回転数というが,NXCのMotorTachoCount関数が返す回転数とは何なのか?」である。前回作成したプログラムでは,OnFwdSync(OUT_BC,75,0)でモーターBとCをシンクロさせて,75のパワーで回転させている。Wait(1000)で1000ミリ秒(1秒)間待ってから,iNum1 = MotorTachoCount(OUT_B)で回転数を測っている。その値が,480程度なのである。

 このロボットのタイヤが1秒間に480回転したら大変なことである。分に直すと28,800回転になる。自動車のエンジンのレッドゾーンなぞ,とうに振り切ってしまっている。そればかりか,ゼロヨンでもF1でも何でも来いという数値だ。

 では,この回転数とは何なのだろう?

上記の前回作成したプログラムでロボットを1秒間走らせてみる。MotorTachoCount関数はどちらも479という値を返した。進んだ距離は24cmほどだ。

 NXCには,RotateMotor(outputs,pwr,angle)という関数がある。outputsには出力ポートを,pwrにはパワーを,そして,angleには角度を指定する。

 479という数値をangleに指定してロボットを走らせてみると,ほぼ同じ距離を走った。「ほぼ」という表現が微妙なのだが,OnFwdSync(OUT_BC,75,0),Wait(1000)の後,Off(OUT_BC)でブレーキを掛けるのと違い,RotateMotor(OUT_BC,75,479)は指定した角度だけモーターを回転させるので,少しだけ移動距離は短くなる。

 RotateMotor(outputs,pwr,angle,turnpct,sync,stop)という関数を使うと,最後の引数でモーターにブレーキを掛けるかどうかを指定することができる。

 RotateMotor(OUT_BC,75,479)をRotateMotorEx(OUT_BC,75,479,0,true,true)に変更しても移動距離は同じだったので,ブレーキは同じように掛かっているようだ。ちなみに最後の引数をfalseにすると,ブレーキは効かず,指定した角度だけモーターを回したあと,電源の供給が止まるだけだった。

 次に,どれぐらい正確にモーターの軸が動くのかを試してみる。

 90度,モーターAを回すプログラムを実行してみる。モーターのスピードが75だと,90度より少しオーバーしてしまうが,スピードをRotateMotor(OUT_A,25,iNum1)と変更して,ゆっくり回すとほぼ正確に90度分回転した。

モーターのスピードや動かすものの重さによってブレは出るが,細かい動きはRotateMotor系の関数で角度を指定する方が確実にロボットを制御できるようだ。

 どうぞ,正月休みに,無料で利用できるNXC言語でロボット・プログラミングに挑戦してみてください。インストール方法については,第283話に書いてあります。それでは,良いお年を。