2008b/A7/課題2右


ライントレースロボット

製作者:タキさ マツコ

目次


課題についての説明

各チームで作成したコースに沿って動くロボットを作成せよ。ただし、

   ・速さと正確さを追求すること
   ・交差点で優先側を走っていない場合には、一時停止すること
   ・前方にあるもう一台のロボットに接触した場合には停止して相手のロボットが行き過ぎる、あるいは距離が離れるのを待つこと
   ・コースを2周したら自動的に止まること(ただし、手違いにより私たちは3周)

製作したマシン

今回私たちが製作したライントレースロボットは、当初は基本的なタッチセンサーロボットにラインをトレースする光センサーを適度な場所に取り付けたシンプルなロボットとなりました。しかし、課題を達成し、余裕ができた私たちは、スピードを追求したマシンを作ろうとしました。タイヤを大きくしたり、プログラムの処理を減らしたりと色々な工夫の結果、マシンは下の画像のようになり、コース3周を2分37秒から1分50秒と47秒の短縮に成功しました。

鳥瞰図 修正前マシン 側面図
tyoukanzu1.jpgsokumennzu1.jpg

鳥瞰図 修正後マシン 側面図
tyokanzu3.jpgsokumannzu3.jpg
キャスター?
kyasuta.jpg

このマシンの利点

修正前

修正後

コース

(全体図) 修正前コース (8の字カーブ)
zentaizu.jpg8nozi.jpg

書き換え後コース
kosu00.jpg

モータ・センサに対応する端子

モータ、センサについては以下の端子に接続してあります。

プログラムの紹介

(今回のプログラムの説明に「光センサが反応したら」とあるが、これは「光センサが黒を感知したら」という意味)

/* ラインチレースプログラム */

/* 定数を定義 */
#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


添付ファイル: fileaim_light3.jpg 160件 [詳細] filekosu00.jpg 369件 [詳細] filekyasuta.jpg 337件 [詳細] filetyokanzu3.jpg 357件 [詳細] filesokumannzu3.jpg 351件 [詳細] filesokumennzu1.jpg 347件 [詳細] filetyoukanzu2.jpg 186件 [詳細] filetyoukanzu1.jpg 357件 [詳細] filesokumennzu2.jpg 179件 [詳細] filesokumennzu1jpg.jpg 162件 [詳細] file081203_1523~0001.jpg 163件 [詳細] file8nozi.jpg 347件 [詳細] filezentaizu.jpg 343件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-01-23 (金) 14:55:08