2台のロボットで4つのピンポン球を指定の位置に運び入れることだった。 詳しいフィールドとルールの説明は次のリンクに書いてある。 2019a/Mission3
下の写真は、ロボットの全体の写真です。黄色の本体を2段にしているところが、車の部分。そしてその右の灰色と黒のブロック中心にできているのが、アームの部分である。この車は3輪で回るのはアームと反対方向の2つつまり、後輪です。この後詳しく説明するが、車体は前から後ろにかけて少し斜めになっている。
アームはボールをつかむタイプではなく、ベルトコンベアーのように転がして回収するタイプにした。 ここで使ったモーターは2つで、1つはベルトコンベアーのベルトの部分を、動かすためのもの。そして2つ目は、このベルトコンベア本体を上下にさせるものです。 下の写真のように少し斜めに地面に接することでボールを取りやすくしている。
また、ベルトコンベアーの上の部分に少し余裕を持たせることによって下の写真のように何個もピンポン玉を抱えながら、移動することができるようにしている。 ちょうど4個ほど入る間隔のなっている。
下の写真はライトセンサーのアップの写真である。このライトセンサーがどこに着いているかというと、上の全体の写真で言うところのアームと本体の接合部の後ろの部分である。
完成した完璧なプログラムがないため、僕たちが考えた部分部分乗せていきます
私たちの班が考えたロボットのプランは、Lまでライントレースで行き、その後ライントレース紙パックまで行き、その後、行動している時間を図ることでまた一方の紙に移動し、ライントレースでもう1つの玉をとり全てを紙パックの中に入れる算段でいた。 ルートは下の写真に書いてある通りです。
しかし、最初のライントレース時の急カーブを成功率が車体の大きさとプログラムの練り込み度不足で非常に低くなってしまった。
int t
アーム本体の上下の秒数の変数tです。 紙パック内と外のピンポン球では、秒数を変える予定でした。
sub ball_c() { Off(OUT_AC); until(Message() == SIGNALON);
もう一つのnqcから、ピンポン球の前にくると、合図が来るようになっています
OnFwd(OUT_C); //下げ Wait(t); Off(OUT_C);
アーム本体を床につくまで下げます。
OnFwd(OUT_A); //巻き上げ Wait(1000);
アームのベルトコンベアーを巻き上げてピンポン球を回収します。
OnRev(OUT_C); //上げ Wait(t); Off(OUT_C);}
アーム本体を床から持ち上げます。
本番では、一回でとれない場合を考え、5回繰り返す予定でした。
sub ball_l() { Off(OUT_AC); until(Message() == SIGNALON);
ピンポン球を入れる紙パックの前に来たとき、もう一つのnqcから来る合図で始動する
OnRev(OUT_C); //巻き戻し Wait(10000); Off(OUT_C); SendMessage(SIGNALOFF); }
アームのベルトコンベアーをピンポン球を取るときの逆回転させ、ピンポン球を放出します。
このライントレースは、Mission2と同様なものを使いました。 詳しくは、2019a/Member/L/Mission2 のプログラムについての定義とサブルーチンの説明をご覧ください
#define go OnFwd(OUT_AC);
このまっすぐ進む定義を、一定時間で止まるように設定することで行いました。
この後の感想まとめに詳しく書いてありますが、ロボットを作るのがかなり遅れ、かつ急カーブを曲がることが、ほとんどできていなかったため、時間の調整ができませんでした。なので今回のレポートのプログラム部分には、僕たちがたどり着いた各要所のプログラムのみの掲載になります。
今回の課題はテストと重なっていて、日にちを何日もかけることができなかった。そのため最後の日は徹夜だったのだが、プログラムの始めに書いたように、ロボットが初めはさらに大きく、カーブが完全に曲がらないロボットを前日になっても使っていた。ピンポン玉を取る構造に力をかけた分ロボットととその前のピンポン玉まで行くところが疎かになってしまっていた。そこを改善するは、もう少しいいものができたと思う。また、急遽変えたロボットであったため、当日の補強な際、ライトセンサーと地面の距離が変わるというハプニングに気づき損ねてしまい、本番は一切走らないロボットになってしまったのが残念だった。 先生の言うようにもっと段階を踏んでロボットは、やって行くべきだったし、もっとテスト前から、少しでも集まって考えを共有していくことで、ミスにももっと早く気づけると思った。