[[2015b/Member]] 目次 #contents *課題内容 [#g9939cd0] *ロボットの説明 [#wd0d1857] **ロボットA [#k3ee3c7c] ロボットAは、ボールを掴んで缶に当てる動作を行います。このロボットには、モーターを3つと、光センサを2つ、角度センサを1つ使用しています。モーターのうち2つは車輪に使い、残りの1つは、ボールを掴む・弾く動作のために使っています。光センサは、ライントレース用と、缶の位置を探す用に分けて使っています。角度センサは、主に距離を測るために使っています。 ** [#v79a51aa] **ロボットB [#afae0e3e] *プログラム [#we877882] **ロボットA用 [#daa1aaa3] //black = 43 < 48 < white = 52 //SENSOR_2 トレース //SENSOR_3 物体探索 //TIMER(0) トレース //TIMER(1) 光探索 /*共通機構*/ #define power(s) SetPower(OUT_A+OUT_C,s); /*ライントレース用*/ #define shiki 48 #define tomaru(t) Off(OUT_AC);Wait(t); #define FWD OnFwd(OUT_AC); #define BACK OnRev(OUT_AC); #define LEFT_t OnRev(OUT_A); OnFwd(OUT_C); #define LEFT Off(OUT_A); OnFwd(OUT_C); #define RIGHT_t OnRev(OUT_C); OnFwd(OUT_A); #define RIGHT Off(OUT_C); OnFwd(OUT_A); #define TMAX 20 /*ロボコン独自機構*/ #define open(t) OnFwd(OUT_B);Wait(t);//玉を扱う機構 #define close(t) OnRev(OUT_B);Wait(t);Off(OUT_B); #define stop_B Off(OUT_B); #define SUN 50//ランタンの輝度を表す数値 #define shoot power(2);open(15);Wait(10);close(15); /*赤球迄のトレース*/ sub trace_0() { power(2); ClearSensor(SENSOR_1); while(1){ if (SENSOR_2 < shiki -7){ LEFT_t; } else if (SENSOR_2 < shiki -4){ LEFT; } else if (SENSOR_2 < shiki){ FWD; } else if(SENSOR_2 < shiki +4){ RIGHT; } else { RIGHT_t; } if(SENSOR_1 > 335){ power(3); close(50); ClearSensor(SENSOR_1); break; } } } /*赤球を放つ手前*/ sub trace_1() { ClearSensor(SENSOR_1); close(10); Off(OUT_B); power(2); while(1){ if (SENSOR_2 < shiki -7){ LEFT_t; } else if (SENSOR_2 < shiki -4){ LEFT; } else if (SENSOR_2 < shiki){ FWD; } else if(SENSOR_2 < shiki +4){ RIGHT; } else { RIGHT_t; } if(SENSOR_1 > 62){ tomaru(10); break; } } } sub trace_2() { power(1); ClearSensor(SENSOR_1); while(1){ if (SENSOR_2 < shiki -7){ RIGHT_t; } else if (SENSOR_2 < shiki -4){ RIGHT; } else if (SENSOR_2 < shiki){ FWD; } else if(SENSOR_2 < shiki +4){ LEFT; } else { LEFT_t; } if(SENSOR_1 > 44){ power(3); close(50); ClearSensor(SENSOR_1); break; } } } sub trace_3() { power(2); ClearSensor(SENSOR_1); while(1){ close(1); Off(OUT_B); if (SENSOR_2 < shiki -7){ RIGHT_t; } else if (SENSOR_2 < shiki -4){ RIGHT; } else if (SENSOR_2 < shiki){ FWD; } else if(SENSOR_2 < shiki +4){ LEFT; } else { LEFT_t; } if(SENSOR_1 > 110){ power(3); close(50); ClearSensor(SENSOR_1); break; } } } /*光源を探す*/ sub LIGHT() { PlaySound(SOUND_UP); int sun_MAX = 0; int sensor_MAX = 0; close(20); ClearSensor(SENSOR_1); power(1); while(SENSOR_1 < 85){ RIGHT_t; if(SENSOR_3 > sun_MAX){ sun_MAX = SENSOR_3; sensor_MAX = SENSOR_1; } } tomaru(10); LEFT_t; until(SENSOR_1 < sensor_MAX); tomaru(10); } task main() { /*回転センサ*/ SetSensor(SENSOR_1,SENSOR_ROTATION); /*トレース用センサ*/ SetSensor(SENSOR_2,SENSOR_LIGHT); /*探索用センサ*/ SetSensor(SENSOR_3,SENSOR_LIGHT); FWD;Wait(150); trace_0();//向かう tomaru(50); trace_1();//赤玉持ち LIGHT(); shoot; tomaru(20); ClearSensor(SENSOR_1); RIGHT_t; until(SENSOR_1 > 28); tomaru(10); ClearSensor(SENSOR_1); FWD; until(SENSOR_1 > 26); Off(OUT_B); FWD; until(SENSOR_2 < 48); open(7); Off(OUT_B); trace_2(); tomaru(10); FWD;Wait(100); trace_3(); tomaru(10); LIGHT(); shoot; trace_1(); } **ロボットB用 [#rdc01f14] /* 37 black 53 white */ int startime=300; #define CHECKCROSSTIME 25 #define fwd(OUT) Off(OUT);OnFwd(OUT) #define rev(OUT) Off(OUT);OnRev(OUT) #define TURNLEFT fwd(OUT_AC) #define LEFT Off(OUT_C);fwd(OUT_A) #define TURNRIGHT rev(OUT_AC) #define RIGHT Off(OUT_A);rev(OUT_C) #define STRAIGHT rev(OUT_C);fwd(OUT_A) #define BACK fwd(OUT_C);rev(OUT_A) #define ISNOTCROSS FastTimer(0) <= CHECKCROSSTIME || FastTimer(1) <= startime #define RELEASE rev(OUT_B); #define LOADING fwd(OUT_B); sub trace(){ ClearTimer(0); while(ISNOTCROSS){ if(FastTimer(1) < startime){ ClearTimer(0); } if(52 <= SENSOR_1){ TURNRIGHT; }else if(50 <= SENSOR_1){ RIGHT; }else if(41 <= SENSOR_1){ STRAIGHT; }else if(39 <= SENSOR_1){ LEFT; }else { TURNLEFT; } if(39 <= SENSOR_1) ClearTimer(0); } Off(OUT_AC); ClearTimer(0); Wait(100); } /* 直進する */ sub go_straight(){ STRAIGHT; Wait(30); ClearTimer(1); } /* 左折する */ sub turn_left(){ ClearTimer(1); ClearTimer(0); } /* 右折する */ sub turn_right(){ ClearTimer(1); while(ISNOTCROSS){ if(FastTimer(1) >= startime){ ClearTimer(0); ClearTimer(1); break; } if(53 <= SENSOR_1){ TURNLEFT; }else if(50 <= SENSOR_1){ LEFT; }else if(47 <= SENSOR_1){ STRAIGHT; }else if(44 <= SENSOR_1){ RIGHT; }else { TURNRIGHT; } } TURNLEFT; Wait(10); Off(OUT_AC); ClearTimer(0); ClearTimer(1); } task main(){ SetSensor(SENSOR_1,SENSOR_LIGHT); ClearTimer(0); LOADING; go_straight(); trace(); go_straight(); Off(OUT_AC); Wait(2300); ClearTimer(1); startime=900; trace(); startime=300; //turn_left();// //trace(); go_straight(); trace(); go_straight(); //turn_left(); trace(); go_straight(); startime=1400; trace(); startime=300; TURNRIGHT; Wait(10); Off(OUT_AC); RELEASE; Wait(300); BACK; Wait(100); TURNRIGHT; Wait(40); LOADING; ClearTimer(0); trace(); turn_left(); startime=900; trace(); startime=300; //turn_left();// //trace(); go_straight(); trace(); go_straight(); trace(); go_straight(); startime=1400; trace(); startime=300; TURNRIGHT; Wait(10); Off(OUT_AC); RELEASE; Wait(300); go_straight(); Wait(10); Off(OUT_ABC); }