[[2009b]] //CENTER:只今作成中 目次 #contents *チーム [#l02624f3] チーム名「株式会社 とだ」 メンバー その壱 とだ その弐 なかみゅう その参 SHIMA *ロボコン競技内容 [#x6401341] **課題:玉入れロボット † [#s59b9347] ピンポン玉をできるだけたくさん所定の場所に運ぶ **フィールドの説明 [#l42d3efc] * フィールドは約160cm×110cm * 18個のピンポン玉はフィールドの中央にある、2x4の角材(長さ40cm)2本にはさまれた正方形の領域にあり、領域のこの角材が置かれていない辺には500mlの紙パックが並べられている * 紙パックはすべての面に白あるいは緑色の画用紙がはられている * 目的地の長方形は19mm×19mmの角材で仕切られていて * 黒い線の太さは約25mm **ルール † [#xb98a5cb] ***基本ルール [#c9877109] * 単独の競技(1回)および対戦の競技(リーグ戦、計2回の対戦)の合計点で争う。 * スタート時は「スタート地点」の内部以外に接していないこと。 * スタート時のロボットは2個を越えないこと(スタート後はいくつに分裂してもかまわない)。 * 開始の合図から5秒以内にRCXのスタートボタンを押す作業を完了すること。 * 競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。 * 途中でうまく動かなくなった場合、1回限り再スタートすることができる。 * 競技時間終了までにもとのスタート地点にもどらなければならない(リーグ戦では戻らなくてもよい)。 * 競技時間は3分とする。ただし審判が、競技続行不能と判断した場合は途中で終了する。 ***基本得点の計算方法 (単独競技) [#q6f70ec7] * ボール1個あたり2点で計算する。 * ボーナス点として5個入れるごとに5点追加 * 時間内(3分)にスタート地点にもどらないと-4点(ただしRCXを搭載するロボットの一部でも戻っていれば -2点) * 最高で51点 ***基本得点の計算方法 (リーグ戦) [#la84423e] * ゴールに入れたボールの数で競い、勝ったチームは10点、引き分けの時は5点、負けたチームは0点とする。 * さらにゴールに入れたボール1個あたり1点を加点する * 競技終了後、ゴールの内部にロボットが触れていれば-1点 * 最高で20点 ***技術点の計算方法 [#oe26404f] 以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について全てのチーム(3チーム)+TAが20点満点で採点し平均点を求める。 得点の目安: * 紙パックの処理 (3点) * ボールの収集 (3点) * ボールの運搬 (3点) * ボールのシュート (3点) * 2台のRCXの連携 (3点) * その他 (5点) *ロボットの作成 [#xac09bd4] **方針 [#j6aa403e] 効率よくパックをどかし、ピンポン球を運搬できるロボットを製作する。 **製作に移る前に [#r72a29d2] 初め、一つの大きなロボットを製作するつもりでした(図1参照)が、ピンポン球を収集することが困難であったため、パックをどかすロボットとピンポン球を収集するロボットの2台を製作することとなった。 **ピンポン球収集ロボット [#u6632eb3] ***構造と仕組み [#i95dc0b5] 収集ロボットの *** [#n6f9e40c] **改良前の作品 [#u8e14c08] **完成 [#n216b881] **工夫した点・苦労した点など [#u29ed85b] **問題点 [#mb65bd46] *プログラム [#y4a54e69] #define THRESHOLD 40 //明るさの識別値 #define go_forward OnFwd(OUT_A+OUT_C); //前進のプログラム #define go_back OnRev(OUT_A+OUT_C); //後進プログラム #define turn_right OnFwd(OUT_A);OnRev(OUT_C); //右旋回プログラム #define turn_left OnRev(OUT_A);OnFwd(OUT_C); //左旋回のプログラム #define rs1_1 15 //part1_1を前進するための回転数 #define rs1_2 -90 //part1_2を後進するための回転数 #define rs2_1 15 //part2_1を前進するための回転数 #define rs2_2 17 //part2_2を前進するための回転数 #define rs4 8 //part4とpart5を前進するための回転数 #define rs6 -12 //part6を後進するための回転数 #define rs7 20 //part7を前進するための回転数 #define rs10 50 //part10を後進するための回転数 #define rs8 20 //part8を前進するための回転数 #define rr 5 //90°右旋回するための回転数 #define rl -5 //90°左旋回するための回転数 #define rr2 3 //右へ少し旋回するための回転数 #define rl2 -9 //左へ少し旋回するための回転数 #define rr4 2 //part4で右へ少し旋回するための回転数 #define rr8 8 //part8で右へ少し旋回するための回転数 #define arm1 OnFwd(OUT_B); //アーム(ピンポン玉回収) #define arm2 OnRev(OUT_B);Wait(1000);Float(OUT_B); //アーム(ピンポン玉排出) task main () { SetPriority(1); SetSensor(SENSOR_1,SENSOR_LIGHT); //SENSOR1は光センサー SetSensor(SENSOR_2, SENSOR_ROTATION); //SENSOR2は回転センサー SetSensor(SENSOR_3,SENSOR_LIGHT); //SENSOR3は光センサー int n; n=0; go_forward;Wait(150);Off(OUT_A+OUT_C); //part1始まり start follow_line_forward;until(SENSOR_2>=rs1); //センサー2がrs1以上になるまで前進 stop follow_line_back;Off(OUT_A+OUT_C); //part1終わり while(n<=5) //nが5回以下なら以下のプログラムを行う { ClearSensor(SENSOR_2); //part2始まり turn_right;until(SENSOR_2>=rr);Off(OUT_A+OUT_C); //右へセンサー2がrr以上になるまで旋回 go_forward;Wait(50);Off(OUT_A+OUT_C); //少し前進 ClearSensor(SENSOR_2); turn_right;until(SENSOR_2>=rr);Off(OUT_A+OUT_C); //右へセンサー2がrr以上になるまで旋回 arm1; //アームを起動 ClearSensor(SENSOR_2); go_forward;until(SENSOR_2>=rs2_1);Off(OUT_A+OUT_C); //センサー2がrs2_1以上になるまで前進 ClearSensor(SENSOR_2); go_forward;until(SENSOR_2>=rs2_2);Off(OUT_A+OUT_C); //センサー2がrs2_2以上になるまで前進 Wait(200); //2秒間待機 //part2終わり ClearSensor(SENSOR_2); //part3開始 go_back;until(SENSOR_2<=-rs2_2);Off(OUT_A+OUT_C); //センサー2が-rs2_2以下になるまで後進 //part3終わり ClearSensor(SENSOR_2); //part4開始 turn_right;until(SENSOR_2>=rr4);Off(OUT_A+OUT_C); //センサー2がrr4以上になるまで右旋回 ClearSensor(SENSOR_2); go_forward;until(SENSOR_2>=rs4);Off(OUT_A+OUT_C); //センサー2がrs4以上になるまで前進 Wait(200); //2秒間待機 ClearSensor(SENSOR_2); go_back;until(SENSOR_2<=-rs4);Off(OUT_A+OUT_C); //センサー2が-rs4以下になるまで後進 //part4終わり ClearSensor(SENSOR_2); //part5開始 turn_left;until(SENSOR_2<=rl2);Off(OUT_A+OUT_C); //センサー2がrl2以下になるまで左旋回 ClearSensor(SENSOR_2); go_forward;until(SENSOR_2>=rs4);Off(OUT_A+OUT_C); //センサー2がrs4以上になるまで前進 Wait(300); //3秒間待機 ClearSensor(SENSOR_2); go_back;until(SENSOR_2<=-rs4);Off(OUT_A+OUT_C); //センサー2が-rs4以下になるまで後進 //part5終わり //part6開始 go_back;until(SENSOR_2<=rs6);Off(OUT_A+OUT_C); //センサー2が-rs2_1以下になるまで後進 Float(OUT_B); //アーム停止 //part6終了 ClearSensor(SENSOR_2); //part7開始 turn_left;until(SENSOR_2<=rl);Off(OUT_A+OUT_C); //センサー2がrl以下になるまで左旋回 go_back;Wait(50);Off(OUT_A+OUT_C); //少し後退 ClearSensor(SENSOR_2); turn_left;until(SENSOR_2<=rl);Off(OUT_A+OUT_C); //センサー2がrl以下になるまで左旋回 start follow_line_forward;until(SENSOR_2>=rs7);Off(OUT_A+OUT_C); //センサー2がrs10以上になるまで前進 //part7終了 ClearSensor(SENSOR_2); //part8開始 turn_right;until(SENSOR_2>=rr8);Off(OUT_A+OUT_C); //センサー2がrr以上になるまで右旋回 ClearSensor(SENSOR_2); go_forward;Wait(300);Off(OUT_A+OUT_C); //センサー2がrs8以上になるまで前進 PlaySound(2);Wait(100);arm2; //ピンポン玉排出 //part8終了 ClearSensor(SENSOR_2); //part10開始 go_back;until(SENSOR_2<=-rs8);Off(OUT_A+OUT_C); //センサー2が-rs8以下になるまで前進 ClearSensor(SENSOR_2); turn_left;until(SENSOR_2<=rl);Off(OUT_A+OUT_C); //センサー2がrl以下になるまで左旋回 go_back;Wait(50);Off(OUT_A+OUT_C); //少し後進 start follow_line_back;until(SENSOR_2>=rs10);Off(OUT_A+OUT_C); //センサー2がrs10以上になるまで後進 n=n+1; //part10終了 } if(n>5) //5回目終了後以下のプログラムを行う { //part11開始 start follow_line_forward;until(SENSOR_2>=-rs1_2); stop follow_line_back;Off(OUT_A+OUT_C); //センサー2が-rs1_2以上になるまで前進 go_forward;Wait(50);Off(OUT_A+OUT_C); //少し前進 start follow_line_forward;until(SENSOR_2<=rs1_1); stop follow_line_back;Off(OUT_A+OUT_C); //センサー2が-rs1_1以上になるまで前進 } //part11終わり } task follow_line_forward() //ラインに沿って前進するプログラム { while(true) { if(SENSOR_1>THRESHOLD) //左側のセンサーが白で { if(SENSOR_3>THRESHOLD) //かつ右側のセンサーが白なら {Off(OUT_A+OUT_C);go_forward;}//直進する else if(SENSOR_3<THRESHOLD) //かつ右側のセンサーが黒なら {Off(OUT_A+OUT_C);turn_right;}//右折する } else if(SENSOR_1<THRESHOLD) //左側のセンサーが黒で { if(SENSOR_3>THRESHOLD) //かつ右側のセンサーが白なら {Off(OUT_A+OUT_C);turn_left;} //左折する else if(SENSOR_3<THRESHOLD) //かつ右側のセンサーが黒なら {Off(OUT_A+OUT_C);go_forward;}//直進する。 } } } task follow_line_back() //ラインに沿って後進するプログラム { while(true) { if(SENSOR_1>THRESHOLD) //左側のセンサーが白で { if(SENSOR_3>THRESHOLD) //かつ右側のセンサーが白なら {Off(OUT_A+OUT_C);go_back;} //後進 else if(SENSOR_3<THRESHOLD) //かつ右側のセンサーが黒なら {Off(OUT_A+OUT_C);turn_left;} //左旋回 } else if(SENSOR_1<THRESHOLD) //左側のセンサーが黒で { if(SENSOR_3>THRESHOLD) //かつ右側のセンサーが白なら {Off(OUT_A+OUT_C);turn_right;}//右旋回 else if(SENSOR_3<THRESHOLD) //かつ右側のセンサーが黒なら {Off(OUT_A+OUT_C);go_back;} //後進 } } } *感想 [#jad47c94] *コメント [#me0d2489] #comment