2025年1月7日

016-1.EV3で楽しむMakeCode入門-第3回「センサーを読み取る」

マイクロソフトが無償で提供している「Microsoft MakeCode(メイクコード)」というプログラムの開発環境を使ってレゴ マインドストームEV3のプログラミングを行う方法を紹介します。MakeCodeはインターネットに接続されたWebブラウザで動作します。画面上のブロックを組み合わせるだけで、直観的にプログラムを作成することができます。MakeCodeの公式サイトはこちらです。(文/松原拓也)

◆ 計算ブロックと変数ブロックを使いこなす

まずは前回に作成した「ロボットを20cm前進させるプログラム」を手直しするところから始めます。
このプログラムは正しく動作するのですが、内容がわかりにくいという問題があります。たとえば、丸で囲んだ部分の数値は意味がよくわかりません。これは計算が終わった状態になっていて、元の数値が消えているためです。

そこで、計算ブロックを使って計算する前の状態に戻してみましょう。
メニューから「計算」を選択します。たくさんの計算用のブロックが表示されます。

計算用ブロックに置き換えると、こうなります。
「(200÷56)×3.14」という計算を行っています。「200」は前進したい距離(単位はmm)、「56」はタイヤの直径(単位はmm)、「3.14」は円周率です。これで、このブロックでは「20cm進むための回転数を求めている」ことがハッキリとわかるようになりました。移動距離の変更も簡単に行うことができます。

さらに改良を続けます。 メニューから「変数」を選択して、「変数を追加する」ボタンを押します。そして、「kaiten」と入力すると、このように変数と変数用のブロックが作られました。

計算結果を一度、変数kaitenに格納するようにしました。 さらに「数字表示」ブロックを追加して、変数の中身を表示するようにしました。

シミュレータを使ったプログラムの実行結果です。
中央のボタンを押すと画面には「1.137…」と表示されます。これが変数kaitenの中身です。これでモーターが約1.137回転していることがわかるようになりました。 インテリジェントブロックの画面は最初、文字が小さすぎて読むことができないと思います。その場合は、インテリジェントブロックの画面をクリックすると、画面が拡大表示されて、読むことができるようになります。

◆ カラーセンサーの値を読み取る

続いて、カラーセンサーの値を読み取ってみましょう。前回、作成したロボットを用意します。さらにオーバルコースのシートとカラーセンサーを用意します。
ロボットに搭載されているインテリジェントブロックの入力ポート3にカラーセンサーを接続します。

カラーセンサーの値を読み取るにはブロックのメニューから「センサー」を選択します。
メニューの中にはいろいろなセンサーのブロックがあります。 タッチセンサー、カラーセンサー、超音波センサー、ジャイロセンサー、赤外線ビーコンなどが利用できます。 今回は反射光モードのカラーセンサーを使います。

シンプルな確認用のプログラムを作ってみました。 反射光モードのカラーセンサーの値を読み取ります。

シミュレータで実行すると、こうなります。
カラーセンサーの測定値がインテリジェントブロックの画面に表示されます。センサー部分の黄色いバーをクリックすると、センサーの測定値を変更することができます。

◆ ラインをトレースする

続いて、ライントレースロボットを作ってみたいと思います。
ライントレースの方法はいくつかありますが、今回はカラーセンサーを1つだけ使ってトレースさせます。

Port Viewを使ってセンサーの値を確認してみましょう。 カラーセンサーのモードは「COL-REFLECT(反射光)」に設定します。
測定した結果、カラーセンサーの位置によってこのように値が変化しました。このようにセンサーの測定値がわかれば、センサーがラインに対してどの位置にあるのかがわかります。

以上を踏まえて、ライントレースのプログラムを作ってみました。「比例制御」という方法を使ってラインをトレースします。
まず、最初に4つの変数を作成します。内容は次のとおりです。
・「power」:移動時のモーターの基本的な速度を格納する変数です。
・「center」:白と黒の中間にカラーセンサーが位置する時の値を格納する変数です。
・「temp」:一時的に値を格納するための変数です。
・「gain」:ゲインを格納する変数です。ロボットがラインをトレースする時の敏感さに影響します。

プログラムの仕組みを図にすると、こうなります。
最初に白と黒の中間の位置のカラーセンサーの値を変数centerに代入します。次にカラーセンサーの値とcenterとの差を求めて、変数gainの値を掛けて変数tempに代入します。 数式で表すと、「temp=(センサーの値 - center)×gain」となります。この値を2つのモーターの回転速度に割り振ります。出力ポートA側はpower+temp、出力ポートD側はpower-tempです。変数powerは前進時のモーターの基本的な回転速度を格納します。
結果として、カラーセンサーの値が大きいとロボットは左折して、カラーセンサーの値が小さいとロボットは右折します。

プログラムを実行したら、最初に調整を行います。カラーセンサーのライトが床面の白と黒の中間に当たるように位置を合わせてから中央のボタンを押します。うまくいけば、ロボットがラインをトレースします。
もし、トレースできない場合、変数gainの値を変えてみましょう。gainが大きいと、ラインに対して追従するパワーが上がります、そのかわりブレが大きくなります。ブレを抑えたい場合にはgainの値を小さくします。

今回作成したプログラム(MakeCode)

当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。