目次

課題

 課題:紙パック収集・分別ロボットの作成  紙パックを収集して色ごとに別の目的地まで運ぶ

コースの紹介

http://yakushi.shinshu-u.ac.jp/robotics/?plugin=ref&page=2009a%2F%A5%ED%A5%DC%A5%B3%A5%F3&src=robocon2009a-1.png

ロボットの紹介

  • ロボット 掴む部分
    090804_2104~0001.jpg
090804_2104~0005.jpg

つかむ部分をまず考えました。今回は板の上にある牛乳パックをはこぶということだったので、しっかりと牛乳パックをつかむためにモーターを使いました。難点としては、前方に重心がかかってしまい、前のめり気味なところですが、しっかり進むよう試行錯誤して取り付けました。

車輪部

090804_2104~0002.jpg

ロボット,亮嵶愽瑤蓮嵌羈單簡単に、かつ、重くならない車輪部」を目指して考えた結果この形になりました。前輪が外れやすいという不安要素がありますが...

  • ロボット

ロボット△諒は牛乳パックがのせてある板のところまでロボット,魃燭屬燭瓩里發里任后こっちの方は、キャタピラーを使って、幅を広くしました。こっちはロボット,魃燭屬海箸主な仕事になるため、土台作りが大変でした。しかし、なんとかこの形にまとまり、ロボット,しっかり収まるようになりました。

090804_2104~0003.jpg
090804_2104~0004.jpg

下の写真はロボット△縫蹈椒奪鉢,鮠茲辰韻深命燭任后

090805_1110~0001.jpg

プログラミングの紹介

NUMBER_1

#define turn_time 95  //90度旋回するのに要する時間
#define turn_right OnFwd(OUT_A);OnRev(OUT_C);Wait(turn_time);Off(OUT_A+OUT_C);  //右に90度旋回する
#define turn_left OnFwd(OUT_C);OnRev(OUT_A);Wait(turn_time);Off(OUT_A+OUT_C);  //左に90度旋回する
#define go_straight(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);  //直進する
#define SIGNAL 11

 task main()
	{
	   SetSensor(SENSOR_3,SENSOR_TOUCH);  //センサー3をタッチセンサー
	  
	  
	   Wait(300);  //スイッチを入れてから少し待つ
	   go_straight(300);  //直進
	   turn_right;  //右へ旋回
	   go_straight(200);  //直進
	   turn_right;  //右へ旋回
	   go_straight(300);  //直進
	   turn_left;  //左へ旋回
	   go_straight(300);  //直進
       if(SENSOR_2==1)  //タッチセンサーが反応したとき
         {
	   Off(OUT_A+OUT_C);  //停止
	   Wait(300);  //少し待つ
	   SendMessage(SIGNAL);  //SIGNALを送信
	  }   	
	   
       }

NUMBER_2

