2008b/A7/課題2右
目次
各チームで作成したコースに沿って動くロボットを作成せよ。ただし、
・速さと正確さを追求すること ・交差点で優先側を走っていない場合には、一時停止すること ・前方にあるもう一台のロボットに接触した場合には停止して相手のロボットが行き過ぎる、あるいは距離が離れるのを待つこと ・コースを2周したら自動的に止まること(ただし、手違いにより私たちは3周)
今回私たちが製作したライントレースロボットは、当初は基本的なタッチセンサーロボットにラインをトレースする光センサーを適度な場所に取り付けたシンプルなロボットとなりました。しかし、課題を達成し、余裕ができた私たちは、スピードを追求したマシンを作ろうとしました。タイヤを大きくしたり、プログラムの処理を減らしたりと色々な工夫の結果、マシンは下の画像のようになり、コース3周を2分37秒から1分50秒と47秒の短縮に成功しました。
鳥瞰図 修正前マシン 側面図 |
鳥瞰図 修正後マシン 側面図 |
修正前
修正後
(全体図) 修正前コース (8の字カーブ) |
モータ、センサについては以下の端子に接続してあります。
A端子 → 左モータ(正回転:前進,逆回転:後進) B端子 → なし C端子 → 右モータ(正回転:前進,逆回転:後進)
1端子 → 左光センサ 2端子 → タッチセンサ 3端子 → 右光センサ
(今回のプログラムの説明に「光センサが反応したら」とあるが、これは「光センサが黒を感知したら」という意味)
/* ラインチレースプログラム */ /* 定数を定義 */ #define LIGHT_JUDG 40 /* 光センサの判断値を定義 */ #define TWO_MOTOR OUT_A+OUT_C /* 出力A、Cをまとめる定義 */ /* タッチセンサか、光センサの両方が反応したときの動作関数 */ void move_stop(int t){ OnRev(OUT_A); /* 位置微調整のため少し左回転 */ Wait((t / 13)); /* 入力値が0ならば待たない */ Off(TWO_MOTOR); Wait(200); /* 2秒間停止 */ OnFwd(TWO_MOTOR); Wait((t * 2)); /* 入力値が0ならば待たない */ } task main(){ /* n:交差点通過数のカウンタ変数 */ int n; n = 0; /* センサの設定 */ SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_3,SENSOR_LIGHT); /* 出力の設定 */ SetPower(OUT_A,2); SetPower(OUT_C,2); /* マシンスタート */ OnFwd(TWO_MOTOR); /* nが9以上(コース3周以上)になるまでループ */ while(1){ /* もしタッチセンサが反応したら */ if(SENSOR_2) move_stop(0); /* もし光センサの両方が反応したら */ if((SENSOR_1 < LIGHT_JUDG) && (SENSOR_3 < LIGHT_JUDG)){ n++; /* nに+1 */ if (n % 3 != 0) /* nが3の倍数(スタート地点の目印の反応時)以外ならば */ move_stop(50); else /* nが3の倍数ならば */ Wait(20); /* 0.2秒待機 */ } /* nが9以上(コース3周以上)になったら */ if (n >= 9){ Off(TWO_MOTOR); /* マシン停止 */ break; /* ループか抜ける */ } /* 光りセンサ(左)が反応したら */ else if(SENSOR_1 < LIGHT_JUDG){ Off(OUT_A); /* 左モータを停止 */ OnRev(OUT_A); /* 左モータを逆回転 */ /* 光りセンサ(左)が反応しなくなるまで */ while(SENSOR_1 < LIGHT_JUDG){ if(SENSOR_2) /* もしタッチセンサが反応したら */ move_stop(0); if(SENSOR_3 < LIGHT_JUDG) /* もし光センサ(右)が反応したら */ break; /* ループか抜ける */ } Wait(2); /* 予備動作 */ OnFwd(OUT_A); /* 左モータを正回転 */ } /* 光りセンサ(右)が反応したら */ else if(SENSOR_3 < LIGHT_JUDG){ Off(OUT_C); /* 右モータを停止 */ OnRev(OUT_C); /* 右モータを逆回転 */ /* 光りセンサ(左)が反応しなくなるまで */ while(SENSOR_3 < LIGHT_JUDG){ if(SENSOR_2) /* もしタッチセンサが反応したら */ move_stop(0); if(SENSOR_1 < LIGHT_JUDG) /* もし光センサ(左)が反応したら */ break; } Wait(2); /* 予備動作 */ OnFwd(OUT_C); /* 右モータを正回転 */ } } }
コースについて
その結果以下の修正を施すことになりました。
プログラムについて
よろしければコメントをどうぞ
書くべきことはきちんと書けています。
過去のホームページを参考にしてより良いレポートを目指してください。考察したり、説明をわかりやすく詳しくしたり等 FI