下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。次のいずれかのコースで黒い線に沿って動き、途中でボールをゴール付近に立てた350mlの空き缶(黄色で表示)に当てるロボットを製作せよ。ボールはロボットが弧IHKJ上にある時にP地点の空き缶に当てる。私は下の第2コースを選んだ。矢印の先端にある交差点で1秒一時停止をする必要がある。今回はロボットに光センサ、超音波センサ、ボールを投げるアームをつける必要があった。光センサは、あまりにも床と近すぎるとうまく測定できないということを先生からアドバイスをいただいたので、光センサの値を見ながら白色と黒色の値がはっきり変わるように床と適度な間隔をあけた。超音波センサは、床からの距離が高すぎて物体を測定できないということがないように、センサをつける高さを意識した。†アームを閉じてボールを挟んで運び、アームを広げてロボットの機体をぶつけることで、蹴るようにボールを飛ばすものにした。†まず以下のものを定義した。//1秒一時停止するため線に沿って走るために、白と黒を認識して進むプログラムを作成した。「真っ白」「白よりの境界線」「白と黒の境界線」「黒よりの境界線」「真っ黒」の5つに分けて値を光センサで測定すると、下の図のような結果になった。測定より、真っ黒は31以下、黒よりの境界線は32~41、白と黒の境界線は42~47、白よりの境界線は48~54、真っ白は55以上だということがわかった。このロボットは線の左側に沿って進むように作るので、下の図のように、色を測定して黒ければ黒いほど左に、白ければ白いほど右に進まなくてはならない。よって、測定値を利用してif文を使った以下のようなプログラムを作った。//左旋回}これは、同じ要領で「白」「白と黒の境界線」「黒」の3つに分けてもロボットは動きますが、細かく分けるとより滑らかに動くので5つに分けたプログラムを作った。これを応用して交差点を見つけたら終わるプログラムを作る。上記のような線をジグザグしながら動くプログラムの場合、交差点では以下の図のように光センサは「真っ黒」を長い時間測定し続ける。図の赤い矢印は全て同じ長さである。直線上にある矢印は、白から黒、黒から白の部分を走っているが、交差点に入っている矢印だけ、矢印全体が黒い部分を走っている。これより、ロボットが交差点に入った時だけ光センサはずっと「真っ黒」を測定し続ける。これを利用して以下のような交差点に入ると終わるプログラムを作る。}}これは、「真っ黒」以外が測定されるたびにt5を更新すると現在の時間とt5の差が0.09秒にならず、while文のプログラムを繰り返し続ける。交差点に入ると、「真っ黒」が測定されて、t5は更新されないため、現在の時間とt5の差が0.09秒以上になるのでwhile文の繰り返しが終わり、プログラムが終わる。†ロボットは線の左を沿って走っているので、交差点を右折するには一回「真っ黒」の領域を走らなければならない。上で説明した「tuuzyou」のプログラムでは右折できないので、右折ようのプログラムを作った。上の図のように、交差点の右の線の奥側(線の左側)に行きたい。そのために交差点から、センサが「黒よりの境界線」の値である48を測定するまで右折をするプログラムを作成した。交差点で一時停止した後にそのまま直進するプログラム。//0.03秒そのまま実行する}交差点を見つけてロボットが「tuuzyou」のプログラムを終えると、ロボットの機体が少し左に曲がってプログラムが終わるので「turn_r1(右旋回)」によって右に機体を戻さないとラインから外れてしまうので、「turn_r1(右旋回)」はロボットの機体をライン上に戻すための微調整である。上の交差点を右折するプログラムのように、時間で決めるのではなく、センサで測定した数値になるまで直進するというプログラムも考えたが、以下のようなことが起こり、100%成功する保証はなかったので、ある時間だけ実行するプログラムにした。通常のライントレース用のプログラムだと、コースにあるDの直角の曲がり角や、FとGの途中にある急カーブでは、「真っ黒」の領域を0.09秒以上通るため、一時停止してしまう。そのため、急カーブに差し掛かる時間をあらかじめ時間を測って置いて、その時間内だけは「真っ黒」の領域を0.09秒以上通っても一時停止しないプログラムを作った。}}specialのプログラムはtuuzyouのプログラムとは違い、毎回t0(tuuzyouのプログラムではt0だが、specialのプログラムではt1のこと)を更新していない。毎回更新すると光センサで測定するたびにt0が更新されるため、specialのプログラムで更新してしまうと、今からt1になるまで20秒以上経つ時は永久にこなくなるため、注意する。上の2つのプログラムは、プログラムを行う時間が違うだけなので、「20000」や「7000」となっている数字を文字に置き換えて、メインプログラムでその文字に時間を入れれば、一つのプログラムにできたと、このレポートを書いていて気づいた。}}これでメインプログラムで書くときに、special3(20000);やspecial3(7000);と書けば、1つのプログラミングでできたと思う。†このミッションでは、空き缶にボールを当てなくてはならなかったので、超音波センサで空き缶を探しす必要があった。そのプログラムが以下である。d_min;}上のプログラムは、ロボットが回転することによって、ロボットの周りにある物体との距離を測定し、それをd_minとする。d_minは測定されたら更新されてることで、別の物体がロボットの周りにあったらその物体との距離もd_minとして記録する。測定が終わったら、測定したd_minの中で1番小さい値を見つけて、d_minが1番小さかった物体の方向へ向く。空き缶より別のものがロボットの近くにあると、そっちの方向を向いてしまうのでそこに注意することが必要である。今回のロボットは、ボールを置いてロボットで押すことでボールをけるようにしたので、ロボットを後退や前進させるてシュートさせた。†メインプログラムは上の定義したプログラムを組み合わせるなどして完成させた。交差点では一時停止する必要があった。その仕組みは、通常のライントレース用のプログラムで「真っ黒」の領域を0.09秒以上通る所(これが交差点)を見つけ通常プログラムを終了させ、その下にモータを停止させるプログラム(stoop;)と一秒間続けるプログラム(Wait(1000))を置くことで交差点で1秒間一時停止する。ロボットは動かないでボールを落とす様なロボットにすればよかった。次回からはプログラムを作る際、なるべく同じことを何回も書かない様に、省略できるところはないか考えながら作る。超音波センサをロボットに取り付ける際に、正面から平行に設置できていなかったかもしれない。正確な理由はわからないので、超音波センサについて復習をする。今回のミッションでは課題を達成することだけに必死で、あまり自分らしさや自己流の工夫ができなかった。ロボットに関してもプログラムに関しても、「注目ポイントはありますか?」と聞かれても正直答えるのが難しい。次回は、ただミッションを達成させるロボットを作るのではなく、どう作れば簡潔か、どうすれば100%絶対成功するロボットやプログラムが作れるかをもっと考えながら作りたい。