�Cを一時停止して右折。�Eを一時停止して直進。�Gを一時停止して直進。�長方形X内に入って停止。ボールはロボットが弧IHKJ上にある時にQ地点の空き缶に当てる。光センサと紙が平行になるような位置に光センサを取り付け、光センサの値を正確に測ることができるようにした。光センサをタイヤの中点の位置に取り付けると、うまくライントレースすることができなかったので、タイヤの中点よりも右側に光センサを取り付けるようにした。空き缶との距離を適切に測ることができるように超音波センサの前に他のセンサとの接続コードがこないような位置に超音波センサを取り付けた。超音波センサを少し下向きに傾けることで、空き缶を認識しやすいようにした。†ボールとモータとの距離を離しすぎると走行中にアームが不安定になりボールを転がしてしまうことがあったので、ボールとの距離がなるべく近づけられるような位置にモータを取り付けた。地面と垂直になるようにアームを取り付けることで、バランスを保ちやすくした。今回は、「黒と白の境界線をライントレースする」というプログラムを制作した。いう5段階の明るさの値を測定できた。5つの測定できた値は以下のものとなった。明るさの値が5段階存在するので、それぞれの明るさに対応した動きをするために5段階で動きを制御する必要があるので、以下のように動くようなプログラムを作成した。//右折また、黒と白の境界線には「黒線の右側をライントレースする」、「黒線の左側をライントレースする」という2種類の境界線が存在するので、これらのプログラムを分けて考えることにした。//白と黒の境界線の明るさの値が45である。定義して、以下のようなプログラムを作成した。//max_tにいれた時間分だけラインの左側をライントレースする。//現在の時間を記録する。//現在の時間とt0の時間の差がmax_t以下の時、以下のプログラムを実行する。//明るさの値が34未満の時、turn_right1の動きをする。//明るさの値が34以上38未満の時、turn_right2の動きをする。//明るさの値が38以上52未満の時、go_forwardの動きをする。//明るさの値が52以上56未満の時、turn_left1の動きをする。//それ以外の時、turn_left2の動きをする。}このプログラムは下図のように動くようになっている。//max_tにいれた時間分だけラインの右側をライントレースする。//現在の時間を記録する。//現在の時間とt0の時間の差がmax_t以下の時、以下のプログラムを実行する。//明るさの値が34未満の時、turn_left1の動きをする。//明るさの値が34以上38未満の時、turn_left2の動きをする。//明るさの値が38以上52未満の時、go_forwardの動きをする。//明るさの値が52以上56未満の時、turn_right1の動きをする。//それ以外の時、turn_right2の動きをする。}このプログラムは下図のように動くようになっている。今まで示してきたプログラムだけだと交差点にさしかかっても、そのまま角に沿ってライントレースすることとなってしまうので、交差点を認識するプログラムを作成した。交差点認識の仕組みは、上図に示したようにライントレースの最中にある動作を連続で何秒間か行った場合、ライントレースを終了させるというものである。そのプログラムが以下のものである。//min_tにいれた時間分だけライントレースをする。//現在の時間を記録する。//現在の時間とt1の時間の差がmin_t以下の時、以下のプログラムを実行する。(min_tの時間で交差点を認識する。//明るさの値が34未満の時、B,Cのモータを1秒間停止させる。//明るさの値が34以上38未満の時、turn_left2の動きをする。//現在の時間を記録する。//明るさの値が38以上52未満の時、go_forwardの動きをする。//現在の時間を記録する。//明るさの値が52以上56未満の時、turn_right1の動きをする。//現在の時間を記録する。//それ以外の時、turn_right2の動きをする。//現在の時間を記録する。動きをする必要があるので、交差点を横断するプログラムを考える。交差点の横断の仕方は主に2種類ある。�を実行するためのプログラムは以下のものである。OnFwd(OUT_B,40);OnFwd(OUT_C,40);Wait(1000)//1秒間交差点を横断する。OnFwd(OUT_B,40);OnFwd(OUT_C,40);Wait(400)//0.4秒間交差点を横断する。OnFwd(OUT_B,40);OnFwd(OUT_C,40);Wait(200)//0.2秒間交差点を横断する。度の時計回りの旋回する。現在の方向を中心にang度の範囲で探す。障害物までの距離を返す。旋回角度からタイヤの回転を計算する。指定された角度の半分を旋回する。角度計測をリセットする。反時計回りに旋回する。仮の最小値を更新する。}上のプログラムは下図のような仕組みで制御されている。今回はロボットを360度回転させ,空き缶の位置を探す。//現在の方向を中心に360度回転し、最小値の方向を向く。//アームを動かし、ボールを空き缶に当てる。//アームをもとの位置に戻す。†ライントレースマシンを作成している時に、交差点の認識がうまく行えているかを確認するために、音を用いた。この音のおかげで作業効率が大幅に上がった。//min_tにいれた時間分だけライントレースをする。//現在の時間を記録する。//現在の時間とt1の時間の差がmin_t以下の時、以下のプログラムを実行する。//明るさの値が34未満の時、B,Cのモータを1秒間停止させる。//明るさの値が34以上38未満の時、turn_left2の動きをする。//現在の時間を記録する。//明るさの値が38以上52未満の時、go_forwardの動きをする。//現在の時間を記録する。//明るさの値が52以上56未満の時、turn_right1の動きをする。//現在の時間を記録する。//それ以外の時、turn_right2の動きをする。//現在の時間を記録する。//ミの音を0.9秒間出す。†これまでに記述してきたプログラムを組み合わせて、全体のプログラムを作成する。//光センサを4に接続する。SetSensorLowspeed(S2);//超音波センサを2に接続する。Wait(3000);//スタートボタンを押してからすぐにロボットが動くのを防ぐために、3秒間ロボットを停止させる。across2;//0.4秒間交差点を横断する。Lfollow_line(2500);//2.5秒間ラインの左側をライントレースする。follow_intersection(400);//0.4秒で交差点を認識する。across2;//0.4秒間交差点を横断する。Lfollow_line(950);//0.95秒間ラインの左側をライントレースする。Lfollow_line(400);//0.4秒間ラインの左側をライントレースする。follow_intersection(400);//0.4秒で交差点を認識する。Rfollow_line(8000);//8秒間ラインの右側をライントレースする。d=searchDirection(360);//現在の方向を中心に360度回転し、最小値(空き缶)の方向を向く。Lfollow_line(6000);//6秒間ラインの左側をライントレースする。follow_intersection(400);//0.4秒で交差点を認識する。across3;//微調整のため、0.2秒間前進させる。across3;//微調整のため、0.2秒間前進させる。Lfollow_line(8500);//8.5秒間ラインの左側をライントレースする。follow_intersection(400);//0.4秒で交差点を認識する。turn_left2;Wait(1000);//交差点を左折する。Rfollow_line(26000);//26秒間ラインの右側をライントレースする。follow_intersection(400);//0.4秒で交差点を認識する。across2;//微調整のため、0.4秒間前進させる。across2;//微調整のため、0.4秒間前進させる。across2;//微調整のため、0.4秒間前進させる。Rfollow_line(26500);//26.5秒間ラインの右側をライントレースする。follow_intersection(400);//0.4秒で交差点を認識する。across2;//微調整のため、0.4秒間前進させる。across2;//0.4秒間交差点を横断する。Rfollow_line(1500);//1.5秒間ラインの右側をライントレースする。across;//ゴールに向かって前進する。今回の課題では、交差点の認識がうまく行えるかがコースを完走するための鍵となった。ロボットの製作過程で電池の残量によってロボットの進み方が変わり、それにより交差点の認識に誤差が生じるという問題が発生したが、2人で話し合いながらより良いプログラム作りに取り組むことができたので良かった。超音波センサを扱うにあたって、同じプログラムを使っても空き缶を認識できる時とできない時が存在してしまい、この問題を根本的に解決することができなかったので、超音波センサのプログラミングについてもう一度復習をして、次回の課題では超音波センサをうまく活用できるようにしていきたいと思う。