2024年12月16日

012-1.EV3タブレット版アプリ入門-第2回「センサーの入力と分岐処理」

この連載では「教育版レゴ マインドストームEV3プログラミング(以下、EV3アプリ)」を使って、タブレットでEV3のプログラミングを行う方法を紹介していきたいと思います。 (文/松原拓也)

◆ 障害物の手前で止まるロボット

今回はセンサーの入力を行ってみましょう。ここでは超音波センサーを使います。
使用するロボットは前回と同じです。超音波センサーは入力ポート1に接続しました。
障害物用として箱も用意します。

超音波センサーを使って障害物の手前で止まるプログラムがこちらです。
センサーの検出には「待機ブロック」を使ってみました。待機ブロックは指定した条件に合うまで処理を待ち続けます。

待機ブロックの設定内容は次のようにしました。
・ポート:「1」
・モード:「超音波センサー」→「比較」→「距離(cm)」
・比較タイプ:「未満」
・しきい値:「10」

これで、超音波センサーの測定値が10cm以上の場合、処理を待ち続けます。逆に測定値が10cm未満(たとえば9.9cm)の場合、待つのをやめて次の処理を実行します。

プログラムを実行した結果がこちらです。
最初にロボットが前進して、障害物の手前10cmあたりに近づくと停止しました。超音波センサーが10cm未満を検出してから、モーターにブレーキをかけていますので、10cmよりも少し短いきょりになります。
この「超音波センサーを使って障害物を検出する」という仕組みはロボット掃除機でも使われています。

◆ 障害物に近づいたり、遠ざかったり

続いて、「スイッチブロック」を使ってセンサーを入力してみましょう。スイッチブロックは待機ブロックとは違って、処理を分岐させることができます。スイッチブロックを繰り返し実行させるため、ブロック全体をループブロックで囲みます。
2つのスイッチブロックは次の処理を行っています。
・スイッチブロック1:超音波センサーの測定値が10cm未満の場合は後退。
・スイッチブロック2:超音波センサーの測定値が20cmより長い場合は前進。
待機ブロックでは1つ条件に合うまで処理が止まってしまいますが、分岐ブロックでは処理を止めずに複数の条件を判断させることができます。

プログラムを実行すると、写真のようにロボットが前後に往復し続けます。移動する範囲は障害物からおよそ10cm~20cmの場所です。プログラムは停止ボタンを押して終了させます。
ちなみにプログラムはロボットと障害物の距離が10cm~20cmの範囲から外れていないと動き出さないので注意しましょう。

◆ ライントレースロボット

定番の「ライントレースロボット」を作ってみましょう。ライントレースロボットの作り方についてはトップメニューの「ロボットエデュケイター」で紹介されていますが、ここではあえてオリジナルで作ります。
写真のようなロボットを用意します。入力ポート1にカラーセンサーを取り付けます。出力ポートCを右モーター、出力ポートBを左モーターに接続しています。
さらにラインが描かれたコースも用意します。ラインの太さは2.5~3cmくらいがおすすめです。

まず最初にカラーセンサーの特性を調べます。カラーセンサーのモードは「反射光の強さ」に設定します。
写真のようにカラーセンサーのLEDの光を床面に当てます。そして、光の当たる部分が「白色」と「黒色」でぴったり半々になるようにします。
そして、ポートビューでカラーセンサーの値を読み取ります。筆者の場合、この時の値は「15」でした。この値はあとで使いますのでメモしておきます。

完成したライントレースのプログラムがこちらです。 ループブロックの中に2つのスイッチブロックを置いています。スイッチブロックのモードは「カラーセンサー」→「比較」→「反射光の強さ」を選択します。比較タイプとしきい値と内部の処理は次のように設定します。

・スイッチブロック1:センサーの値が「15未満」の場合、「-40」のステアリング値で前進。
・スイッチブロック2:センサーの値が「15以上」の場合、「40」のステアリング値で前進。

進行方向の右側/左側のどちら側にラインをトレースするのかをあらかじめ決めておかないといけません。ここでは右側に保ってトレースすることに決めました。
しきい値の「15」は先ほどメモしておいた値を使っています。
ステアリング値の「-40」と「40」はロボットの進行方向です。この値を「0」に近づけると曲がりぐあいが弱くなりますが、急なカーブでコースアウトしやすくなります。 値を「-100」や「100」にすると、その場せん回をしてしまうので、ラインをトレースすることができなくなってしまいます。
なお、2つ目のスイッチブロックで使用している「15以上」という条件は「15未満」と正反対の条件なので、「×(偽)」のタブを使って1つのスイッチブロックにまとめることができます。ただし、そうすると、タブを切り替えた時に片方のブロックが隠れてしまうという欠点があります。ここでは見やすさを考えて、あえて2つのスイッチブロックを使っています。

まとめると、次のようになります。

・センサーの値が小さい(床面が黒色)の場合→左へ曲がる。
・センサーの値が大きい(床面が白色)の場合→右へ曲がる。
これらの処理を繰り返すことによって、ラインをトレースすることができます。

プログラムを実行した結果がこちらです。
ロボットがラインの上をジグザグに進んでいきます。

◆ (おまけ)ライントレース上級編

これでプログラムは完成なのですが、少し改良を加えます。 今のままではロボットがジグザグに進んでいく際、左右にフラつきすぎて動きに無駄があるように見えます。このフラつきを減らして、できるだけなめらかに走らせてみましょう。

こちらが改良後のプログラムです。
本来は「比例制御」という解決策を取り入れることが一番良いのですが、EV3アプリはEV3ソフトウェア(パソコン用のプログラミング環境)と違って、「変数ブロック」や「数学ブロック」が存在しません。そこで、別の方法を考えます。 スイッチブロックの中にスイッチブロックを入れて2重構造にしてみました。分岐の条件は次のとおりです。

・センサーの値が10未満の場合、「-40」のステアリング値で前進。
・センサーの値が10以上で15未満の場合、「-20」のステアリング値で前進。
・センサーの値が20以上の場合、「40」のステアリング値で前進。
・センサーの値が15以上で20未満の場合、「20」のステアリング値で前進。

まとめると、次のようになります。
・床面が黒(弱め)の場合→弱めに左へ曲がる。
・床面が黒(強め)の場合→強めに左へ曲がる。
・床面が白(弱め)の場合→弱めに右へ曲がる。
・床面が白(強め)の場合→強めに右へ曲がる。
これで4通りの強さでラインをトレースすることができるようになりました。動きが荒いですが、一応は比例制御になっています。 プログラムを動かしてみると、左右のフラつきを少し抑えることができました。

[movie]EV3アプリでロボットを動かす動画(Youtube)

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