次に方向転換のプログラムを作ってみたいと思います。方向転換はモーターAとモーターBを互いに逆に回転させるだけです。その場で回転するため「真地回転」と言います。
では、モーターをどれくらいの角度で回したらいいのか。それを計算で求めてみたいと思います。ものさしで計ったところ、タイヤの直径は5.7cmでした。円周は「直径×π」なので、タイヤの円周は約17.9cm。つまり、モーターを一回転させると、約17.9cm進むということになります。
真地回転をした場合、タイヤの進路は赤い円の上になるはずです。ものさしでタイヤの間隔を計ると9.5cmでした。なので、円周は9.5×π= 約29.8cm。その距離をタイヤの円周で割ると、モーターに必要な回転角度が求まります。
360×29.8÷17.9=597.6…
…これがロボットが360度方向転換に必要なモーターの回転角度です。タイヤを約597度回せば、ロボットが360度方向転換できることになります。さらにこれを4で割ると、
597÷4=149.25
…90度の方向転換に必要な回転角度となります。
…一周できずにプログラムが終わってしまいました。失敗です。
なぜ失敗したのでしょうか?
これが失敗してしまったプログラムです。「ループの開始」に4の数字が入っているのは、90度ずつの方向転換を4回(90×4=360度)行う予定だったためです。
うまくいかなかった原因はモーターAとモーターBの回転スピードが違ったためです。このプログラムではモーターAだけを監視していたため、モーターBの速度が遅いと途中で回転を終わらせてしまっていたのです。モーターの回転速度が違うのは、製品のバラつきでしょうか?
この問題を解決するためには、モーターAとモーターBの回転角度を同時に監視する必要があります。
[DOWNLOAD]作成したプログラム(Robolab2.9用)
そこで「タスク」という機能を使います。タスクというのは仕事のことです。
たとえばラーメンを作る時、めんをゆでることとスープを温めることを同時に行ったほうが能率がいいです。この場合「めんをゆでる」と「スープを温める」がタスクに相当します。
同じようにプログラムでは「モーターAを回す」というタスクと「モーターBを回す」というタスクを同時に行う必要があります。
90度方向転換しました。
さらに90度方向転換しました。
プログラムです。
「タスク分岐」を使って、モーターAとモーターBを同時に監視しています。 2つのタスクはどちらが先に終わるか分かりません。そこで、A側のタスクがB側のタスクが終わるまで待つようにしました。
タスクの終了を伝える方法としてコンテナを使いました。コンテナというのは変化する値を格納することができる入れ物(変数)です。
[DOWNLOAD]作成したプログラム(Robolab2.9用)