[[2007b/MemberOnly/進行状況A]]
-----
CENTER:COLOR(crimson):&size(22){ロボコン};
-----

RIGHT:訪れてくれた人の数 &counter(all);

LEFT:目次
#contents
*目的 [#c29ec5e6]
今までやってきたことをすべて利用し、課題を突破できるようなロボットを制作する

*課題 [#k0cadf90]
所定の位置におかれているテニスボールをゴールまで運ぶ。

詳細は下のページに書いてあります。~
[[2007b/ロボコン]]~
&ref(./DSCF0079.JPG,22%,競技場);
コースの写真~

*ロボット [#z8c484b9]
&ref(./DSCF0043.JPG,23.5%,側面);
&ref(./DSCF0044.JPG,23.5%,真上);~
アームを開いてる~
&ref(./DSC_0022.JPG,25%,側面);
&ref(./DSC_0023.JPG,25%,アームUP);~
アームを閉じてる~

**特徴 [#c8d91a2f]
***長所 [#g65114c7]
-最大でボールを二個取れるアームを前方に持つ。~
-駆動部はキャタピラを採用。前方に車輪を付け、障害の隙間を登ることができる。~
-RCXは''一つしか''使用していない。~
***短所 [#s59f15c0]
-一台ですべての動作をさせるので車体が非常に大きい。
-車体の前方が重いため曲がるのが苦手~

&ref(./DSC_0023-c.jpg,25%,光センサ);
&ref(./DSCF0053.JPG,21%,裏);~
光センサは車体の中央に配置。この位置でないとカーブで曲がりきることができない。~

**工夫した点 [#wf65375f]
***キャタピラを使うことで障害物を乗り越えるようにしたこと。 [#hdb24fde]
前輪を斜めにつけることによって車体に角度をつけ障害物を乗り越えるようにした。~
&ref(./DSC_0027-c.jpg,25%,キャタピラ);
&ref(./DSC_0027-c.jpg,22%,キャタピラ);
&ref(./コース.jpg,50%,コース);
&ref(./DSCF0080.JPG,19%,隙間);~
赤い丸の部分が前輪

&ref(./DSC_0035-c.jpg,25%,キャタピラ);~
キャタピラの中身が空洞だとキャタピラがつぶれて変形し,障害物を乗り越えられなくなるためキャタピラの中にホイールを詰め込んだ~
青い下線のホイールは他の4つのホイールより直径が少し大きくなっており、登った時に進みやすくなっている。~

下の写真のように進みます。~
&ref(./DSCF0066.JPG,19%,側面);
&ref(./DSCF0065.JPG,19%,側面);
&ref(./DSCF0067.JPG,19%,側面);
&ref(./DSCF0068.JPG,19%,側面);
&ref(./DSCF0070.JPG,19%,側面);~

この方式の難点として「スピードが遅い」「車体が斜めなのでキャスターがつけられないため曲がりにくい」が挙げられる。~
解決策として「ボールを一度に二つ運べるアームにする」、「前輪を滑りやすい部品にする」を採用した。~
また曲がるときには、左右のモータを逆に動かしうまく曲がるようにした。~

***ボールを最大二個取れるようなアームを作ったこと [#c111136b]
&ref(./DSC_0048.JPG,25%,アーム);
&ref(./DSC_0050.JPG,25%,アーム);~
ボールを抑えるギヤとタイヤをなるべく下に付け確実にボールを取れるようにした。
上手くボールを二つ取れるように、つかむ部分の幅を広くした。~
&ref(./DSCF0051.JPG,17.5%,側面);
&ref(./DSC_0026.JPG,20%,アーム);
&ref(./DSC_0027.JPG,20%,アーム);~
持ち上げられるように、一番トルクの強いギヤを採用。
また、持ち上がった時にボールがこぼれないようにストッパーを付けた。

***一つのモーターでボールを”つかむ・はなす”、”持ち上げる・おろす”の動作ができるようにした。 [#t119762e]

&ref(./DSC_0038-c.jpg,20%,アーム);
&ref(./DSC_0039-c.jpg,20%,アーム);
&ref(./DSC_0040.JPG,20%,アーム);~
いちばん左の図の赤い円で囲ってあるギヤが回転することにより、青い円で囲ってあるギヤが動く。
赤い円で囲ったギヤは強い力で回さないと動かないため、写真のような、らせん状のギアを使用して動かす。~

&ref(./DSC_0033-c.jpg,25%,アーム);
&ref(./DSC_0034-c-2.jpg,25%,アーム);~
青い円で囲んだギアが動くことにより橙色で囲んだギアが動き、アームが動きだす。~

&ref(./DSC_0050-c.jpg,25%,アーム);
&size(32){&color(blue){''→''};};&ref(./DSC_0033-c-2.jpg,25%,アーム);~
アームが締まり動かなくなると、今までアームを動かしていた力がアームを持ち上げる力に変わる。~
下がるときは昇るときと同様に、アームが開ききるとアームを動かしていた力がアームを下げる力に変化するため、アームを降ろせるようになる。~

これの問題点は「締める→上げる」、「開く→下げる」の順番でしか動けないこと。

アームを降ろす前にアームが開くとボールをこぼしてしまうため、ストッパーを付けてアームが後ろに下がりすぎないようにした。~

**苦労した点 - 解決策 [#k90b0568]
***障害物を乗り越える [#qec3f795]
LEFT:''1''、障害物を乗り越える際、ひっくり返ってしまう。
-解決策、前方にアームを装着し、RCXをなるべく前方に配置した。

&size(32){&color(red){''→''};};結果、ひっくり返らずに進めるようになった。
&ref(./DSC_0027-c-2.jpg,19%,アーム);~

LEFT:''2''、光センサが障害物を乗り越えるときに浮いてしまうため、ライントレースを正常にできないことがあった。
-解決策、閾値を改良。38以下で黒を認識するように改良。

&size(32){&color(red){''→''};};結果、うまく進めるようになった。

***曲がる [#wb585a14]
LEFT:''1''、カーブを曲がりきれない。
-解決策1、光センサの位置を車体の真ん中に持ってきた。
-解決策2、曲がるときは、左右のキャタピラが逆方向に動くようにした。
-解決策3、前方が重くなりすぎないように調整。

&size(32){&color(red){''→''};};結果、なんとか曲がれるようになった。しかし旋回ができない。
&ref(./DSC_0023-c.jpg,19%,アーム);~

***ボールを持ち上げる [#y532f347]
LEFT:''1''、持ち上げる部分の重さに耐えきれず、ブロックが分解してしまうことがあった。
-解決策、補強の部品を付ける。特に穴のあいてる部品をつなげ合わせ補強した。

&size(32){&color(red){''→''};};結果、プログラム実行中には外れなくなったが、直したいときに外しにくくなった。
&ref(./DSC_0047-c.jpg,19%,アーム);~

LEFT:''2''、最大まで持ち上げるとボールを下す前にアームが開きボールがこぼれてしまう。
-解決策、ストッパーを装着

&size(32){&color(red){''→''};};結果、アームが上がりきらなくなったのでボールを降ろしてからアームが開けるようになった。~
&ref(./DSC_0036.JPG,19%,アーム);
&ref(./DSC_0041.JPG,19%,アーム);
&ref(./DSC_0042.JPG,19%,アーム);

*ソースプログラム [#eab20073]
 #define MOVE_TIME 350  //ボールをおいてから戻る時間
 #define THRESHOLD 38  //光センサの閾値
 
 void ArmUp(){  //アームを上げる時間
	OnFwd(OUT_B);
	 Wait(700);
	Off(OUT_B);
 }
 
 void ArmDown(){  //アームを下げる時間
	OnRev(OUT_B);
	 Wait(400);
	 Off(OUT_B);
 }
  
 void SenkaiRight(int time){  //右旋回 引数timeで旋回時間を指定
 	OnRev(OUT_A);
 	OnFwd(OUT_C);
	Wait(time);
	Off(OUT_A+OUT_C);
 }
 
 void SenkaiLeft(int time){  //左旋回 引数timeで旋回時間を指定
	OnFwd(OUT_A);
 	OnRev(OUT_C);
	Wait(time);
	Off(OUT_A+OUT_C);
 }
 
 void LineTrace(){  //ライントレースのプログラム
	ClearTimer(0);
	while(true){
	 		if(SENSOR_1>THRESHOLD&&SENSOR_3> THRESHOLD){  //両方とも白の場合
	 			OnRev(OUT_A+OUT_C);  //直進
	 		}
	 		if(SENSOR_1>THRESHOLD&&SENSOR_3<= THRESHOLD){  //光センサ1が白3が黒の場合
	 			OnRev(OUT_A);  //左回り
	 			OnFwd(OUT_C);
	 		}
	 		if(SENSOR_1<=THRESHOLD&&SENSOR_3> THRESHOLD){  //光センサ1が黒、3が白の場合
				OnRev(OUT_C);  //右回り
	 			OnFwd(OUT_A);
	 		}
	 		if(SENSOR_1<= THRESHOLD && SENSOR_3<= THRESHOLD){  //光センサが両方とも黒の場合
	 			
	 				Off(OUT_A+OUT_C);  //停止
	 				break;
	 			
	 		}
	 	}
 }
 
 void LineTrace_Back(){  //ライントレースプログラム(帰り)
	ClearTimer(1);
	while(true){
	 		if(SENSOR_1>40&&SENSOR_3>40){  //両方とも白の場合
 
	 			OnFwd(OUT_A+OUT_C);  //直進
	 		}
	 		if(SENSOR_1>40&&SENSOR_3<=40){  //光センサ1が白3が黒の場合
	 			OnFwd(OUT_A);  //右回り
	 			OnRev(OUT_C);
	 		}
	 		if(SENSOR_1<=40&&SENSOR_3>40){   //光センサ1が黒、3が白の場合
				OnFwd(OUT_C);  //左回り
	 			OnRev(OUT_A);
	 		}
	 		if(SENSOR_1<=40 && SENSOR_3<=40){//光センサが両方とも黒の場合
	 			if(Timer(1)>MOVE_TIME){  //尚かつ、タイマ1がMOVE  TIME以上なら
	 				Off(OUT_A+OUT_C);//停止
	 				break;
	 			}
	 		}
	 		if(Timer(1)>MOVE_TIME){     //タイマ1がMOVE TIMEを超えたらライントレースを中断
	 			break;
	 		}
	 	}
 }
 
 
 
 ////// 本 文 //////
 task main(){
	 SetSensor(SENSOR_1,SENSOR_LIGHT);  光センサ1をセット
	 SetSensor(SENSOR_3,SENSOR_LIGHT);  光センサ3をセット
 
	
	 int i=0,j=0;  //変数i,jを定義
	
	 
	 for(i=1;i<=2;i++){      //ボールをとって運びボールをおくという動作を二回繰り返す。一回目で2つのボールを運び、2回目で最後の一つのボールを運ぶ。
  
	 	LineTrace();               //ライントレースをしてボールがおいてある位置まで移動
 
    ////ボールのある位置に到着。ボールをとりやすくするためにロボの向きを修正
	 	OnFwd(OUT_A+OUT_C);  //後退
	 	Wait(103);
	 	SenkaiLeft(15);      //左旋回
	 	ArmDown();
	 	OnRev(OUT_A+OUT_C);  //直進
	 	Wait(75);
	 	Off(OUT_A+OUT_C);    //停止
 
      //ボールをとり、ゴールまで続くラインを見つけ出す
	 	ArmUp();             //アームを上げる:ボールをとる
	 	OnFwd(OUT_A+OUT_C);  //後退
	 	Wait(40);
	 	SenkaiRight(80);     //右旋回
 
	 	while(1){            //ラインを捜索
	 		if(SENSOR_1>THRESHOLD&&SENSOR_3<THRESHOLD){  //光センサ1白、3黒の場合
	 			Off(OUT_A+OUT_C);  //停止
	 			break;
	 		}
	 		OnRev(OUT_A); //左旋回
	 		OnFwd(OUT_C);
	 	}
	 	PlaySound(SOUND_LOW_BEEP); //ラインを見つけたという確認音
	 	LineTrace();          //ライントレース→ゴールに向かう
 	 	
    ////ゴールに到着
      //ボールをしっかりおける位置へロボの場所を微調整
	 	OnFwd(OUT_A+OUT_C);  //後退
	 	Wait(35);
	 	SenkaiRight(130);    //右旋回
	 	OnFwd(OUT_A+OUT_C);  //後退
	 	Wait(25);
	 	Off(OUT_A+OUT_C);    //停止
		
		PlaySound(SOUND_DOUBLE_BEEP);  //音を鳴らす
      //ボールをおきロボがボールに触れない位置へ移動
		ArmDown();           //ボールをおく
 
		OnFwd(OUT_A+OUT_C);  //後退
		Wait(50);
		Off(OUT_A+OUT_C);  //停止
 
	        while(1){
		
		      SendMessage(11);   //応援ロボットにメッセージの送信
                     →応援ロボットはこれを受け、祝いのメロディーを流す
	        } 	
         } 
 }
	
*結果 [#zea3e6bf]
ぎりぎり''優勝''

内容:一回目は黒線を探すことができずに二回ともリタイヤしたが、三回目の挑戦でボールを二個同時に運ぶことができた。

*問題点 [#pdeb9872]
-障害を乗り越えるように車体を斜めにしたため、前輪のキャスターが回転できず曲がりにくいこと。
-車体がコースに比べて大きく、うまく旋回ができないこと。

*感想 [#tdaf6f65]
有馬~
-いろいろ試行錯誤、紆余曲折の末、立派に課題をこなせるようなロボットができてほっとした。
-ロボコン一回目はロボが今までになかったような挙動を起こし失敗してしまったため、かなり焦ったが、何とか修正しうまくボールを運べたときは、すごくうれしかった

北田~

桑名~

吉澤~
-最初はボールを運べないと思ったが、意外と出来た。ボールを掴むのがちょっとした誤差で、できなくなったので大変でした。最後の授業で良い結果が残せたのでよかった。

*応援ロボ [#w2abe07c]
&ref(./DSCF0077.JPG,23.5%,応援);~
上についてる羽を回して応援してくれます。~

*コメント [#vf04abff]
よろしければコメントをお願いします
#comment

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