[[2019a/Member]] #contents *課題3について [#hfe6ff7f] ピンポン玉または青と赤のボールを運搬して、所定の容器の中に入れる。 #ref(./2019a-mission3.png,50%,今回のコース) **基本ルール [#ze2fe9c0] プラ容器内の玉を1個運べば8点。二つとも運べば20点。 L地点とL'地点の玉をどちらか1個運べば4点、2個とも運べば12点。 競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。 図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。 開始の合図から5秒以内にスタートボタンを押す作業を完了すること。 **今回のロボコンに対しての作戦 [#naec340a] 今回私たちは、ロボットを作る際にまず作戦を決めた。まず、箱の中に入っている2個のボールのみを運ぶという作戦だ。そのため、箱自体を運んでからもう一つの箱に入れるというロボットを作った。 ルートはAからB、Cを通ったところで右折し、箱を取り、次の箱まで運びに行くというものとなっている。 *今回作ったロボットの解説 [#hd90a6c8] #ref(./47808.jpg,40%,今回のロボット) まずモーターの使いどころだが、弁当箱を持ち上げるために馬力不足だったので二つのモーターを使っている。そのため受信側のロボットが弁当箱を持ち上げるロボットで、送信側のロボットが車体を動かすために二つのモーターを使っている。 #ref(./47809.jpg,40%,今回のロボット) 弁当箱を持ち上げ、そのあとにレールをたどってもう一つの弁当箱へと転がしていくという機構になっている。 #ref(./47806.jpg,40%,今回のロボットの背面) 赤線の中にあるように、光センサーを二つ使うことでライントレースを正確に行うことができるようにしている。 **ライントレースの方法 [#b725b2e5] 二つの光センサーを使っているため、レールの両端にセンサーを置き、直進する際は両方が白と判断するとき。 #ref(./kousaten.png,40%,曲がり角) 曲がり角では片方のセンサーが黒と判断された場合、そのセンサーの方向に曲がるようなプログラムとなっている。 #ref(./cross.png,40%,交差点) 交差点に差し掛かった場合は両方のセンサーが黒と判断された場合となるので一時停止させています。 *今回のプログラムと解説 [#h88f4b98] **送信側のプログラム [#f2938fdc] #define Line 43 #define UP 13 #define DOWN 12 #define STOP 11 ここは受信側と送信側で通信をするための数字を定義している。 sub follow_line() { SetSensor(SENSOR_2,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); int t; t=FastTimer(0); while(FastTimer(0)<250) { if(SENSOR_2>43 && SENSOR_3>43){OnFwd(OUT_BC); }else if(SENSOR_2<Line && SENSOR_3>Line){OnFwd(OUT_C);Off(OUT_B); }else if(SENSOR_2>Line && SENSOR_3<Line){OnFwd(OUT_B);Off(OUT_C); }else {Off(OUT_BC);} } Off(OUT_BC); } ここまでがライントレースのプログラムとなっている。ライントレースはA→Bまでなのでその秒数を測りそこまでライントレースして一時停止するということになっている。 右左折の判断は上記した通りとなっている。 task main() { ClearTimer(0); follow_line(); Wait(20); OnFwd(OUT_BC); Wait(95); Off(OUT_BC); OnFwd(OUT_C); OnRev(OUT_B); Wait(100); Off(OUT_BC); OnRev(OUT_BC); Wait(230); Off(OUT_BC); Wait(40); ここまではA→Bの間でライントレース後に箱まで調整して取りに行く形となっている。 SendMessage(DOWN); Wait(1); SendMessage(STOP); ここで受信側のロボットにアームを下げるように指示をし、その後すぐに動きを止めさせることでずっとモーターを動かし続けることを避けている。 OnFwd(OUT_BC); Wait(300); Off(OUT_BC); OnFwd(OUT_B); OnRev(OUT_C); Wait(220); Off(OUT_BC); Wait(20); OnFwd(OUT_BC); Wait(400); Off(OUT_BC); OnFwd(OUT_C); OnRev(OUT_B); Wait(120); Off(OUT_BC); その後箱を取り、空の箱まで移動させている OnRev(OUT_BC); SendMessage(UP); Wait(200); SendMessage(STOP); Off(OUT_BC); } 最後に箱を上げながらバックすることで確実に空の箱にボールを入れるようにしている。 **受信側のプログラム [#q748b0f3] #define arm_up OnFwd(OUT_AC);Wait(30);Off(OUT_AC);l #define arm_down SetPower(OUT_AC,1);OnRev(OUT_AC);Wait(50);Off(OUT_AC); ここではアームを上げる動きと、下げる動きの定義づけをしている。 #define UP 13 #define DOWN 12 #define STOP 11 ここは通信のための定義をしている。 task main() { ClearMessage(); While(true){ if(Message() == STOP){ Off(OUT_AC); }else if(Message() == DOWN){ arm_down; }else if(Message() == UP){ arm_up; } arm_up;} } } メッセージを受信してから、アームの上げ下げをするというプログラムとなっている。 *感想 [#ad40e54b] 全てのボールを拾わずに箱の中だけに焦点を当てて確実にボールを2つ運べるロボットを作るという作戦だったが、本番では2つのコースのつなぎ目にロボットが引っかかってしまい、一つもボールを運ぶことができなかった。 あまり汎用性の高いプログラムではなく、その位置にある箱を運び中のボールを決まった場所入れるという、融通の利かないものになってしまった。