目次
#contents

*課題 [#mbc39341]
**黒い線に沿って動くロボット [#oe843674]
各チームで作成したコースを1周するロボットを製作せよ。
交差点以外のコース上に350mlの空の空き缶を2個以上おき、空き缶にぶつかった時には次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する)
+空き缶をコース上に戻して再びコースに戻って進む
+空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む
+奇数回目に空き缶に遭遇したら、その場で反転して進み、偶数回目に遭遇したら、空き缶を押しのけて進む

ただし、
-速さと正確さを追求すること
-コースを1周したら自動的に止まること
-交差点では一時停止すること

**メンバー [#wd1e942b]
田島・みのう

*コース紹介 [#d76ddf12]
#ref(./100624course.jpg,80%,コース全面)
-3か所の交差点と鋭角のカーブが2か所あるコース

*ロボットの製作 [#rfc6359a]
**製作したロボット [#q8ccf9d9]
#ref(./100624robot01.jpg,80%,コース全面)
#ref(./100701robot01.jpg,80%,ロボット)

**工夫した点 [#l4748d28]
-なるべく構造が簡単になるようにした。
-コースの鋭角カーブの部分を曲がるために、光センサの間隔を調節した。(コースのライン25mm程度、センサ間隔70mm程度。初期はセンサ間隔30mm程度。)
-コースの鋭角カーブの部分を曲がるために、光センサの間隔を調節した。(コースのライン25mm程度、センサ間隔70mm程度。当初センサ間隔30mm程度。)
#ref(./100624sensor01.jpg,80%,光センサ)

**今後改善すべき点 [#qd4f24e0]
-缶を押さえる部分が大きすぎ、また弱いため、その部分の改善。
-本当に中身が空である缶を使うとスイッチの反応が悪いため、その部分の改善。(今回は缶の中に重りとして電池を入れた。)
-カーブ直後にある缶はキャッチすることができないので、その部分の改善。
-缶を押さえる部分が大きすぎ、また弱いため、その部分の改善。特に大きすぎて前に傾いてしまうので、バランスをよくしたい。
-本当に中身が空である缶を使うとスイッチの反応が悪いため、その部分の改善。

*プログラムの作成(田島) [#a126dcae]
**課題 [#c2a3d841]

-空き缶をコース上に戻して再びコースに戻って進む
**作成したプログラム [#gb59067b]

 int move_time
 
 task main() {
  move_time = 0 ;
  SetSensor(SENSOR_1,SENSOR_LIGHT);
  SetSensor(SENSOR_2,SENSOR_TOUCH);
  SetSensor(SENSOR_3,SENSOR_LIGHT);
  while(move_time < 8); {
    if ((SENSOR_1<45)&&(SENSOR_3<45)) {          //交差点にさしかかった場合
      move_time = move_time + 1                  //変数に1を足す
      Off(OUT_A+OUT_C);                          //停止する
      Wait(50);
      OnFwd(OUT_A+OUT_C);                        //前進する
      Wait(25);
    } else if (SENSOR_1<45) {                    //左側のセンサーが黒線に触れた場合
      OnFwd(OUT_C);                              //左側に曲がる
      OnRev(OUT_A);
    } else if (SENSOR_3<45) {                    //右側のセンサーが黒線に触れた場合
      OnFwd(OUR_A);                              //右側に曲がる
      OnRev(OUT_C);
    } else if ((SENSOR_1>45)&&(SENSOR_3>45)) {   //両方のセンサーが黒線の上に無い場合
      OnFwd(OUT_A+OUT_C); }                      //前進する
    if (SENSOR_2 == 1) {                         //缶にぶつかった場合
      OnFwd(OUT_B);                              //缶をはさむ
      Wait(25);
      Off(OUT_B);
      OnFwd(OUT_A+OUT_C);                        //前進する
      Wait(50);
      OnFwd(OUT_A);                              //回転する
      OnRev(OUT_C);
      Wait(160);
      OnRev(OUT_A+OUT_C);                        //後進する
      Wait(50);
      OnRev(OUT_B);                              //缶を離す
      Wait(25);
      Off(OUT_B);
      OnFwd(OUT_A);                              //回転する
      OnRev(OUT_C);
      Wait(160);
    if (move_time == 7) {                        //交差点を七回こえた場合
      Off(OUT_A+OUT_C);                          //タイヤを止める
      move_time = move_time + 1; }
   }
 }
**工夫した点 [#r17e803b]

-ifの条件を二つにしたこと
-ifに交差点をまたぐ場合を持ってきてelse ifに普段の前進を持ってきたこと
**今後改善すべき点 [#hf9713a8]

-缶をどけるプログラムが単純なこと
-音を出すなどのオプションを付ける
-値があまり正確ではないこと
*プログラムの作成(みのう) [#f88fe33b]
**課題 [#f365c0e9]
-奇数回目に空き缶に遭遇したら、その場で反転して進み、偶数回目に遭遇したら、空き缶を押しのけて進む
-空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む

**作成したプログラム [#wb65c956]
 #define THRESHOLD 45
 
 int sensor;
 int cross_count;
 int can_count;
 int do_task;
 // 変数宣言
 int sensor; // 光センサ値
 int cross_count; // 交差点通過数
 int hold_can; // 缶所持フラグ
 int first_cross; // 初回交差点未通過フラグ
 int do_task; // ループ実行フラグ
 
 #define close_hand OnRev(OUT_B);Wait(200);Off(OUT_B);
 #define open_hand OnFwd(OUT_B);Wait(200);Off(OUT_B);
 
 task main() {
 	// センサ種別設定
 	SetSensor(SENSOR_1, SENSOR_LIGHT);
 	SetSensor(SENSOR_2, SENSOR_TOUCH);
 	SetSensor(SENSOR_3, SENSOR_LIGHT);
 
 	// 変数初期値代入
 	cross_count = 0;
 	can_count = 0;
 	hold_can = 0;
 	first_cross = 1;
 	do_task = 1;
 
 	Off(OUT_B);
 
 	while(do_task == 1) {
 	while(do_task) {
 		sensor = 0;
 		if(SENSOR_1 > THRESHOLD) { sensor += 1; }
 		if(SENSOR_3 > THRESHOLD) { sensor += 2; }
 		
 		if(sensor == 0) {
 			// 左右共に反射なしの場合
 			if(FastTimer(0)>300) {
 				// 交差点として判断
 				// 直前の交差点から3秒(走行再開後2秒)経過して
 				// いない場合は、停止後の交差点通過待ちと判断
 				PlaySound(SOUND_CLICK);
 				cross_count++; // 交差点通過カウントアップ
 				Off(OUT_A);
 				Off(OUT_C);
 		if(sensor == 0) { // 両光センサが黒判定の時
 			if(FastTimer(0)>200) {
 				// 前回の両黒判定より2秒経過している場合は新たな交差点
 				cross_count++;
 				Off(OUT_A+OUT_C); // 一時停止
 				Wait(100);
 				ClearTimer(0);
 
 				if(hold_can && first_cross) { // 缶所持、初回交差点未通過時
 					first_cross = 0; // 初回交差点未通過フラグ削除
 				} else if(hold_can && !first_cross) { // 缶所持、初回交差点通過時
 					// 缶を交差点に置く
 					PlaySound(SOUND_DOWN);
 					OnFwd(OUT_A+OUT_C);
 					Wait(100);
 					OnFwd(OUT_A);
 					OnRev(OUT_C);
 					Wait(170);
 					Off(OUT_A+OUT_C);
 					open_hand;
 					OnRev(OUT_A+OUT_C);
 					Wait(60);
 					OnRev(OUT_A);
 					OnFwd(OUT_C);
 					Wait(170);
 					OnRev(OUT_A+OUT_C);
 					Wait(60);
 					hold_can = 0;
 					PlaySound(SOUND_CLICK);
 				}
 			}
 			until(FastTimer(0)>100);
 			OnFwd(OUT_A);
 			OnFwd(OUT_C);
 		} else if(sensor == 1) {
 			// 左反射ありの場合
 		} else if(sensor == 1) { // 右光センサが黒判定の時
 			// 右旋回
 			OnFwd(OUT_A);
 			OnRev(OUT_C);
 		} else if(sensor == 2) {
 			// 右反射ありの場合
 		} else if(sensor == 2) { // 左光センサが黒判定の時
 			// 左旋回
 			OnRev(OUT_A);
 			OnFwd(OUT_C);
 		} else {
 			// その他(左右共に反射ありの場合)
 		} else { // それ以外の時(両光センサが白判定の時)
 			// 直進
 			OnFwd(OUT_A);
 			OnFwd(OUT_C);
 		}
 
 		if(SENSOR_2) {
 			Off(OUT_A);
 			Off(OUT_C);
 			if(FastTimer(1) > 100) {
 				// 缶衝突として認識
 				can_count++; // 缶衝突回数カウントアプ
 				ClearTimer(1);
 			}
 			if(can_count%2 == 0) {
 				// 偶数回目
 				PlaySound(SOUND_DOWN);
 				OnRev(OUT_A);
 				OnFwd(OUT_C);
 				Wait(60);
 				OnFwd(OUT_A);
 				OnFwd(OUT_C);
 				Wait(50);
 				OnRev(OUT_A);
 				OnRev(OUT_C);
 				Wait(50);
 				OnFwd(OUT_A);
 				OnRev(OUT_C);
 				Wait(60);
 			} else {
 				// 奇数回目
 				PlaySound(SOUND_UP);
 				OnRev(OUT_A);
 				OnRev(OUT_C);
 				Wait(60);
 				OnRev(OUT_A);
 				OnFwd(OUT_C);
 				Wait(160);
 				OnRev(OUT_A);
 				OnRev(OUT_C);
 				Wait(60);
 			}
 		if(SENSOR_2 && !hold_can) { // タッチセンサ反応、缶未所持時
 			// 缶を掴む
 			PlaySound(SOUND_UP);
 			Off(OUT_A+OUT_C);
 			close_hand;
 			hold_can = 1; // 缶所持フラグセット
 			first_cross = 1; // 初回交差点未通過フラグセット
 			PlaySound(SOUND_CLICK);
 		}
 
 	if(cross_count >= 7) { do_task = 0; } // 交差点通過7回目でループを抜ける(停止)
 	if(cross_count >= 7) { do_task = 0; } // 7回目の交差点通過でループ終了
 	}
 
 	// モータのフリーにして停止
 	// プログラムの終了をブザー鳴動で知らせる
 	// モータ自由、ブザー鳴動し停止
 	Float(OUT_A+OUT_B+OUT_C);
 	repeat(5) {
 		PlaySound(SOUND_DOUBLE_BEEP);
 		Wait(100);
 	}
 }

**工夫した点 [#oec5b805]
-なるべく簡潔になるようにした。
-光センサによる条件分岐で、条件文が長くならないようにした。
-プログラム終了時に、交差点での停止かプログラムの終了なのか分かりにくかったので、最後にブザーを鳴らした。
-音を鳴らし効率的にデバッグ作業をできるようにした。

**今後改善すべき点 [#c7407c85]
-反転時の車体位置(光センサがラインをまたぐように)
-缶をずらすときの缶の位置(その後の支障にならないような位置に置く)
-缶を置いた後の車体位置(光センサがラインをまたぐように)
-マクロ、サブルーチンなどを使用してそれぞれの部分に分ける
-その他、細かい点で値などの調整

*反省・感想 [#v2af711d]
-(田島)
-今回はコースの鋭角カーブが思ったよりも難しく、そこを曲がるための調整に時間をかけてしまい、そのほかの部分はまだまだ試験段階、要調整といった感じになってしまった。現在のところライントレース自体はほぼ完ぺきなので、あとは缶に関係する部分を調整したい。(みのう)
-あまり時間がなかったので、あまり手のこんだものを作ることが出来なかった。それでもライントレースのプログラムはよく出来たと思う。ただもう少しきちんとした缶をつかむ装置を作りたかった。段々プログラムを作ることにも慣れてきたので次はもっと手の込んだものを作ろうと思う。(田島)
-今回はコースの鋭角カーブが思ったよりも難しく、そこを曲がるための調整に時間をかけてしまい、そのほかの部分はまだまだ細かい調整が必要といった感じになってしまった。現在のところライントレース自体はほぼ完ぺきなので、あとは缶に関係する部分を微調整したい。(みのう)

*コメントをどうぞ [#w0e7a7ac]
- 簡潔に書かれていてよいと思います。プログラムについても工夫した点などを説明してみてください -- [[TAKA]] &new{2010-07-09 (金) 17:44:14};

#comment


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS