[[2008b]] [[2008b]] *''&size(25){ ロボコン};'' [#f62277c5] **内容 [#db257a7c] グループで一台、もしくは二台のロボットを作成しロボコンをする。 *目次 [#hfa06daa] #contents * ルール [#fd3d5256] コース上に積まれた四個の缶をゴールへと運ぶ。 **基本ルール [#g11c586a] --4段に積まれた空き缶を運びだし、ゴールに入れる。 --競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。 --2隅のコーナー(30cm四方)からスタートする。 --スタート時のロボットは2個を越えないこと (スタート後はいくつに分裂してもかまわない)。 --開始の合図から5秒以内にRCXのスタートボタンを押す作業を完了すること。 --競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。 --途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。 :基本得点の計算方法| --緑の空き缶を1個ゴールに運べば4点。 --黒い空き缶(最上の空き缶)を運べば8点 --空き缶を場外に出してしまった場合は一個につきマイナス1点。 --半分以上ゴールに入った空き缶だけを得点の対象とする。ただし空き缶がゴールからはみ出している場合は、マイナス1点 :技術点の計算方法| 以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(9チーム+TAor教員)が20点満点で採点し、その平均点を求める。 得点の目安: --空き缶までたどり着く動作 (3点) --空き缶を運ぶ動作 (転がす・掴むなど) (4点) --空き缶をゴールに入れる動作 (2点) --2台以上のロボット、あるいは単体のロボットの場合は2台のRCXの連携の良さ(3点) --自立型のロボットとしての形や動作の美しさ、斬新さ(3点) --その他 (5点) **コース [#r321eaba] &ref(2008b/A8/ロボコン/-1.png,80%,コース); &ref(2008b/A8/ロボコン/IMGP0169.JPG,25%,コース); 缶にたどり着く直前に障害物が設置してありなかなか難解なコースとなっている。 ゴールの周りも細めの木材で囲んであるため缶をゴールに入れるプログラムにも工夫が必要となる。 *ロボットの製作 [#zc8b7d98] 今回は2つのキットを利用してロボットを作るので、大きな一つのロボットを作るか、2つのロボットを作るかで作戦が大きく変わる。 **コンセプト [#ie9d562c] 今回はどのような作戦をとるかによってロボットの形も大きく変わってくる。 そこで作戦としては、一度に4つの缶をつかみ運ぶという作戦をとることにした。 一度に運ぶにはロボットにも重さが必要なので一つの大きなロボットを作ることにした。 ** アーム[#ufa71c0b] まず最初に考えたのはどのように缶を掴むかだ。今回は缶を一つ掴むだけの長さがあり、ゴムのグリップ力で滑らないという利点からキャタピラを使用した。 *プログラム [#hd1de8f5] #define THRESHOLD 50 #define THRESHOLD_2 45 #define THRESHOLD_3 40 #define SIGNAL 11 #define SIGNAL_2 12 #define SIGNAL_3 13 #define SIGNAL_4 14 #define SIGNAL_5 15 #define SIGNAL_6 16 #define SIGNAL_7 17 #define SIGNAL_8 18 #define SIGNAL_9 19 #define SIGNAL_A 21 #define SIGNAL_B 22 int move_count; sub turn(){ SetPower(OUT_A,6); SetPower(OUT_B,5); SetPower(OUT_C,7); ClearMessage(); until((Message() == SIGNAL_A) || (Message() == SIGNAL_B)); PlaySound(SOUND_CLICK); ClearMessage(); Off(OUT_A+OUT_B); Wait(50); OnRev(OUT_A+OUT_B); Wait(10); Off(OUT_A+OUT_B); OnFwd(OUT_A); OnRev(OUT_B); Wait(80); Off(OUT_A+OUT_B); Wait(50); ClearMessage(); } sub turn_r(){ until((Message() == SIGNAL_A) || (Message() == SIGNAL_B)); ClearMessage(); Off(OUT_A+OUT_B); Wait(50); OnRev(OUT_A+OUT_B); Wait(10); Off(OUT_A+OUT_B); OnFwd(OUT_B); OnRev(OUT_A); Wait(80); Off(OUT_A+OUT_B); Wait(50); ClearMessage(); } sub line(){ SetPower(OUT_A,6); SetPower(OUT_B,5); SetSensor(SENSOR_1,SENSOR_LIGHT); move_count = 0; ClearMessage(); ClearTimer(0); while(move_count < 1){ if(((Message() == SIGNAL_A) || (Message() == SIGNAL_B)) && (FastTimer(0) > 500)){ PlaySound(SOUND_CLICK); ClearMessage(); (move_count); move_count = move_count + 1; } if(SENSOR_1>THRESHOLD){ OnFwd(OUT_A); Off(OUT_B); if(FastTimer(0) > 400){ ClearMessage(); }} else{ Off(OUT_A); OnFwd(OUT_B); if(FastTimer(0) > 400){ ClearMessage(); } } } } task main(){ SetPower(OUT_A,6); SetPower(OUT_B,5); SetSensor(SENSOR_1,SENSOR_LIGHT); ClearMessage(); OnFwd(OUT_A+OUT_B); until(SENSOR_1<THRESHOLD); Off(OUT_A+OUT_B); Wait(50); OnFwd(OUT_A+OUT_B); until((Message() == SIGNAL_A) || (Message() == SIGNAL_B)); PlaySound(SOUND_CLICK); ClearMessage(); OnRev(OUT_A+OUT_B); Wait(20); OnFwd(OUT_B); OnRev(OUT_A); Wait(57); OnFwd(OUT_A+OUT_B); Wait(250); OnFwd(OUT_A); OnRev(OUT_B); Wait(40); OnFwd(OUT_A+OUT_B); until(SENSOR_1<THRESHOLD); line(); Off(OUT_A+OUT_B); Wait(50); OnRev(OUT_A+OUT_B); Wait(10); Off(OUT_A+OUT_B); OnFwd(OUT_A); OnRev(OUT_B); Wait(80); Off(OUT_A+OUT_B); Wait(50); OnFwd(OUT_A+OUT_B); ClearMessage(); until((Message() == SIGNAL_A) || (Message() == SIGNAL_B)); move_count = 0; ClearMessage(); while(move_count < 1){ if(Message() == SIGNAL_A){ ClearMessage(); (move_count); move_count = move_count + 1; } if(Message() == SIGNAL_B){ OnFwd(OUT_A); Off(OUT_B); Wait(10); ClearMessage(); } else{ Off(OUT_A); OnFwd(OUT_B); } } Off(OUT_A+OUT_B); PlaySound(SOUND_CLICK); OnRev(OUT_A); Wait(145); OnRev(OUT_A+OUT_B); Wait(30); Off(OUT_A+OUT_B); ClearMessage(); SendMessage(SIGNAL); until(Message() == SIGNAL_2); PlaySound(SOUND_CLICK); Off(OUT_A+OUT_B); move_count = 0; while(move_count < 2){ if((SENSOR_2 < THRESHOLD_2) && (SENSOR_3 > THRESHOLD_3)){ OnRev(OUT_A); Off(OUT_B); } if((SENSOR_2 > THRESHOLD_2) && (SENSOR_3 < THRESHOLD_3)){ OnRev(OUT_B); Off(OUT_A); } if((SENSOR_2 < THRESHOLD_2) && (SENSOR_3 < THRESHOLD_3)) { OnRev(OUT_A+OUT_B); Wait(20); (move_count); move_count = move_count + 1; } if((SENSOR_2 > THRESHOLD_2) && (SENSOR_3 > THRESHOLD_3)) { OnRev(OUT_A+OUT_B); } } OnRev(OUT_A+OUT_B); Wait(28); Float(OUT_A+OUT_B); SendMessage(SIGNAL_3); until(Message() == SIGNAL_4); PlaySound(SOUND_CLICK); OnFwd(OUT_A); OnRev(OUT_B); Wait(100); Off(OUT_A+OUT_B); OnFwd(OUT_A+OUT_B); ClearMessage(); until((Message() == SIGNAL_A) || (Message() == SIGNAL_B)); PlaySound(SOUND_CLICK); ClearMessage(); Off(OUT_A+OUT_B); Wait(50); OnRev(OUT_A+OUT_B); Wait(15); Off(OUT_A+OUT_B); OnFwd(OUT_A); OnRev(OUT_B); Wait(80); Off(OUT_A+OUT_B); Wait(50); ClearMessage(); PlaySound(SOUND_CLICK); OnFwd(OUT_A+OUT_B); turn_r(); OnFwd(OUT_B); OnRev(OUT_A); Wait(25); Off(OUT_A+OUT_B); OnFwd(OUT_A+OUT_B); Wait(35); line(); turn_r(); Off(OUT_A+OUT_B); OnRev(OUT_A+OUT_B); Wait(200); Off(OUT_A+OUT_B); SendMessage(SIGNAL_8); ClearMessage(); until(Message() == SIGNAL_9); SendMessage(SIGNAL_5); ClearMessage(); until(Message() == SIGNAL_6); OnFwd(OUT_A+OUT_B); Wait(200); Off(OUT_A+OUT_B); SendMessage(SIGNAL_7); Wait(200); OnRev(OUT_A+OUT_B); Wait(200); Off(OUT_A+OUT_B); OnFwd(OUT_A+OUT_B); Wait(150); Off(OUT_A+OUT_B); } もう一つのRCX #define SIGNAL 11 #define SIGNAL_2 12 #define SIGNAL_3 13 #define SIGNAL_4 14 #define SIGNAL_5 15 #define SIGNAL_6 16 #define SIGNAL_7 17 #define SIGNAL_8 18 #define SIGNAL_9 19 #define SIGNAL_A 21 #define SIGNAL_B 22 task main(){ SetSensor(SENSOR_1,SENSOR_ROTATION); SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_3,SENSOR_TOUCH); ClearMessage(); while(true){ if(Message() == SIGNAL){ PlaySound(SOUND_CLICK); OnFwd(OUT_A); until(SENSOR_1 == 90); Off(OUT_A); Wait(50); ClearMessage(); SendMessage(SIGNAL_2); } if(Message() == SIGNAL_3){ ClearSensor(SENSOR_1); OnRev(OUT_A); until(abs(SENSOR_1) == 68); ClearSensor(SENSOR_1); Off(OUT_A); Wait(30); OnFwd(OUT_B+OUT_C); Wait(30); Off(OUT_B+OUT_C); SendMessage(SIGNAL_4); ClearMessage(); } if(Message() == SIGNAL_5){ OnRev(OUT_C+OUT_B); Wait(30); Off(OUT_C+OUT_B); OnFwd(OUT_A); until(abs(SENSOR_1) == 65); Off(OUT_A); Wait(50); SendMessage(SIGNAL_6); ClearSensor(SENSOR_1); ClearMessage(); } if(Message() == SIGNAL_7){ ClearSensor(SENSOR_1); OnRev(OUT_A); until(abs(SENSOR_1) == 90); Off(OUT_A); Wait(50); ClearMessage(); } if(Message() == SIGNAL_8){ OnFwd(OUT_B+OUT_C); Wait(30); Off(OUT_B+OUT_C); SendMessage(SIGNAL_9); } if(SENSOR_2 == 1){ SendMessage(SIGNAL_A); } if(SENSOR_3 == 1){ SendMessage(SIGNAL_B); } } }