目次 #contents *今回の課題 [#s9b3f120] *今回作成したロボット [#sd04361d] **概要 [#h78ca1b4] ↓実際のロボットの写真 ** ロボットの機構 [#q2a03362] ***アーム部 [#a945ee92] 紙コップを取得し運ぶための機構である。 ***光センサー [#d8813d23] 地面に垂直に取り付けた 紙コップが光センサーの邪魔をしないようにバリアがついている *プログラミング概要 [#zb3e4ac0] **定義 [#b55786bd] 最初に、今回のプログラミングで頻出されるプログラミングコードを定義した #define SPEED 100 #define SPEED_SLOW 60 #define turn_left1 OnFwd(OUT_A,80 * x); OnRev(OUT_C,35 * x); #define turn_left2 OnFwd(OUT_A,100 * x); OnFwd(OUT_C,40 * x); #define turn_left3 OnFwd(OUT_A,80 * x); OnRev(OUT_C,90 * x); #define turn_left5 OnFwd(OUT_A,80 * x); OnRev(OUT_C,1 * x); #define go_forward OnFwd(OUT_A,80 * x); OnFwd(OUT_C,87 * x); #define go_back OnRev(OUT_A,100 * x); OnRev(OUT_C,85 * x); #define turn_right1 OnRev(OUT_A,35 * x); OnFwd(OUT_C,80 * x); #define turn_right2 OnFwd(OUT_A,30 * x); OnFwd(OUT_C,100 * x); #define turn_right3 OnRev(OUT_A,80 * x); OnFwd(OUT_C,80 * x); #define AD SendRemoteNumber(1,MAILBOX1,01); //アームを閉じて締める #define AU SendRemoteNumber(1,MAILBOX1,02); //アームを上げる #define TD OnRev(OUT_B,45 * x); Wait(1000); #define TU OnFwd(OUT_B,45 * x); Wait(1000); #define CupOff SendRemoteNumber(1,MAILBOX1,03); //コップを離す #define turn_right4 OnRev(OUT_A,80 * x); OnFwd(OUT_C,60 * x); #define turn_right5 OnRev(OUT_A,80 * x); OnFwd(OUT_C,1 * x); #define turn_right6 OnRev(OUT_A,1 * x); OnFwd(OUT_C,80 * x); #define DO 523 #define x 0.65 //かけ数 #define z 1.0 **サブルーチン [#pf806a3e] また、今回サブルーチンとして「(左・右)に沿ってライントレースを行い、次の交差点に到着したら停止して音を鳴らす」という2つのものを作成した。 右に沿ってライントレースするサブルーチン sub IKK() { int BP = 0; while (BP < 125){ if (SENSOR_2 < 45) { turn_right1; BP++; }else{ if (SENSOR_2 < 49 ) { turn_right2; } else if (SENSOR_2 < 56 ) { go_forward; } else if (SENSOR_2 < 58) { turn_left2; } else { turn_left1; } BP = 0; } Wait(1); } Off(OUT_AC); PlayTone(DO,100); Wait(100); Wait(10); BP = 0; } 左に沿ってライントレースするサブルーチン sub DKK() { int BP = 0; while (BP < 200){ if (SENSOR_2 < 45) { turn_left1; BP++; }else{ if (SENSOR_2 < 49 ) { turn_left2; } else if (SENSOR_2 < 56 ) { go_forward; } else if (SENSOR_2 < 57) { turn_right3; } else { turn_right4; } BP = 0; } Wait(1); } Off(OUT_AC); PlayTone(DO,100); Wait(100); BP = 0; } 右側の光センサーを使い左に沿ってライントレースする sub DKK2() { int BP = 0; while (BP < 170){ if (SENSOR_3 < 45) { turn_left1; BP++; }else{ if (SENSOR_3 < 49 ) { turn_left2; } else if (SENSOR_3 < 54 ) { go_forward; } else if (SENSOR_3 < 55) { turn_right3; } else { turn_right4; } BP = 0; } Wait(1); } Off(OUT_AC); PlayTone(DO,100); Wait(100); BP = 0; } **task main [#oea2b8bb] ***スタート- [#zd1ef030] task main() { while (SENSOR_2 > 45) { go_forward; } go_forward; Wait(600); turn_right3; Wait(300); while (SENSOR_2 > 45) { turn_left3; } Aの枠線まで直進した後、一定量直進しさらに右を向いた後に線が見つかるまで左に回転する ***BーC [#z6137dd9] SetSensorLight(S2); IKK(); turn_left2; //B Wait(300 * z); IKK(); turn_right4; //C Wait(1900 * z); while (SENSOR_2 > 45) { turn_left3; } 右側に沿ってライントレースをする ***F-E [#w5030cbc] IKK(); go_forward; //F Wait(200 * z); while (SENSOR_2 > 45) { turn_left3; } IKK(); turn_right4; Wait(1700 * z); //急カーブ while (SENSOR_2 > 45) { turn_right4; } turn_right4; Wait(100); while (SENSOR_2 < 45) { turn_right4; } IKK(); Wait(1000); //E go_forward; Wait(300 * z); turn_right3; Wait(100 * z); while (SENSOR_2 > 45) { turn_right3; } turn_right3; Wait(100 * z); while (SENSOR_2 < 45) { turn_right3; } 右に沿って動くと、Fの後の2つ目のカーブを交差点として認識するので、それを利用した。 ***R-P [#e172cada] IKK(); turn_left3; //R Wait(300 * z); go_forward; Wait(210); while (SENSOR_2 > 45) { turn_left3; } turn_left3; Wait(80 * z); while (SENSOR_2 < 45) { turn_left3; } turn_left3; Wait(600 * z); go_forward; Wait(300 * z); DKK(); //P R部での交差点認識が鬼門となった。また、R地点でで右沿いのライントレースから左沿いのライントレースにシフトしている。 円をトレースするときは内周より外周で回ったほうが都合がいいためだ。 ***コップ取得-回帰 [#b6def031] turn_right3; Wait(1750 * z); //coppu1 go_forward; Wait(150); Off(OUT_AC); AD; Off(OUT_B); go_back; Wait(150); turn_left3; Wait(1950 * z); turn_right3; Wait(200 * z); go_forward; Wait(500 * z); while (SENSOR_2 > 45) { turn_right3; } Off(OUT_ABC); PlayTone(DO,100); Wait(100); PlayTone(DO,100); Wait(100); Wait(3000); 右を向きX地点にあるコップを取得し原点回帰する ***Q-S [#s29e1d62] DKK(); Wait(1000); //Q→S turn_right3; Wait(400); go_forward; Wait(300); while (SENSOR_2 > 45) { turn_left3; } S地点にて、円Yを回るときはコップを置く関係上外周を回るほうがいいため、左沿いから右沿いにシフトするための行動をとった。 ***コップ配置-回帰 [#xe4a68a6] IKK(); Wait(1000); //S2度目 turn_left3; Wait(3000 * z); //koppu2 go_forward; Wait(500); Off(OUT_AC); AU; go_back; Wait(500); turn_right3; Wait(2500 * z); Off(OUT_ABC); Wait(1000); turn_left3; Wait(100); go_forward; Wait(600); while (SENSOR_2 > 45) { turn_left3; } 二度目に地点Sに差し掛かった時に後ろを向きYにコップを置いて、回帰する。 ***-ゴール [#m910d157] IKK(); Wait(1000); //F OnFwd(OUT_A,20); OnRev(OUT_C,60); Wait(200 * z); OnFwd(OUT_A,60); OnRev(OUT_C,1); Wait(800 * z); DKK(); Wait(1000); //C OnFwd(OUT_C,40); Wait(1700 * z); OnRev(OUT_A,30); OnRev(OUT_C,30); Wait(1700 * z); DKK(); turn_right3; Wait(200 * z); OnFwd(OUT_C,50); OnFwd(OUT_A,50); //D,ゴールへ Wait(300 * z); } F地点で右沿いから左沿いのライントレースへと変化させている。 このほうがF地点で超信地旋回する際によりコースとロボットの向きが水平になり、ライントースの安定性が増す。 *結果 [#i5c885e9] ライントレース自体は完璧であったが、コップの運送において大きな失敗をしてしまい、本番では一発で成功させることができたなった。 *自評・感想 [#o87782c1] 上の通り、ライントレースのみでの成功率はほぼ100%であった。が、コップの取得についてプログラミングの作成が難しく、試行ごとのズレも大きく明確な打開策がないまま本番を迎えてしまった。 次回の課題でその打開策が見つかるように努力したい。