2024年11月21日
008-1.EV3ソフトウェア入門-第7回「三角関数の使い方2」
新シリーズのレゴマインドストームである「教育用レゴマインドストームEV3」を使ったプログラミング環境「EV3ソフトウェア」について紹介していきたいと思います。(文/松原拓也)
◆ sin関数とcos関数
今回は前回と同じくSIN関数とCOS関数を使いますが、さらに技術的なレベルを上げて、モーターを使ってロボットを動かしてみたいと思います。
たとえば、こんな感じに8角形を描くような動きをロボットにさせたい場合ですが、 どうしたらいいでしょうか。
45度ずつロボットの向きを変えていけばいいのですが、ここではもう少し工夫して、オムニホイールを搭載させて、ロボットの向きを変えないで45度ずつ移動方向だけ変えてみたいと思います。 なぜ向きを変えないのかというと、数学的にプログラムを考えるさいに都合がいいからです。
レゴマインドストームNXTやEV3で使うことができるオムニホイールを用意します。ここでは、Nexus Automation Limited(NEXUS robot)という会社の「48MM OMNI WHEEL FOR LEGO NXT AND SERVO MOTOR 14108」を買ってみました。レゴ社の純正品ではありません。タイヤの直径は48mmとのことです。
軸受けが2種類入っています。穴が十字になっている軸受けが、レゴマインドストーム用です。もう一つの軸受けはサーボモータ等用ですが、その軸受とねじは使いません。
ロボットができました。
出力ポートAをX方向に移動するモーターにつなぎ、 出力ポートBをY方向に移動するモーターにつなぎました。
裏返すとこんな感じです。
実はこんなふうに90度単位で、振り分けてしまうと、 ロボットの動きがよくないのですが、今回は組み立てやすさと、分かりやすさを優先して、このまま進めていきます。
ちなみに重心が高すぎると、うまく移動できません。 この写真のロボットは失敗作で、勢いよくスタートすると倒れてしまいます。2つ上の写真が完成版なので、それと見比べてみましょう。
◆ まずは右に進むだけ
まずは、X軸で移動するだけのプログラム(sinrobo1.ev3) を作ってみました。 変数「kakudo」が移動したい角度です。kakudoには0が入ってますので、 0度の方向に移動します。 COS関数とSIN関数を使って、計算結果を2つのモータにそれぞれ割り振っています。
プログラムが2つに枝分かれしていますが、これは分岐処理ではなくて、2つのプログラムが同時に動きます。 X軸用とY軸用で2つのモータが同時に動くわけです。
X軸用モータとY軸用モータの回転方向ですが、プラスに回転させると矢印の方向に進みます。マイナスに回転させると矢印の逆方向に進みます。
変数がkakudoが「0」の場合、計算の結果は
・COS(0)→1
・SIN(0)→0
となりますので、ロボットは右に進みます。
では、kakudoが45だとどうなるでしょうか? 答えは、、、
・COS(45)→およそ0.7
・SIN(45)→およそ0.7
、、、となりますので、ロボットはななめに進みます。
モーターを0.7回転させるわけですが、その結果、ななめに進んだ距離はモーター1回転ぶんです。不思議ですね。こうやってSIN/COSを使えば、正確に移動距離の制御ができるのです。
◆ 45度ずつ向きを変える
続いて、 ロボットを45度単位で 向きをかえつつ 移動させてみたいと思います。
移動、移動方向を+45度という制御を繰り返すと、8回目で元の場所に戻るはずです。
プログラムです(sinrobo2.ev3)。ループブロックを使って、8回ループさせてみました。変数kakudoが移動する角度です。
プログラムの機能説明ですが、サイズが大きくなってしまいましたので、分割して紹介します。
まず、前半部分。
移動する角度の計算部分です。 ループ回数に45を掛けて、kakudoに代入しています。
ループ回数は1周目の時に「0」を返します。 2週目には「1」となり、ループのたびに1ずつ増えていきます。
結果としてkakudoの値は0→45→90→135→180→225、、、と45ずつ増えていきます。
モータブロックは回転が完了するまで処理を抜け出しません。 そして、処理を抜け出すタイミングは、モータのパワーしだいだったり、 負荷のかかり具合とか、回転角度に影響されるので、誰にも分かりません。
ループ1回あたりの時間をできるだけ均一にしたいと思いましたので、 ここではタイマを使ってみました。 タイマをモータが回る前にセットして、 モータが回り終わった後にタイマを比較しています。
では、実行してみましょう。
一応、成功しました。8角形を描くように動いてます。
ただ、動きがぎこちないです。。 本来はロボットの向きが変わらないままのはずだったのですが、 だんだんと角度がズレてしまいました。
これは、オムニホイールがうまく空すべりしてくれなかったためですが、オムニホイールの配置が良くないのが原因です。 モーターを3個にして、3個のうち2個が確実に回転してるようにすれば、もうすこし空すべり最低1個に減らせると思います。ただし、そのためにはプログラムがちょっと複雑になってしまいます。
[DOWNLOAD]今回作成したプログラム(教育用EV3ソフトウェア用)
当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。