目次

課題

黒い線に沿って動くロボット

各チームで作成したコースを1周するロボットを製作せよ。 交差点以外のコース上に350mlの空の空き缶を2個以上おき、空き缶にぶつかった時には次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する)

  1. 空き缶をコース上に戻して再びコースに戻って進む
  2. 空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む

ただし、

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

メンバー

田島・みのう

コース紹介

コース全面
  • 3か所の交差点と鋭角のカーブが2か所あるコース

ロボットの製作

製作したロボット

ロボット

工夫した点

  • なるべく構造が簡単になるようにした。
  • コースの鋭角カーブの部分を曲がるために、光センサの間隔を調節した。(コースのライン25mm程度、センサ間隔70mm程度。当初センサ間隔30mm程度。)
    光センサ

今後改善すべき点

  • 缶を押さえる部分が大きすぎ、また弱いため、その部分の改善。特に大きすぎて前に傾いてしまうので、バランスをよくしたい。
  • 本当に中身が空である缶を使うとスイッチの反応が悪いため、その部分の改善。

プログラムの作成(田島)

課題

  • 空き缶をコース上に戻して再びコースに戻って進む

作成したプログラム

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; }
  }
}

工夫した点

  • ifの条件を二つにしたこと
  • ifに交差点をまたぐ場合を持ってきてelse ifに普段の前進を持ってきたこと

今後改善すべき点

  • 缶をどけるプログラムが単純なこと
  • 音を出すなどのオプションを付ける
  • 値があまり正確ではないこと

プログラムの作成(みのう)

課題

  • 空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む

作成したプログラム

#define THRESHOLD 45

// 変数宣言
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;
	hold_can = 0;
	first_cross = 1;
	do_task = 1;

	Off(OUT_B);

	while(do_task) {
		sensor = 0;
		if(SENSOR_1 > THRESHOLD) { sensor += 1; }
		if(SENSOR_3 > THRESHOLD) { sensor += 2; }
		
		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);
				}
			}
			OnFwd(OUT_A);
			OnFwd(OUT_C);
		} else if(sensor == 1) { // 右光センサが黒判定の時
			// 右旋回
			OnFwd(OUT_A);
			OnRev(OUT_C);
		} else if(sensor == 2) { // 左光センサが黒判定の時
			// 左旋回
			OnRev(OUT_A);
			OnFwd(OUT_C);
		} else { // それ以外の時(両光センサが白判定の時)
			// 直進
			OnFwd(OUT_A);
			OnFwd(OUT_C);
		}

		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回目の交差点通過でループ終了
	}

	// モータ自由、ブザー鳴動し停止
	Float(OUT_A+OUT_B+OUT_C);
	repeat(5) {
		PlaySound(SOUND_DOUBLE_BEEP);
		Wait(100);
	}
}

工夫した点

  • なるべく簡潔になるようにした。
  • 光センサによる条件分岐で、条件文が長くならないようにした。
  • 音を鳴らし効率的にデバッグ作業をできるようにした。

今後改善すべき点

  • 缶を置いた後の車体位置(光センサがラインをまたぐように)
  • マクロ、サブルーチンなどを使用してそれぞれの部分に分ける
  • その他、細かい点で値などの調整

反省・感想

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

コメントをどうぞ

  • 簡潔に書かれていてよいと思います。プログラムについても工夫した点などを説明してみてください -- TAKA? 2010-07-09 (金) 17:44:14


添付ファイル: file100624sensor01.jpg 166件 [詳細] file100701robot01.jpg 161件 [詳細] file100624course.jpg 190件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-07-09 (金) 17:44:14 (3273d)