富山は例年になく,12月の初めにまとまった雪が降った。うっかり,ノーマルタイヤのままであった筆者は,久しぶりに恐い目にあった。ブレーキを踏んでも車が止まらないのである。交差点にほかの車が走ってこなかったので事なきを得たが,タイヤ交換は早めに限る。
最近の車は,アンチロックブレーキが装備されているので,ブレーキを踏み続けてもタイヤがロックされて車体が斜めになることはない。でも,どんなブレーキでも,氷が溶けかかっている上では止まらない。真っ直ぐに進むだけだ。
287話「ロボットを真っ直ぐ走らせる」で,NBC言語でモーターの回転数を同期させるOnFwdReg関数やOnFwdSync関数について書いたが,NXCにも同名の関数があり,同じ機能を持っている。
前回の289話「NXCでモーターの回転数を知る」では,NXCのMotorTachoCount関数で走行時間あたりの回転数を測り,液晶ディスプレイに表示する方法を説明した。結局,OnFwdReg関数やOnFwdSync関数は一定の時間間隔で回転数を測り,双方のモーターの回転数を調整しているのだと思う。
では,二つのモーターをシンクロさせて動かしたときの回転数とそうでないときの回転数では,どれぐらいの差があるのかを今回は検証したい。
-------------------------------------------------------------- int iNum1=0; int iNum2=0; task main() { OnFwd(OUT_BC,75); Wait(1000); iNum1 = MotorTachoCount(OUT_B); iNum2 = MotorTachoCount(OUT_C); NumOut(0,LCD_LINE1,iNum1); NumOut(0,LCD_LINE2,iNum2); Off(OUT_BC); Wait(5000); } --------------------------------------------------------------
最初に紹介するプログラム(notSync01.nxc)は,二つのモーターを同期させるのではなく,普通にモーターB,Cを回している。MotorTachoCount関数で回転数を測り,NumOut関数で出力している。
notSync01.nxcで1000ミリ秒(1秒)間の回転数を計測したときの結果は次のようになった。
二つのモーターの1秒単位の回転数は近いときもあるが,かなり差が出るときもある。つまり,バラツキが多いのだ。
-------------------------------------------------------------- int iNum1=0; int iNum2=0; task main() { OnFwdSync(OUT_BC,75,0); Wait(1000); iNum1 = MotorTachoCount(OUT_B); iNum2 = MotorTachoCount(OUT_C); NumOut(0,LCD_LINE1,iNum1); NumOut(0,LCD_LINE2,iNum2); Off(OUT_BC); Wait(5000); } --------------------------------------------------------------
次のプログラム(Sync02.nxc)では,二つのモーターをシンクロさせて回転させるOnFwdSync関数での回転数を調べてみる。こちらも,Sync02.nxcで1秒間の回転数である。
OnFwdSync関数で,BとCのモーターを同期させると,回転数の違いが小さくなっていることがわかる。1秒間で1,2回転程度の差しか出ない。
今度はWait時間を2000ミリ秒(2秒)に増やしてみる。以下に,notSync01.nxcで2秒間の回転数を示す。
OnFwd関数でモーターを動かした場合,BとCの回転数の差がキレイに倍になるわけではないが,大きくなっている。
上記に示すようにSync02.nxcで2秒間の回転数を見てみると,OnFwdSync関数の場合は,秒数を増やしてもモーター間の回転数の差に大きな違いは出てこない。その分,モーターをシンクロさせると,そうでない場合に比べ回転数が落ちることも明らかだ。
さらに,Sync02.nxcで5秒間の回転数の場合を示す。このように5秒間にしても差は大きくならない。なるほど,真っ直ぐ走るはずである。
つづく