目的

黒いラインに沿って動くロボットを作成する。

手段

RC2を使用

コース

081120_182510.jpg

マシン

081209_213121.jpg

・上から見た全体図

081204_165653[1].jpg

・飾りのない全体像

工夫した点

・光センサの読み取り幅を、レゴの凸凹で固定するのではなく、

軸を通すことによって臨機応変に幅を調節できるようにしてある。

081204_165725[1].jpg

*↑↓光センサの可動部分

081204_165725[1].gif

プログラム

・その1 (担当:)

void go_straight(int t){ 
	OnFwd(OUT_A);
	OnFwd(OUT_C);
	Wait(t);
	Off(OUT_A+OUT_C);
	Wait(45);
}
void back_straight(int t){
	OnRev(OUT_A);
	OnRev(OUT_C);
	Wait(t);
	Off(OUT_A+OUT_C);
	Wait(45);
}
void turn_right(int t){
	OnFwd(OUT_A);
	OnRev(OUT_C);
	Wait(t);
	Off(OUT_A+OUT_C);
	Wait(45);
}
void turn_left(int t){
	OnRev(OUT_A);
	OnFwd(OUT_C);
	Wait(t);
	Off(OUT_A+OUT_C);
	Wait(45);
}
void turn2(int t){
	OnFwd(OUT_C);
	Wait(t);
	Off(OUT_A+OUT_C);
	Wait(45);
}
task main(){

	int line_count;
	int count_value=0;
	int back_flag=0;
	int back_time=0;
	
	ClearTimer(0);
	ClearTimer(1);
	

	#define THRESHOLD 47

	SetSensor(SENSOR_1,SENSOR_LIGHT);
	SetSensor(SENSOR_3,SENSOR_LIGHT);
	SetSensor(SENSOR_2,SENSOR_TOUCH);
	OnFwd(OUT_A);
	OnFwd(OUT_C);
	
	while(1){
		while((SENSOR_1> THRESHOLD)&&(SENSOR_3> THRESHOLD)){
			if((Timer(0)>20)&&(back_flag==1)){
				OnFwd(OUT_A+OUT_C);
				back_flag=0;
				back_time=back_time+20;
			}
			if((SENSOR_2>0)&&(back_flag==0)){
				OnRev(OUT_A);
				OnRev(OUT_C);
				back_flag=1;
				ClearTimer(0);
			}
			if(Timer(1)>(2400+back_time)){
				break;
			}
			
			
			
		}
		if(Timer(1)>(2400+back_time)){
			break;
		}
		if((SENSOR_1< THRESHOLD)&&(SENSOR_3< THRESHOLD)){
			line_count=0;
			while(line_count==0){
				if((SENSOR_1< THRESHOLD)&&(SENSOR_3< THRESHOLD)){
					line_count++;
					Wait(20);
					count_value++;	
				}
			}
		}else{	
			if(SENSOR_1< THRESHOLD){
				Off(OUT_A);
				while(SENSOR_1<THRESHOLD){//Left
					
					if(back_flag==0){
						OnFwd(OUT_C);
						
					}else{
						OnRev(OUT_A);
						OnFwd(OUT_C);
						
					}
					if((SENSOR_1< THRESHOLD)&&(SENSOR_3< THRESHOLD)){
						break;
					}
				} 
			}else{
				Off(OUT_C);
				while(SENSOR_3<THRESHOLD){//Right
					
					if(back_flag==0){
						OnFwd(OUT_A);
						
					}else{
						OnRev(OUT_C);
					 	OnFwd(OUT_A);
						
					 }
					if((SENSOR_1< THRESHOLD)&&(SENSOR_3<  THRESHOLD)){
						break;
					}
				}
			}
		}
	}
	
	Off(OUT_A+OUT_C);
		
}

・その2 (担当:メガネ1)

#define THRESHOLD 47 //閾値
int stop_line;
     
task main ()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサ
SetSensor(SENSOR_3,SENSOR_LIGHT);//光センサ
SetSensor(SENSOR_2,SENSOR_TOUCH);//タッチセンサ
stop_line = 0;//交差点カウント
while(stop_line < 13) { //交差点通行数12=2周
if ((SENSOR_1 > THRESHOLD)&&(SENSOR_3 > THRESHOLD))
{OnFwd(OUT_A+OUT_C);}//両方白→前進
if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD))//左が線上→左に回転
         {
                   OnFwd(OUT_C);
                   OnRev(OUT_A);
        }
if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 < THRESHOLD))//右が線上→右に回転
          {
                   OnRev(OUT_C);
                   OnFwd(OUT_A);
        }
  
if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 < THRESHOLD)){//両方が線上→一旦停止
        Off(OUT_A+OUT_C);
        Wait(300);
        OnFwd(OUT_A+OUT_C);Wait(45);
       stop_line = stop_line + 1;
    }
if(SENSOR_2 == 1){//タッチセンサオン→少し下がって一旦停止
       OnRev(OUT_A+OUT_C); 
       Wait(20);
       Off(OUT_A+OUT_C);
       Wait(300);
       OnFwd(OUT_A+OUT_C);Wait(30);
       stop_line = stop_line + 1;
    }
} 
Off(OUT_A+OUT_B+OUT_C);//二周回って終了
}
     

結果

・残念ながらここに動画は張り付けられないが、きちんと作動することが確認できた。

考察/感想

      ・最初に書いたプログラムが全く動かなかったため、最初から打ち直さなくてはならずやや焦った。

・結果的にそれなりに満足な動きと見た目になったため、よかったと思う。

  • whileを使ってもよかったと思います<二週回って終了のライン -- なかむら? 2008-12-11 (木) 13:55:27

一応書くべきことはきちんとかけています。全体的にもう少し詳しく書きましょう。
例えば、ライントレースの原理を図で説明したり、プログラムにはどのような選択肢があって、どうしてそれを選んだのか等。  FI


添付ファイル: file081204_165725[1].gif 227件 [詳細] file081204_165653[1].jpg 209件 [詳細] file081209_213121.jpg 226件 [詳細] file081204_165725[1].jpg 213件 [詳細] file081120_182510.jpg 231件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-02-09 (月) 17:43:02