[[2016a/Member]] &size(30){目次}; #contents *はじめに [#o4c57092] 今回の課題3の活動は、2チームが一体となり5〜6人で行った。~ チームメンバーは、~ 「zawati」、「ngtrz」、「Ari」、「Etu」、「Tea」の5人です。 **課題3 [#o12a0911] [[2016a/Mission2]]で使ったコースでタイムレースを行う。 **ルール [#ua4efa47] [[2016a/Mission3]]を参考。(EV3のルールは除く) ***基本ルール [#oc72065c] ・紙コップをC地点、D地点にそれぞれ3個(合計6個)置き、C地点に置いた紙コップにはCを、D地点に置いた紙コップにはDを紙コップの底面にマークする。 ・紙コップは上下どちらにおいてもかまわない。 ・2台のロボットの場合はA地点とB地点からスタート、一体型の場合はA地点とB地点のいずれかからスタートする。 ・最終的に黒線で囲まれた輪の中にC地点からの紙コップとD地点からの紙コップを交互に重ねる。 (下側から数えて奇数番目はC地点からのコップ、偶数番目はD地点からのコップになるようにする。) ・紙コップを重ねる場所は、必ずしも目的地点の輪の中でなくてもかまわない。 ・最終的に紙コップが自力で立っていること、またロボットが紙コップに触れていないこと、ただしスタート時と上下逆になっていてもかまわない。 ・競技時間はすべてのコップを重ね終わるまで、あるいは審判が続行不能と判断するまで。 ・審判の合図の後、5秒以内にロボットをスタートさせ、それ以降はロボットや紙コップに触ってはいけない。 ・紙コップに色を塗ったり文字や絵をかいてもよいが、穴を開けたり故意に変形させてはいけない。 ・光センサは2セット合わせて2つまで使って良い、その他のセンサや部品はキットに含まれているものだけを使用すること。 ***基本得点の計算方法 [#ad9f4715] ・1段目の紙コップ3点、2段目の紙コップ6点、・・、n段目のコップ3n点、6段目のコップ18点 ・奇数段目にあるDのコップと偶数段目にあるCのコップは0点 ***技術点の計算方法 [#ybb6aeed] 以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチームが20点満点で採点し、その平均点を求める。 得点の目安:~ ・スタートしてから紙コップの地点まで移動する速さ、正確さ (2点) ・紙コップをつかむ動作 (3点) ・紙コップをゴールまで運ぶ動作の速さ、正確さ (2点) ・紙コップを重ねる動作 (3点) ・2台のロボットの連携の良さ (3点) ・自立型のロボットとしての形や動作の美しさ、斬新さ (3点) ・ロボコン出場ロボットとしての完成度 (2点) ・その他 (2点) *計画 [#h260bff6] *プログラム [#r28fcc61] **定義 [#aebb60eb] ***ライントレースの定義 [#tf7dd34d] #define THRES1 39 //閾値1(黒、黒線中央) #define THRES2 43 //閾値2(黒に近い黒、黒線中央から少し外側) #define THRES3 53 //閾値3(薄黒、黒線中央と境界の中間) #define THRES4 59 //閾値4(白に近い黒、黒線境界から少し内側) #define SPEED_H 40 //速いスピード(右車輪用) #define SPEED_L 17 //遅いスピード(右車輪用) #define TIME_CROSS 230 //交差点を渡る時の時間 #define STEP 1 //1回の判定で進む時間 #define nMAX 220 //交差点での黒の判定基準 #define move_RL(speedR,speedL) OnFwd(OUT_A,speedR);OnFwd(OUT_B,speedL); //基本動作 #define short_break Off(OUT_BC);Wait(500); //小休憩 ***紙コップを掴むための定義 [#ee0dc4c0] #define SPEED_GET 30 //紙コップに前進するスピード #define ARM_TIME 50 //紙コップをつかむモータを動かす時間 #define go_forward OnFwd(OUT_AB,SPEED_GET); //紙コップに前進する動作 #define arm(time_a) OnFwd(OUT_AB,SPEED_GET);Wait(time_a);Off(OUT_AB);OnRev(OUT_C,ARM_TIME);Wait(200);Off(OUT_C); //紙コップをつかむ動作 ***マスター(相手)と交信するための定義 [#a19d3d31] #define CONN 0 //マスター(相手)との接続番号 #define Boot 11 //マスター(相手)に送信する番号 **サブルーチン [#ne4b6af8] ***基本動作のサブルーチン [#pa94a727] sub turn_right_A(int time_b) //右折 { move_RL(0, 30); Wait(time_b); } sub turn_right_B(int time_c) //右旋回 { move_RL(-SPEED_L,25); Wait(time_c); } sub back(int time_d) //後退 { move_RL(-30,-30); Wait(time_d); } ***移動のサブルーチン [#a8c3cdf4] sub AC() //AからCまで進む { SetSensorLight(S1); int n_black=0; //黒をカウント int m_kousa=0; //交差点をカウント while(m_kousa < 3) { //交差点が3回目までの間 while (n_black < nMAX) { //n_black(黒)がnMAX未満の間、ライントレースをする if (SENSOR_1 < THRES1) { //もし黒のとき左旋回、黒の回数をカウント move_RL(SPEED_L,-25); n_black++; } else { //そうでないとき if (SENSOR_1 < THRES2) { //もし黒に近い黒⇔黒の間は左折 move_RL(SPEED_L,0); } else if (SENSOR_1 < THRES3) { //薄黒⇔黒に近い黒の間は直進 move_RL(SPEED_H,50); } else if (SENSOR_1 < THRES4) { //白に近い黒⇔薄黒の間は右折 move_RL(0, 30); } else { //白のとき右旋回 move_RL(-SPEED_L,25); } n_black=0; //n_black(黒)をリセットして } Wait(STEP); //上記の動作を、STEP(1回)ずつ行う。 } if (m_kousa < 1) { //もし交差点が1回目なら左折 short_break; PlaySound(SOUND_DOUBLE_BEEP); move_RL(SPEED_L,-25); Wait(1100); m_kousa++; //交差点をカウント n_black=0; //n_blackを0に戻すことでライントレースに戻る。 } else if (m_kousa < 2) { //もし交差点が2回目なら右折 short_break; PlaySound(SOUND_DOWN); move_RL(0, 27); Wait(2800); m_kousa++; n_black=0; } else { //もし交差点が3回目(C手前)なら方向修正 short_break; move_RL(-SPEED_L,30); Wait(600); Off(OUT_AB); m_kousa++; PlaySound(SOUND_FAST_UP); } } } sub CP() //CからPまで進む { SetSensorLight(S1); int n_black=0; int m_kousa=0; while(m_kousa < 2) { //交差点が2回目までの間 while (n_black < nMAX) { if (SENSOR_1 < THRES1) { move_RL(SPEED_L,-25); n_black++; } else { if (SENSOR_1 < THRES2) { move_RL(SPEED_L,0); } else if (SENSOR_1 < THRES3) { move_RL(SPEED_H,50); } else if (SENSOR_1 < THRES4) { move_RL(0, 25); } else { move_RL(-SPEED_L,25); } n_black=0; } Wait(STEP); } if (m_kousa < 1) { //もし交差点が1回目なら左折 short_break; PlaySound(SOUND_DOUBLE_BEEP); move_RL(SPEED_L,-25); Wait(900); m_kousa++; n_black=0; } else { //もし交差点が2回めなら停止 short_break; PlaySound(SOUND_FAST_UP); Off(OUT_AB); m_kousa++; } } } sub PD() //PからDまで進む { SetSensorLight(S1); int n_black=0; int m_kousa=0; while(m_kousa < 2) { //交差点が2回目までの間 while (n_black < nMAX) { if (SENSOR_1 < THRES1) { move_RL(SPEED_L,-25); n_black++; } else { if (SENSOR_1 < THRES2) { move_RL(SPEED_L,0); } else if (SENSOR_1 < THRES3) { move_RL(SPEED_H,50); } else if (SENSOR_1 < THRES4) { move_RL(0, 25); } else { move_RL(-SPEED_L,25); } n_black=0; } Wait(STEP); } if (m_kousa < 1) { //もし交差点が1回目なら左折 short_break; PlaySound(SOUND_DOUBLE_BEEP); move_RL(SPEED_L,-25); Wait(900); m_kousa++; n_black=0; } else { //もし交差点が2回目(D手前)なら方向修正 short_break; move_RL(-SPEED_L,30); Wait(800); Off(OUT_AB); m_kousa++; PlaySound(SOUND_FAST_UP); } } } sub DP() //DからPまで進む { SetSensorLight(S1); int n_black=0; int m_kousa=0; while(m_kousa < 1) { //交差点が1回目までの間 while (n_black < nMAX) { if (SENSOR_1 < THRES1) { move_RL(SPEED_L,-25); n_black++; } else { if (SENSOR_1 < THRES2) { move_RL(SPEED_L,0); } else if (SENSOR_1 < THRES3) { move_RL(SPEED_H,50); } else if (SENSOR_1 < THRES4) { move_RL(0, 25); } else { move_RL(-SPEED_L,25); } n_black=0; } Wait(STEP); } if (m_kousa < 1) { //もし交差点が1回目(P手前)なら停止 short_break; PlaySound(SOUND_FAST_UP); Off(OUT_AB); m_kousa++; } else { short_break; PlaySound(SOUND_FAST_UP); Off(OUT_AB); m_kousa++; } } } sub PC() //PからCまで進む { SetSensorLight(S1); int n_black=0; int m_kousa=0; while(m_kousa < 2) { //交差点が2回目までの間 while (n_black < nMAX) { if (SENSOR_1 < THRES1) { move_RL(SPEED_L,-25); n_black++; } else { if (SENSOR_1 < THRES2) { move_RL(SPEED_L,0); } else if (SENSOR_1 < THRES3) { move_RL(SPEED_H,50); } else if (SENSOR_1 < THRES4) { move_RL(0, 25); } else { move_RL(-SPEED_L,25); } n_black=0; } Wait(STEP); } if (m_kousa < 1) { //もし交差点が1回目なら右折 short_break; PlaySound(SOUND_DOWN); move_RL(0, 27); Wait(2800); m_kousa++; n_black=0; } else { //もし交差点が2回目(C手前)なら方向修正 short_break; move_RL(-SPEED_L,30); Wait(600); Off(OUT_AB); m_kousa++; PlaySound(SOUND_FAST_UP); } } } ***アームを動かすサブルーチン [#ed109981] sub get() //各ポイント1個目の紙コップをつかむ { SetSensorLowspeed(S2); //端子2に超音波センサ go_forward; /* 25cm以内に障害物があるとコップを掴みに行く */ if (SensorUS(S2) <= 25) { arm(590); } Off(OUT_AB); } sub get_2() //各ポイント2個目の紙コップをつかむ { SetSensorLowspeed(S2); go_forward; if (SensorUS(S2) <= 25) { arm(1300); } Off(OUT_AB); } sub release() //紙コップを離す { OnFwd(OUT_C,ARM_TIME); Wait(200); Off(OUT_C); SendRemoteNumber(CONN,MAILBOX1,Boot); //マスター(相手に)11と送る } **メイン [#d0754d28] task main() { /* AからCまで行き紙コップを掴み方向転換する */ AC(); get(); back(1700); turn_right_B(2200); /* CからPまで行き紙コップを離し方向転換する */ CP(); release(); back(1700); turn_right_B(3800); /* PからDまで行き紙コップを掴み方向転換する */ PD(); get(); back(1700); turn_right_B(2200); turn_right_A(3000); /* DからPまで行き紙コップを離し方向転換する */ DP(); release(); back(1700); turn_right_B(3400); /* PからCまで行き紙コップを掴み方向展開する */ PC(); get_2(); back(2000); turn_right_B(2200); /* CからPまで行き紙コップを離し方向転換する */ CP(); release(); back(1700); turn_right_B(3800); }