[[2010a]]
*目次 [#mfd73aad]
#contents
*課題2:黒い線に沿って動くロボット [#b03f54b0]

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

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

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

ただし、

•速さと正確さを追求すること

•コースを1周したら自動的に止まること

•交差点では一時停止すること
*メンバー [#v3f7b031]
スズキ&br;
Ta2(写真配置の都合上、ウインドウを横に広げて見ていただきたい)
*ロボットについて [#c32884e4]
**本体 [#v99c2098]
#ref(MS_type1_全体.JPG,around,left)
#ref(MS_type2_全体.JPG,around,right)
LEFT:←「type1」&br; 空き缶を運ぶためにアームが前にあります。
&br;&br;
RIGHT:「type2」→&br; 空き缶を避けて進むため、&br; 邪魔なアームは後ろに。
#clear
&br;
#ref(MS_本体.JPG,around,left)
LEFT:タッチセンサー、光センサー、アームを外すとこんなにシンプルに…
&br;
まぁ、ほとんど最初のものと同じですが…
#clear
**各種パーツ [#z9608f12]
#ref(MS_タッチセンサー.JPG,around,left)
#ref(MS_光センサー.JPG,around,right)
LEFT:←タッチセンサーの接触部分?の脆さが難点…
&br;
RIGHT:本体を下から見ただけだったり…→
#clear
&br;
#ref(MS_タッチセンサーのみ.JPG,around,left)
#ref(MS_光センサーおよびアーム(type2).JPG,around,right)
LEFT:←分解するとこんな感じ
RIGHT:こちらも分解されている図→&br; アームはtype2のもの。
LEFT:←分解するとこんな感じ&br; タッチセンサの部分です。&br;
RIGHT:こちらも分解されている図→&br; 光センサとアームは一体化?しています。&br; アームはtype2のもの。
#clear
**工夫した点 [#c706e16c]
-重心がロボットの前の方だったので、バランスをとるためにRCXを少し後方に配置し、タイヤを前の方を大きくした。
&br;
-タッチセンサーの反応を良くするために部品をつけ、小さな力でもしっかりと反応するようにした。
&br;
-アームを簡単なものにしたため取り外しが容易にできて、役割に応じて変形できるようにした。
**苦労した点 [#j339ff9b]
-タッチセンサーがうまく反応しなかったこと。
&br;
-缶を取りこぼすことなく運ぶにはどのようなアームにすれば良いのか。
&br;
-タッチセンサーの反応を良くするために取り付けた部品が脆かったこと
*コースについて [#w8701438]
#ref(SH3E0008.jpg,around,left)
simple is the best!
&br; ただ、他の形が思いつかなかっただけですが…
&br; しかし思っていた以上にカーブは急になっていて、ちょっと光センサの取り付け位置を変える必要がありました。
#clear
**問題点 [#sd1408ed]
-場所によって閾値がばらばらで、線を無視して走ってしまうこと。
*プログラム [#v6f823fd]
**スズキのプログラム [#o95af1e0]
***空き缶を次の交差点まで運ぶプログラム [#e27c5f41]
 #define THRESHOLD 40	// 閾値
 #define turn_time 170	// 180°回転する時間
 #define go_time 90	//交差点から出る時間
 #define away_time 90	//缶から遠ざかる時間
 #define play_time 6000	//ロボットの動く時間
 int n=0;		//n=1:空き缶持っている
 task main(){
 
 	SetSensor(SENSOR_1, SENSOR_LIGHT);
 	SetSensor(SENSOR_2, SENSOR_TOUCH);
 	SetSensor(SENSOR_3, SENSOR_LIGHT);
 	ClearTimer(0);
 				//空き缶を次の交差点まで運ぶプログラム
    while(FastTimer(0)<play_time){
 		start follow_line;				//ライントレースの開始
              until(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD);	//交差点まで(センサー1と3が黒になる場合まで)
 		stop follow_line;				//ライントレースの終了
 		Off(OUT_A+OUT_C);				//2秒間停止
 		Wait(200);
 		OnFwd(OUT_A+OUT_C);				//交差点から出る
 		Wait(go_time);
 		if(n==1){					//もし空き缶を持っている なら
 			OnFwd(OUT_A);OnRev(OUT_C);		//空き缶を交差点に戻す
 			Wait(turn_time);
 			OnRev(OUT_A+OUT_C);			//後ろに下がって空き缶に当たらないようにする
 			Wait(away_time);
 			OnFwd(OUT_A);OnRev(OUT_C);		//進行方向へ回転
 			Wait(turn_time);
 			OnRev(OUT_A+OUT_C);			//ライン上に戻る
 			Wait(away_time);
 			Off(OUT_A+OUT_C);
 			n=0;					//作業が完了したためn=0にする
 			
 		}
    }
   
 }
 
 				//ライントレースのプログラム
 task follow_line(){       
 while (true){
           if(SENSOR_1>THRESHOLD&&SENSOR_3<THRESHOLD){		//センサー1が白、センサー3が黒の時
               OnFwd(OUT_A);OnRev(OUT_C);			//右に回転し軌道を修正
           }else if(SENSOR_1<THRESHOLD&&SENSOR_3>THRESHOLD){	//センサー3が白、センサー1が黒の時
               OnFwd(OUT_C);OnRev(OUT_A);			//左に回転し軌道を修正
           }else{						//両方白または、両方黒の時 
               OnFwd(OUT_A+OUT_C);				//前進する
	       }
	   if(SENSOR_2==1){ 	  	 		        //空き缶に当たったら 							    
 n=1;								//nを1にする		
 	  }
      }
 }
 
**工夫した点 [#zaefb94b]
-できるだけ簡単になるようにした。
&br;
-プログラムに詳しく説明を入れ分かりやすいようにした。
**今後改善すべき点 [#na81ef9a]
-タッチセンサーが反応したら音が鳴るようにする。
&br;
-動く時間を交差手点を通った回数にする。
**Ta2のプログラム [#laca2f48]
***空き缶を避けて進むプログラム [#sb42aaf4]
 #define light 40		//閾値
 #define time 50		//待ち時間
 #define RUN_TIME 8700	//走る時間
 
 task main()
 {
 	SetSensor(SENSOR_1,SENSOR_LIGHT);
 	SetSensor(SENSOR_2,SENSOR_TOUCH);
 	SetSensor(SENSOR_3,SENSOR_LIGHT);
 	
 	ClearTimer(0);
 	
 	while(Timer(0) <= RUN_TIME)
 	{
  	
 	start follow_line;
 
 	if(SENSOR_2>1)			//タッチセンサーが反応
 		{
 		
 		stop follow_line;	//ライントレースのタスクを一旦停止
 
 		OnRev(OUT_A+OUT_C); 
 		Wait(time);			
 	
 		OnFwd(OUT_A);
 		OnRev(OUT_C);
 		Wait(100);
 		Off(OUT_A+OUT_C);
 	
 		OnFwd(OUT_A+OUT_C);
 		Wait(130);
 	
 		OnFwd(OUT_C); OnRev(OUT_A);
 		Wait(100);
 		Off(OUT_A+OUT_C);
 	
 		OnFwd(OUT_A+OUT_C);
 		Wait(280);	
 	
 		OnFwd(OUT_C); OnRev(OUT_A);
 		Wait(100);
 		Off(OUT_A+OUT_C);	
 		OnFwd(OUT_A+OUT_C);
 		Wait(100);
 		}				//缶を避けてラインに戻る。
 	}
 }
 
 
 
 
 
 task follow_line()				//ライントレースのプログラム
 {
 
 while(true){
 
 	if(SENSOR_1>light){
 		if(SENSOR_3>light){ 	
 			OnFwd(OUT_A+OUT_C);	
 			}
 		else{  				
 			OnFwd(OUT_A);
 			OnRev(OUT_C);
 			}
 		}
 
 	else{
 		if(SENSOR_3>light){
 			OnRev (OUT_A);
 			OnFwd(OUT_C);		
 			}
 
 		else{
 			Off(OUT_A+OUT_C);	
 			Wait(20);		
 			OnFwd(OUT_A+OUT_C);	
 			Wait(20);					
 			}
 		}
 	}
 }
**工夫した点 [#pd010184]
缶を避けるためのタスクと、ライントレースのタスクを分けて作成した。
**今後改善すべき点 [#t7e9f648]
elseの使い方を間違っていたかもしれない。
&br;
音を鳴らしてみたい。
&br;
もっとシンプルに。
*反省・感想 [#t03998f9]
elseに嫌われた…。また、空き缶が軽すぎてタッチセンサーが反応しなくて困った。by Ta2

プログラムを考えるのが大変だった。タッチセンサーが反応しなかったためロボットを改造するのに苦労した。byスズキ
*コメント [#mbade809]
コメントをどうぞ
- ロボットについて、プログラムについて工夫した点や問題点などを具体的に説明してください -- [[TAKA]] &new{2010-07-09 (金) 17:48:49};
- 二人目のプログラムではsensor_2が反応した際に、いったんfollow_lineのtaskをとめたほうがよいのではないでしょうか? -- [[FI]] &new{2010-07-31 (土) 15:16:23};

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS