ラインフォロワーセンサーの様々な用途

mBotに標準で付属するラインフォロワーセンサー(ライントレースセンサー)。黒い線を検知し、線に沿ってmBotを走行させるためのお馴染みのセンサーです。

mBotラインフォロワーセンサーの拡大図

ラインフォロワーセンサーで検出した値(データ)は、↓の表のように、なっています。

センサー値 数値の意味
両方のセンサーが黒と判定
1 左のセンサーが黒、右のセンサーが白
2 左のセンサーが白、右のセンサーが黒
3 両方のセンサーが白

 このラインフォロワーセンサー、白か黒かの判定と思われがちですが、実は、そうではありません。
 センサーの原理は、発光された赤外線が跳ね返ってくる量によって、白か黒かを見分けます。赤外線が多く跳ね返るのは、白いライン、跳ね返りが少ない場合は黒と判定します。
 「赤外線の跳ね返りの量」の判定ですので、実際には、白・黒じゃなくてもセンサーは反応します。
 例えば、指で、センサーをタッチする(覆い隠す)と、指は白くはありませんが、赤外線の跳ね返りが多いので、上記の表でいう所の3の値が出力されます。

この原理を利用すれば、ラインフォロワーセンサーをタッチセンサーや近接センサー(ものが近づくと反応するセンサー)として利用することが可能になります。それを使ったのが、例えば、↓の動画。

デスクライトの柱部分に、ラインフォロワーセンサーを付け、そのセンサーに指を近づけることによって、赤外線の跳ね返りの量が変わり、それの応じてセンサーの出力が変わった事を検知すると、LEDが光るようになっています。

参考:mBot 機能拡張パックレビュー 音声&光センサーパック編

 このように、センサーの原理を理解すると、そのセンサーを様々な用途に応用することが可能になりますね。

 このラインフォロワーセンサーを応用した重要な使い方に、ラインカウントがあります。例えば、mBotが黒い線の上を通過すると、1回とカウントするような事が可能になります。

 

ラインカウントのプログラミング

さて、↑の動画のように、黒いラインの上を通ったら、「1回」とカウントするにはどうしたらよいでしょうか?

上のような動きをさせるためには、まずは、その動きの要素を分解して考えましょう。

1、mBotが起動したら3秒後に動き出す
2、5秒で止まる
3、黒いラインの上を通る毎に「1」ずつカウントする
4、カウントした数字をLEDマトリクスに表示させる

1、mBotが起動したら3秒後に動き出す
「mBotが起動したら、三秒後に動き出す」は、それほど難しくないですね。下のブロックを使えば簡単です。

mBlock5 制御ブロック 3秒待つ

2、5秒で止まる
 時間を計測してmBotを制御するにはどうしたらよいでしょうか?
 これは、mBotに内蔵されているタイマー機能を使えばよいです。タイマー機能とは、このタイマーブロックを使い、タイマーをリセットするからずっと時間を計測する機能です。

mBlock5のタイマーブロック画像

 タイマー機能はとても便利で、mBotの走る速さを途中から変えたり、LEDの光りかたを段々変えていくような可変プログラムを作る時に大変役に立つ機能です。

3、黒いラインの上を通る毎に「1」ずつカウントする
変動するような数をプログラムするには、変数を使います。
 変数とはデータ(文字・数・センサーの値etc)を記憶しておく入れ物のことです。
一つの「変数=入れ物」には、一度に一つしかデータを入れておくことが出来ません。新しくデータを入れると、それまで「変数=入れ物」に入っていたデータは、消えてしまいます。

このプログラムの場合、黒い線の上を1回通るごとに、1ずつ数を入れ物に入れていくイメージです。この変数を使うためには、「変数ブロック」を自分で作成する必要があります。変数ブロックはは、このような感じで簡単に作ることが出来ます。

この動画をで「カウント」というのが変数名です。入れ物にどんなデータが入っているかすぐにわかるように自分で任意で名前を付けて登録します。

変数ブロック説明画像主に使うブロックは、この上の3つです。

上の画像の、一番上の「オレンジ色の丸いカウント」ブロックが「入れ物」で、その中に、入れる数を下の2つのブロックで制御していくイメージです。

4、カウントした数字をLEDマトリクスに表示させる
LEDマトリクスをポート1に繋げます。
LEDマトリクスは、mBot標準ではついていませんが、追加で購入可能です。

参考記事:mBot拡張パーツ LEDマトリクスレビュー

このように分解して考えた後、それをつなぎ合わせると、↓のようなプログラムが出来ますね。

ラインフォロワーの未完成プログラム画像 ちなみに、mBlock5だと、初めからラインフォロワーセンサーが黒であるか、というブロックが用意されているので、大分直感的に分かりやすくプログラムを組むことができます。
 mBlock3だと、ラインフォロワーセンサーの値が「0~3」となっていたので、それに比べると大分わかりやすいです。
 一方で、センサーの原理を知らず、単にブロックだけでラインフォロワーセンサーの機能を考えてしまうと、↑タッチセンサーの使い方は発想できないかも知れません。

さて、このプログラムで動かした動画がこちらです。

おかしいですね。黒い線を通過した数と、カウントしてLEDパトリクスに表示した数があっていません。何というか、黒い線の上を走行中は数が増え続けていっています。。

ラインカウントする時は、「状態」をカウントするイメージ

 さて、なぜ↑のような、意図していないプログラムになるのでしょうか?実は、↑で作ったプログラムだと、mBotは、「ラインフォロワーセンサーが黒を検知している間はずっと1ずつカウントを増やす」と理解します。

 プログラムを作る側は、ラインフォロワーセンサーで、黒い線の数を数えたいのですが、それをmBotに理解させるためには、さらに、詳細なプログラムを組んであげないとmBotは、人間の思い・言葉を理解してくれないのです。

 ラインフォロワーセンサーで、黒い線の数をカウントするという事を、mBotが理解できるように翻訳すると、「ラインフォロワーセンサーで黒と検知している状態から、白と検知している状態に切り替わる数をカウントする」というように指示してあげなければなりません。

この場合、「状態」という変数を作って、その「変数名=状態」のブロックをラインフォロワーが白と検知している状態の時は「0」に設定し、黒と検知したら、状態を「1」にして、その時にカウントを1ずつ増やすというプログラムを組んで上げる必要があります。

mBlock5によるラインフォロワーセンサーでのラインカウント完成プログラム

このプログラムで、冒頭のような動画の通り、正確なラインカウントができるようになります。