[[2018a/Member]] #contents *課題2[#b1a6efbd] 下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。 #ref(2018a/Member/mine/Mission2/2018a-mission2.png,50%,コース) **コース [#y45534bc] 私が担当したのは第1コースである 第1コース † Aをスタート Bを直進 Cで一時停止の後、直進 Dで一時停止の後、Xの空き缶をキャッチしてD地点に戻る DからEに向かい、Eを直進 Fを左折 Gで一時停止の後、左折 Hで一時停止の後、右折 Iで一時停止の後、右折 Lを直進 Kを直進 Jで一時停止の後、空き缶をYに置きてJに戻りBに向かう Bで一時停止の後、左折 Aで停止 (一時停止の指定がある場所は、1秒間停止すること) このコースでの難点はコースの右側のトレースと左側のトレースを変えなければならないことと、小さなカーブをしっかりとトレースして曲がることができるかどうかである。 *機体について [#k2bda8d9] #ref(2018a/Member/mine/Mission2/IMG_2644.JPG,50%,機体) -サイドにモータを持ち真ん中に支えをつけた三輪車型 #ref(2018a/Member/mine/Mission2/IMG_2645.JPG,50%,機体) -機体は単純なクワガタ型で先端の輪ゴムが缶の滑り止めの役割を果たす。 -三つ目のモータが開閉を担当しており、ギアが浮かないようにすることがたいへんであった。 #ref(2018a/Member/mine/Mission2/IMG_2666.JPG,50%,kitai) -タイヤは小さいものを使っている。そして前輪をなくして抵抗をなるべく小さくすることで小回りの利くようにした。これによって小さなカーブをプログラムをそのままにしてトレースできるようにした。 -光センサとタイヤの位置が離れすぎており、トレースの際に機体が大きくぶれてしまう。ここは改善するべきであった *プログラム [#b0e40d01] **色の基準 [#ea831912] #ref(2018a/Member/mine/Mission2/aaa.jpg,50%,色の基準) if(SENSOR_3<45) //B { lrt; n++; } else if(SENSOR_3<52) //G { go; n=0; } else { llt; n=0; // W } } 白(W)、灰(G)、黒(B)の基準を設けて、LR の回転だけ変えてプログラムを作る。 変数はnとして黒の時だけnを足していき、nが一定以上になった時に次のプログラムを実行するようにしている。 **基本プログラム [#r611c55e] #define llt OnRev(OUT_A,50); OnFwd(OUT_C,30); Wait(1);//大きく左に回る #define lrt OnFwd(OUT_A,30); OnRev(OUT_C,50); Wait(1);//大きく右に回る #define ternleft OnRev(OUT_A,50); OnFwd(OUT_C,10);//左に回る #define ternright OnFwd(OUT_A,10); OnRev(OUT_C,50);//右に回る #define go OnRev(OUT_A,50); OnRev(OUT_C,50);//直進する #define back OnFwd(OUT_A,50); OnFwd(OUT_C,50);//後退する #define close RotateMotor(OUT_B,50,90);//ハサミ閉じる #define open RotateMotor(OUT_B,50,-90);//ハサミ開く task main() { SetSensorLight(S3); int n=0; while(n<=250) //bまで { if(SENSOR_3<45) //B { lrt; n++; } else if(SENSOR_3<52) //G { go; n=0; } else { llt; n=0; // W } } Off(OUT_AC); Wait(1000); //Bで停止 RotateMotor(OUT_A,50,-130); //T字路の横断 n=0; while(n<=300) //cまで { if(SENSOR_3<45) //B { lrt; n++; } else if(SENSOR_3<52) //G { go; n=0; } else { llt; n=0; // W } } Off(OUT_AC); Wait(1000); //Cで停止 RotateMotor(OUT_A,50,-300); //Cを横断 n=0; //トレースの左右を逆転 while(n<=200) { if(SENSOR_3<45) //B { llt; n++; } else if(SENSOR_3<51) //G { go; n=0; } else { ternright; n=0; // W } } Off(OUT_AC); Wait(2000); //D直前の角で止まる n=0; while(n<=200) //D { if(SENSOR_3<45) //B { llt; n++; } else if(SENSOR_3<51) //G { go; n=0; } else { ternright; n=0; // W } } Off(OUT_AC); Wait(1000); //D到着 close; Off(OUT_ABC); RotateMotor(OUT_A,50,-180); Wait(1000); //挟む n=0; while(n<=200) { if(SENSOR_3<45) //B { llt; n++; } else if(SENSOR_3<51) //G { go; n=0; } else { ternright; n=0; // W } } OnRev(OUT_AC,50); Wait(500); Off(OUT_AC); //Eの横断 n=0; while(n<=400) { if(SENSOR_3<45) //B { llt; n++; } else if(SENSOR_3<51) //G { go; n=0; } else { ternright; n=0; // W } } Off(OUT_AC); Wait(1000); //Fで停止 n=0; while(n<=400) { if(SENSOR_3<45) //B { llt; n++; } else if(SENSOR_3<51) //G { go; n=0; } else { ternright; n=0; // W } } Off(OUT_AC); go; Wait(500); //S字1つ目で左右の反転準備 ※反転 n=0; while(n<=400) { if(SENSOR_3<45) //B { lrt; n++; } else if(SENSOR_3<52) //G { go; n=0; } else { llt; n=0; // W } } Off(OUT_AC); go; Wait(500); //s字2つ目で左右の反転準備 ※反転 n=0; while(n<=230) { if(SENSOR_3<45) //B { llt; n++; } else if(SENSOR_3<51) //G { go; n=0; } else { ternright; n=0; // W } } Off(OUT_AC); Wait(1000); RotateMotor(OUT_C,50,-310); //H で曲がる n=0; while(n<=200) { if(SENSOR_3<45) //B { llt; n++; } else if(SENSOR_3<51) //G { go; n=0; } else { ternright; n=0; // W } } Off(OUT_AC); Wait(1000); //Iで止まる RotateMotor(OUT_C,50,-350); n=0; while(n<=250) { if(SENSOR_3<45) //B { lrt; n++; } else if(SENSOR_3<52) //G { go; n=0; } else { llt; n=0; // W } } Off(OUT_AC); Wait(500); //L で止まり無視 RotateMotor(OUT_A,50,-90); Off(OUT_A); n=0; while(n<=230) { if(SENSOR_3<45) //B { lrt; n++; } else if(SENSOR_3<52) //G { go; n=0; } else { llt; n=0; // W } } Off(OUT_AC); Wait(500); //k で止まり無視 RotateMotor(OUT_A,50,-90); Off(OUT_A); n=0; while(n<=230) { if(SENSOR_3<45) //B { lrt; n++; } else if(SENSOR_3<52) //G { go; n=0; } else { llt; n=0; // W } } Off(OUT_AC); Wait(1000); RotateMotor(OUT_C,50,360); open; Off(OUT_B); back; //帰還準備 Wait(250); RotateMotor(OUT_C,50,-60); Off(OUT_C); go; //黒を認識するまで前進 until(SENSOR_3 <= 45); n=0; while(n<=250) { if(SENSOR_3<45) //B { lrt; n++; } else if(SENSOR_3<52) //G { go; n=0; } else { llt; n=0; // W } } Off(OUT_AC); Wait(1000); RotateMotor(OUT_A,50,-180); //方向調整 n=0; while(n<=250) { if(SENSOR_3<45) //B { lrt; n++; } else if(SENSOR_3<52) //G { go; n=0; } else { llt; n=0; // W } } Off(OUT_AC); Wait(1000); } *結果 [#c9cca0b9] トレースはとてもうまくいくが機体の構造上左右のブレが大きく缶を話してしまうことが多かった。なので、機体の重心をよく考えて機体を組み立てることが大切であたかもしれない。しかし最終的には成功する頻度も上がり、前回の文字を書くロボットに比べてきれいな結果を迎えられた。 *反省 [#t7936127] 今回はセンサを用いることでの状況判断をロボットにさせることが課題であったが、その条件を探し出すことに苦労した。また、実際にうごかしてみて、試行錯誤する回数は、圧倒的に多かったように感じる。次回には誤動作する原因をしっかりと考えて、さらに機体の最適化も行っていきたい。