#define turn_time 55  //90度旋回するのに要する時間
#define turn_right OnFwd(OUT_A);OnRev(OUT_C);Wait(turn_time);Off(OUT_A+OUT_C);  //右に90度旋回する
#define turn_left OnFwd(OUT_C);OnRev(OUT_A);Wait(turn_time);Off(OUT_A+OUT_C);  //左に90度旋回する
#define go_straight OnFwd(OUT_A+OUT_C);  //直進する
#define back OnRev(OUT_A+OUT_C);Wait(100);Off(OUT_A+OUT_C);  //後退する
#define SIGNAL 11
#define light 50  //白線と黒線を識別するための値


 task main()
 	{
 	SetSensor(SENSOR_1,SENSOR_LIGHT);  //センサー1を光センサー
 	SetSensor(SENSOR_2,SENSOR_TOUCH);  //センサー2をタッチセンサー
 	SetSensor(SENSOR_3,SENSOR_LIGHT);  //センサ−3を光センサー
 	
 	int n ;  //初めのifとwhileがかぶらないようにするために設けた
 	int m ;  //交差点を数える(2つの光センサーが両方暗いと認識した回数)
 	int l ;  //アームの動作を数える(奇数で開き、0を含む偶数で閉じる)
 	n=0;
 	m=0;
 	l=0;
 	
 	ClearMessage();
 	 
 	if(Message()==SIGNAL)  //SIGNALを受信したら
 		{
 			back;  /後退
 			turn_right;  //右へ旋回
 			n=n+1;
 		}
 		
 	 while((n>0)&&(m<26))  //上のプログラムをしたあと且つ、パックを全て運び終わってないとき
 		{		
 			if(SENSOR_2==1 && ((l==0)||(l==2)||(l==4)||(l==6)||(l==8)||(l==10)))  //タッチセンサーが反応且つ、アームが開いているとき
 				{   
 					Off(OUT_A+OUT_C);  //停止
 					OnFwd(OUT_B);  
 					Wait(100);  //アームを閉じる
 					back;  //後退
 					turn_right;
 					turn_right;  //180度右旋回
 					l=l+1;
 				 }
 			if(SENSOR_2==1 && ((l==1)||(l==3)||(l==5)||(l==7)||(l==9)||(l==11)))  //タッチセンサーが反応且つ、アームが閉じているとき	 	
 				 {	
 				 	Off(OUT_A+OUT_C);  //停止
 				 	OnRev(OUT_B);  
 				 	Wait(100);  //アームを開く
 				 	Off(OUT_B);
 				 	back;  //後退
 				 	turn_right;
 				 	turn_right;  //180度右旋回
 				 	l=l+1;
 				  }
 				  		
 		 	if(SENSOR_1>light && SENSOR_3>light)  //黒線上にあるとき
 		 		{
 		 			go_straight;  //直進
 		 		}
 		 	if(SENSOR_1<light && SENSOR_3>light)  //黒線より右へズレているとき
 		 		{
 		 			turn_left;  //左へ旋回
 		 		}
 		 	if(SENSOR_1>light && SENSOR_3<light)  //黒線より左へズレているとき
 		 		{
 		 			turn_right;  //右へ旋回
 		 		}
 		 	if(SENSOR_1<light && SENSOR_3<light)  //交差点に来たとき(両方のセンサーが暗いと認識したとき
 		 		{
 		 			if((m==0))  //交差点1つめ
 		 				{
 		 					Wait(100);  //少し待つ
 		 					turn_left;  //左へ旋回
 		 					m=m+1;
 		 				 }	 		 			
 		 		
 		 			if((m==1)||(m==11)||(m==13)||(m==14)||(m==24))  //交差点2、12、13、15、25つめ
 		 				{
 		 					Wait(100);  //少し待つ
 		 					OnFwd(OUT_A+OUT_C);
 		 					Wait(50);  //少し前進
 		 					Off(OUT_A+OUT_C);  //停止
 		 					m=m+1;
 		 				}
 		 			if((m==2)||(m==5)||(m==8)||(m==10)||(m==20)||(m==25))  //3、6、9、11、21、26つめ
 		 				 { 		 				
 		 					Wait(100);  //少し待つ
 		 					turn_right;  //右へ旋回
 		 					OnFwd(OUT_A+OUT_C);
 		 					Wait(50);  //少し前進
 		 					Off(OUT_A+OUT_C);  //停止
 		 					m=m+1;
 		 				}
 		 			if((m==3)||(m==17)||(m==19)||(m==22))  //交差点4、18、20、23つめ
 		 				{
 		 					Wait(100);  //少し待つ
 		 					OnFwd(OUT_A);
 		 					Wait(50);  //少し右旋回
 		 					m=m+1;
 		 				}
 		 			if((m==4)||(m==6)||(m==9)||(m==16))  //交差点5、7、10、17つめ
 		 				{
 		 					Wait(100);  //少し待つ
 		 					OnFwd(OUT_C);
 		 					Wait(50);  //少し左旋回
 		 					m=m+1;
 		 				}
 		 			if((m==7)||(m==12)||(m==15)||(m==18)||(m==21)||(m==23))  //交差点8、13、16、19つめ
 		 				{
 		 					Wait(100);  //少し待つ
 		 					turn_left;  //左へ旋回
 		 					OnFwd(OUT_A+OUT_C);
 		 					Wait(50);  //少し前進
 		 					Off(OUT_A+OUT_C);  //停止
 		 					m=m+1;		
 		 				}
 		 		}
 		 	}
 		 	Off(OUT_A+OUT_C);  //停止
 		 }

工夫や頑張った点

ロボットの構造をどのようにするかで、まず悩みました。結果的に上の写真のようにまとまりましたが、特に、上記のように牛乳パックをつかむところは力を入れたところです。また、RCX同士の通信が今回は必要なため、のせた時のRCXの位置なども工夫が必要なてんでした。

感想

今回はロボットの構造から自分たちで考えなければならず(RCXを二つ使って一台のロボットを作るか、一台ずつRCXを使って計二台のロボットを作成するか)この過程で時間がたくさんかかってしまいました。そのためプログラムに取りかかるのが遅くなってしまい、ロボコン当日の午前中までかかってしまいました。 

レゴブロックの性質をうまくつかめず、補強しようと思ってつけたパーツが本体の重量をあげてしまって、逆に壊れやすいロボットになってしまってとても残念だった。

うまくいかなくても、決めた方向性を崩して一からまた作りなおそうという勇気が湧かずに本番に至り、失敗してしまった。うまくいかなかったら根本的につくりを変えられるような柔軟な対応や発想が必要だったと思いました。

ロボコン結果

僕たちの班は八番目という、そろそろ成功するところが出てきてほしい番目でした。しかし、プログラムでは直進するはずだったのに突然何を思ったのか左回転、右回転を繰り返すという謎の行動をしてしまい一回目のチャレンジ失敗...二回目のチャレンジのため調整をしようとしたところ、ロボット△大破。やむなくリタイアを宣言せざるを得ませんでした。今までの苦労が〜〜〜〜。敗因としては、ロボコン後に先生が言っていたように、固定するためにパーツをたくさん使っていたのが、固定する役割を果たしていなかったという点です。

コメント欄

ご自由にどうぞ^^



添付ファイル: file090805_1110~0001.jpg 248件 [詳細] file090804_2104~0005.jpg 245件 [詳細] file090804_2104~0004.jpg 235件 [詳細] file090804_2104~0003.jpg 234件 [詳細] file090804_2104~0002.jpg 249件 [詳細] file090804_2104~0001.jpg 230件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-08-08 (土) 23:29:01 (3669d)