TJ3で基本を学んでみる その7 交差点その1
交差点マーカとは

レスキューライン競技ではコース上に交差点があります.交差点には緑色の「交差点マーカ」がある場合があり, ロボットはこのマーカを検出して交差点で左右どちらに曲がるか?Uターンするかなどを判断することが要求されます.
何回かに分けて交差点のクリアに挑戦してみます.

交差点マーカは大きさ25mm×25mmで緑色,交差点に設置されます. 丁字交差点の場合は下の図のようになり,片側にマーカがある場合はそちら側に曲がり,両側にある場合はUターンをします.

マーカの検出に必要なセンサ

交差点マーカを色で検出するためには色を検出できるセンサが必要です. また,交差点マーカはコースの黒ラインの左右に設置されるため2個以上のセンサがあると効率よく検出できます. ここでは自作のカラーセンサを使用します.色と明るさをの両方検出することができるセンサ5個分をまとめたものです.詳細や使い方は こちらを参照ください.

マーカの判定

まずは,緑のマーカが黒ラインの左側にあるか?右側にあるか?あるいは両側にあるか?を判定するプログラムを作ります.

ロボットが交差点に来たとき,下記の図のような状態になります.

左側に緑マーカがある場合,
左側2つのセンサのどちらかは緑を検出する
右側に緑マーカがある場合,
右側2つのセンサのどちらかは緑を検出する
両側に緑マーカがある場合,
両側のセンサが緑を検出する

このプログラムでは変数を3つ使用します.
A:左側に緑マーカがあるときに1,それ以外のときに0
B:右側に緑マーカがあるときに1,それ以外のときに0
G:左側に緑マーカがあるときに1,右側に緑マーカがあるときに2,両側に緑マーカがあるとき3,それ以外のときに0

まずセンサの値を見て変数AとBの値を決め,次に変数AとBの値から変数G(上の3つの図の状態を表す)を決めます.

上のプログラムを保存します.ファイル名は「緑マーカの状態を判定する.Csy」にしました.
今回からプログラムが少し長くなるので,このプログラムを「サブプログラム」として,別のプログラムから呼び出して使用します.

続いて,「緑マーカの状態を判定する」プログラムを呼び出すメインプログラムを作ります.
緑マーカの状態を表す変数Gの状態に応じてLEDの表示を変えるプログラムで,本当に緑マーカの状態を判定できているか確認してみます.

サブプログラムとカラーラインセンサを使用するにはC-Styleに少し設定が必要です.
C-Styleの「オプション」で「Setupボタンを表示」にチェックを入れ,右上に出てきた「Setup」ボタンを押してSetupのウィンドウを表示し, 「Advanced Mode」と「I2C I/O ID Setup」にチェックを入れます.

これで,プログラムボタンリストにサブプログラム用の「Sub Prog」ボタンが出てきます.
操作方法が少しわかりづらいですが,左のプログラムボタンリストから「Sub Prog」ボタンを選んで,左側のプログラム編集領域に配置し, 出てきた小さいウィンドウの「Sub Prog」の絵の部分を押すと,プログラムを選べるので,先ほどの「緑マーカの状態を判定する.Csy」を選びます.

メインプログラムを作ります.
最初にサブプログラムとして,「緑マーカの状態を判定する」プログラムを呼び出して実行します.
これで緑マーカの状態を表す変数Gに0〜3のいずれかの値が入るので,次に変数Gの値に応じてLEDを点灯させます.

このプログラムをビルド,ダウンロードしてロボットを交差点に置くと,緑マーカの状態に応じてLEDの点灯・消灯が変化し, プログラムが意図どおり動いていることが確認できます.

交差点をクリアする?

上で作ったプログラムのLEDの点灯・消灯の部分を旋回とライントレースに置き換えれば,交差点をクリアできそうです.

ところが動画のとおり,ちょっとうまくいきません.

左折,右折は問題ないのですが,Uターンは1回目成功,2回目失敗となりました.
次はこの対策と,交差点の他のパターンを考えたいと思います.

補足:用語の紹介
  • 変数
    初心者向けの本などでよく「数値を入れる箱」といった例えで説明されています.
    TJ3Bで使用するC-StyleではA〜Zのアルファベット1文字の変数が用意されていて,整数値を入れることができます.
    変数に入れた値は,TJ3Bの電源を切ったり,リセットボタンを押したりすると消えます.
  • サブプログラム
    「サブルーチン」,「関数」などとも呼ばれます.意味はみんな同じと考えてよいと思います.
    他のプログラムから呼び出して実行することができ,プログラムをシンプルに書いたり,流用したりするのに役立ちます.
    C-Styleではサブプログラムからサブプログラムを呼び出すことはできないようです.