[[2012a/MemberOnly/進行状況A]]

[[2012a/Member]]

[[2012a/A4]]

[[2012a/A4/Tnakano]]

目次

#contents

*課題3 ロボコン [#z6fe44ae]
-内容

  ロボットが決められた位置にある空き缶を運び中身の入っている缶の上に積み上げ、積み上げた個数によって得点を競う競技です。

#ref(robocon2012a[1].png,left,nowrap,コース図)

-競技説明

  詳しい競技説明とルール、得点については以下をご覧ください。

[[2012a/ロボコン]]

**ハードウェアについて [#s91bee54]
***全体像 [#f35091e2]
これがロボットの全体像です。前方に缶を挟むための大きなハサミ、後方にnxt2台を乗せました。センサーは光センサーを2つひとつは中央のラインを読むため、もう1つは、缶の正確な場所を見つけるために使いました。また、nxtのマスター側は、ロボットの駆動輪、センサー、スレイブ側は、ハサミの開閉と上下を制御できるよう配線しました。

#ref(robocon1.png,left,nowrap,全体像)

***ハサミ部分について [#m28ad9a2]
これがハサミの全体像です。後ろにレールをつけて、ハサミ全体を持ち上げるようにして、缶を持ち上げます。

#ref(robocon2.png,left,nowrap,ハサミ全体)

これがハサミの機構です。1つのモータでハサミの両側を動かすことができます。真ん中のネジの様な部品が回転することで、その隣のギアがそれぞれ逆回転し、ハサミを開閉することができます。

#ref(robocon3.png,left,nowrap,ハサミ機構)

***駆動輪について [#oe220216]
これがマスター側の駆動輪、光センサー部分です。光センサーは、駆動輪の間と左側の2か所についています。

#ref(robocon4.png,left,nowrap,駆動輪、センサー)

ハサミ部分は、真ん中の上の方についている大きな2つのタイヤでハサミのレールをはさむようにして差し込みます。この2つのタイヤを回転させることで、ハサミを上下させます。

#ref(robocon5.png,left,nowrap,ハサミ上下の機構)

これが持ち上げた時の様子です。

#ref(robocon6.png,left,nowrap,sample)

***ハードウェア反省 [#q85f300f]
反省は、まずロボット自体が大きくなりすぎてしまい、小回りが利かなくなってしまったことです。これによりライントレースができなくなってしまいました。それ以外では大きな問題点はありませんでしたが、大きくなってしまった分、強度が無くなり、壊れやすくなってしまいました。

**プログラムについて [#obb22336]
マスター側でセンサーと駆動輪、スレイブ側でハサミの開閉上下を制御しました。

***プラン [#q3161c04]
最初に、下の図のように一番手前の缶をターゲットにして、前を向いている状態から回転センサーを使って狙いをつけます。そしてそのまま直進し、缶の間を抜けながら、コースの真ん中の線がある位置まで行きます。この時、缶を2つつかんでしまわないように最初にハサミを缶の1.5倍くらい開いておきます。(そうしないと缶を2つ持ち上げてしまう。)無事、缶を持ち上げ、コースの真ん中の線まで来たら車体を右に回転させながら、光センサーを用いて、中身の入った缶の正確な位置を探します。中身の入った缶は、黒いので、センサー値が大きく変化します。センサーが缶の左端に反応したら、そこで回転センサーを用いて、センサーとハサミのずれている分だけ移動することで、ちょうど缶を積み上げることができます。

#ref(robocon2012a[2].png,left,nowrap,プラン)

***プログラムリスト [#a4bddab2]
マスター側プログラム

 //**************************************//
 //	nxtプログラム MASTER		//
 //**************************************//
 
 #define	turn90		420
 #define	turn45		170	
 
 #define	close	2000
 #define	open	2500
 #define	up	490
 #define	down	480
 
 #define BT_CONN 1
 #define get_sBOX 1
 #define get_fBOX 2
 #define out_sBOX 3
 #define out_fBOX 4
 
 void turn_l(int i){	
 	Float(OUT_BC);
  	RotateMotor(OUT_C,70,i);
 	Wait(200);
 	Off(OUT_BC);
 	Wait(200);
 }
 
 void turn_r(int i){	
 	Float(OUT_BC);
 	RotateMotor(OUT_B,70,i);
 	Wait(200);
  	Off(OUT_BC);
 	Wait(200);
 }
 
 task main(void){
 
 	int get_s=0,get_f=0,out_s=0,out_f=0;
 
 	int modeM;
 
 	SetSensorLight(IN_2);
 	SetSensorLight(IN_3);
  	
 	ResetTachoCount(OUT_B);
 	
 	modeM=1;
 	
 	while(1){
 		
 		switch(modeM){
 			case 1:
 				turn_r(turn45);
 				modeM=2;
 				break;
 		
 			case 2:
 				RotateMotor(OUT_BC,50,1300);
  				Wait(200);
 				modeM=3;
 				break; 
 				
 			case 3:
 				modeM=4;
  				CoastEx(OUT_BC,0);
 				get_s=1;
 				break;
 
 			case 4:
 				SendRemoteBool(BT_CONN,get_sBOX,get_s);           //スレイブ側にブール値を送信
 				ReceiveRemoteBool(get_fBOX, true,get_f);          //スレイブ側からブール値を受信
 				if(get_f==1){                                     //スレイブ側からブール値を受信するまで待機
 					modeM=5;
 					PlayTone(TONE_C4,150);
 				}
 				break;
 				
 			case 5:
 				Wait(200);
 				modeM=6;
 				break;
 				
 			case 6:
 				OnFwd(OUT_BC,40);
 				if(Sensor(IN_3)<40){
 					modeM=7;
 				}
 				break;
 				
 			case 7:
 				if(Sensor(IN_3)<55){
 					modeM=8;
 					CoastEx(OUT_BC,0);
 				}
 				break;
 				
 			case 8:
 				OnFwd(OUT_B,50);
 				if(Sensor(IN_2)<35){
 					modeM=9;
 				}
 				break;
 				
 			case 9:
 				RotateMotor(OUT_B,60,180);
 				Wait(200);
 				CoastEx(OUT_BC,0);
 				out_s=1;
 				modeM=10;
 				break;
 				
 			case 10:
 				SendRemoteBool(BT_CONN,out_sBOX,out_s);           //スレイブ側にブール値を送信
 				ReceiveRemoteBool(out_fBOX, true,out_f);          //スレイブ側からブール値を受信
 				if(out_f==1){                                     //スレイブ側からブール値を受信するまで待機
 					modeM=11;
 				}
 				break;
 				
 			case 11:
 				RotateMotor(OUT_BC,-50,500);
 				modeM=12;
 				break;
 				
 			case 12:
 				CoastEx(OUT_BC,0);
 				
 				break;
 				
 		}
 	}
 } 			

スレイブ側プログラム
 //**************************************//
 // 	nxtプログラム SLAVE		//
 //**************************************//
 
 #define	turn90		420
 #define	turn45		210	
 
 #define	close	2500
 #define	open	2500
 #define	up	490
 #define	down	480
 
 #define BT_CONN 1
 #define get_sBOX 1
 #define get_fBOX 2
 #define out_sBOX 3
 #define out_fBOX 4
 
 task main(void){
 	int get_s=0,get_f=0,out_s=0,out_f=0;
 
 	int modeS;
 	
 	modeS=1;
 	
 	while(1){
 		switch(modeS){
 		
 			case 1:
 				ReceiveRemoteBool(get_sBOX,true,get_s);           //マスター側からブール値を受信
 				if(get_s==1){                                     //マスター側からブール値を受信するまで待機
 					modeS=2;
 				}
 				break;
 				
 			case 2:
 				PlayTone(TONE_C4,150);
 				RotateMotor(OUT_A,-90,close);
 				Wait(200);
 				
 				modeS=3;
 				break;
 				
 			case 3:
 				RotateMotor(OUT_BC,-65,up);
 				Wait(200);
 				modeS=4;
 				break;
 				
 			case 4:
 				get_f=1;
 				SendResponseBool(get_fBOX,get_f);                 //マスター側へブール値を送信
 				ReceiveRemoteBool(out_sBOX,true,out_s);           //マスター側からブール値を受信
 				if(out_s==1){                                     //マスター側からブール値を受信するまで待機
 					modeS=5;
 				}
 				break;
 				
 			case 5:
 				PlayTone(TONE_C4,150);
 				RotateMotor(OUT_A,90,open);
 				Wait(200);
 				modeS=6;
 				break;
 				
 			case 6:
 				out_f=1;
 				SendResponseBool(out_fBOX,out_f);                 //マスター側へブール値を送信
 				break;
 				
 		}
 			
 	}
 }

***プログラム反省 [#d2efedff]
プログラムの反省は、最初に通信がうまくいかず、設定等に時間がかかってしまいました。また、プログラムのプラン的に少し無理があるような感じになってましました。もう少し、正確に缶を積み上げられるようにプログラムのプランをもう少し考えればよかったと思いました。

**失敗例 [#p398c0b1]
最初、下の写真のようなマジックハンドのようにして、缶を持ち上げようとしました。しかし、かなりの重量で、マジックハンドを伸ばすのに相当な力が必要で、モータで動かすことができない構造になってしまいました。

#ref(robocon7.png,left,nowrap,失敗例)

超音波センサーを使って缶との距離を測ろうとすると、缶の側面が曲面になっているので、上手く値が安定せず、正確に測ることができませんでした。
また、超音波センサーを使って缶との距離を測ろうとすると、缶の側面が曲面になっているので、上手く値が安定せず、正確に測ることができませんでした。

**反省感想 [#t5df03c5]
今回テスト等もあり、時間が少なく、制作にあまり時間が当てられませんでした。その中でも、ハードウェアの製作にかなり時間がかかってしまいました。よってプログラムの時間がほとんどなくなってしまいました。ハードウェアに時間がかかってしまった要因として、組立のプランがなかなかまとまらなかったという点がありました。今後は、制作期限を考え、しっかり計画を行い、制作を進めていけたらいいと思いました。

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