[[2014a/MemberOnly/進行状況]]

#contents

*メンバー [#q3493514]
清原 雅司 (kiyo)

須藤 海志 (sudo)

金子 まさし (sakar)

大森 武人 (totakeke)

*課題 [#ab398598]
[[2014a/Mission2]]

&ref(2014a/Member/kiyo/Mission2/2014a-mission2.png);

A,B,C(サイコロで開始時に決定)に置かれた紙コップを区別して1,2,3(固定)に運ぶ。

*ロボット本体 [#y087f47f]
**全体像 [#ea4d7960]
&ref(2014a/Member/kiyo/Mission2/image21.jpeg);

"Simple is The Best"を目指し、無駄を極力避け、機能美を追求した、NQCらしい色合いの設計にしました。その後、メンバーの思いつきにより飾り羽をつけ、ビジュアル性が向上しました。

&ref(2014a/Member/kiyo/Mission2/image22.jpeg);

横から見たところ。

&ref(2014a/Member/kiyo/Mission2/image33.jpeg);

アームで紙コップを持ち上げたところ。4つのタイヤとアームの根元部分で安定して支えます。

**ベース [#m656d25a]
&ref(2014a/Member/kiyo/Mission2/image36.jpeg);

小型化に貢献したドライブベースです。モーターでそれぞれ独立して動く前タイヤ2つと後ろタイヤ1つが付いています。タイヤの軸を固定するための真ん中の軸を残しつつ、最も短い幅になるように作りました。モーターから直接タイヤにつないであります。

&ref(2014a/Member/kiyo/Mission2/image37.jpeg);

裏から見たところ。

&ref(2014a/Member/kiyo/Mission2/image53.jpeg);

一部分解。お気に入りの後ろタイヤ。

**アーム [#ef82d271]
&ref(2014a/Member/kiyo/Mission2/image45.jpeg);

見本を元に作りました。1つのモーターでアームの開閉、昇降を行うことができます。機構は写真より推測してください。

アームが垂直になるまで上がり切ってしまうと紙コップを掴む部分が緩んでしまったので、写真中央の灰色のラインの入った黒い枠のところに前の方の棒が当たるようにしてつっかえるようにしました。歯車の数が多いのは、モーターをCPUの上に付けたかったからです。

&ref(2014a/Member/kiyo/Mission2/image43.jpeg);

裏から見たところ。

&ref(2014a/Member/kiyo/Mission2/image48.jpeg);

前から見たところ。

&ref(2014a/Member/kiyo/Mission2/image47.jpeg);

モーターにつながるところに白い歯車を使うことで、モーターが回り過ぎる時の負荷を減らします。

&ref(2014a/Member/kiyo/Mission2/image28.jpeg);

灰色のラインがワンポイントです。

**ガイド(触覚) [#o320d231]
&ref(2014a/Member/kiyo/Mission2/image25.jpeg);

多少の誤差があっても紙コップを同じ場所にすることができるようにガイド(いわゆる触覚)を付けました。押すことで紙コップを中央に寄せることができます。メンバーの見事な発想により、ブロックではなくやわらかでなめらかな棒をガイドにしました。これにより、アームが触れても壊れにくく、軽量化できました。

&ref(2014a/Member/kiyo/Mission2/image51.jpeg);

紙コップの大きさにピッタリです。

*プログラム[#z7bdda83]

色で紙コップを区別して場合分けするプログラムを作った。
ロボコン(8/7実施)時より、サブルーチンを使ってまとめた。

 #define black 40 // ライントレース用の光センサーで黒と認識する閾値を"40"とする。
 #define siro1 46 // 紙コップ区別用の光センサーで白と認識する閾値を"46"とする。
 #define kuro3 40 // 紙コップ区別用の光センサーで黒と認識する閾値を"40"とする。
 #define right OnFwd(OUT_A);OnRev(OUT_C); // 左のタイヤを前に回し、右のタイヤを後ろに回して右に旋回する。
 #define left OnFwd(OUT_C);OnRev(OUT_A); // 右のタイヤを前に回し、左のタイヤを後ろに回して左に旋回する。
 #define go OnFwd(OUT_AC); // 両方のタイヤを前に回し、前進する。
 #define back OnRev(OUT_AC); // 両方のタイヤを後ろに回し、後退する。
 #define Stop Off(OUT_AC); // 両方のタイヤを止める。
 #define Stop Off(OUT_AC); // 両方のタイヤを止め、停止する。
 #define get OnFwd(OUT_B); // アーム用のモーターを前に回して、紙コップを掴み、アームを上げる。
 #define put OnRev(OUT_B);Wait(31);Off(OUT_B); // 31セント秒だけアーム用のモーターを後ろに回して、アームを下ろし、紙コップを放す。
 (回し過ぎると激しくアームを下ろし、損傷の恐れ。少ないと、アームが十分開かない。)
 
 sub STARTtoA() // STARTからAへ行くプログラム。
 {
     go;
     until (SENSOR_2 < black); // START前の黒い線を認識するまで前進する。
     right;
     Wait(74); // 2に置いてある紙コップに当たらない程度に右旋回する。
     go;
     Wait(212); // 2の紙コップを越えるぐらいに前進する。
     left;
     Wait(31); // Aの紙コップをガイドが捉えられる角度まで左旋回する。
     go;
     until (SENSOR_2 < black); // Aの紙コップを捉え、少し押しながら、紙コップの下の黒い線を認識するまで前進する。
     Stop; // 止まる。
     Wait(20); // 前進後のブレが収まるのを待つ。
 }
 
 sub Ato2() // Aから2へ行くプログラム。
 {
     get; // 紙コップを掴む。
     Wait(50); // 紙コップを掴んだ後のブレが収まるまで待つ。
     back;
     Wait(330); // ガイドで2に置いてある紙コップを正面から捉えられるように後退する。
     left;
     Wait(27); // 2の紙コップをガイドが捉えられる角度まで左旋回する。
     go;
     until (SENSOR_2 < black); // 2の紙コップを捉え、少し押しながら、紙コップの下の黒い線を認識するまで前進する。
     Stop;
     back;
     Wait(40); // 紙コップを重ねられる距離まで後退する。
     Stop;
     Wait(20); // 後退後のブレが収まるのを待つ。
     put; // 紙コップを置く。
     back;
     Wait(50); // 後退し、アームを紙コップから遠ざける。
     Stop; // 止まる。
 }
 
 sub 2toC() // 2からCへ行くプログラム。
 {
     back;
     Wait(50); // 前進するときに2の紙コップに当たらない程度に後退する。
     right;
     Wait(34); // Cに置いてある紙コップをガイドが捉えられる角度まで右旋回する。
     go;
     Wait(500); // Cの紙コップの手前の黒い線を越えるまで前進しながら待つ。
     Wait(500); // Cの紙コップの手前の黒い線を越えるまで前進する。
     until (SENSOR_2 < black); // Cの紙コップを捉え、少し押しながら、紙コップの下の黒い線を認識するまで前進する。
     Stop;
     Wait(20); // 前進後のブレが収まるのを待つ。
     SetSensor(SENSOR_3, SENSOR_LIGHT); 紙コップに当たったところで、紙コップ区別用の光センサーを起動する。
     get; // 紙コップを掴む。
     SetSensor(SENSOR_3, SENSOR_LIGHT); // 紙コップに当たったところで、紙コップ区別用の光センサーを起動する。
     get; // 紙コップを掴む。本当はここから次のサブルーチンである。
     Off(OUT_B); // アームのモーターを止める。
 }
 
 sub Ato1() // Aから1へ行くプログラム。
 {
     get; // 紙コップを掴む。
     go;
     Wait(110); // 2の紙コップに当たらない程度に前進する。
     left;
     Wait(98); // 1の紙コップをガイドが捉えられる角度まで左旋回する。
     go;
     Wait(500); // 1の紙コップの手前の黒い線を越えるまで前進する。
     until (SENSOR_2 < black); // 1の紙コップを捉え、少し押しながら、紙コップの下の黒い線を認識するまで前進する。
     Stop;
     back;
     Wait(40); // 紙コップを重ねられる距離まで後退する。
     Stop;
     Wait(20); // 後退後のブレが収まるのを待つ。
     put; // 紙コップを置く。
     back;
     Wait(50); // 後退し、アームを紙コップから遠ざける。
     Stop; // 止まる。
 }
  
 sub 1toC() // 1からCへ行くプログラム。
 {
     back;
     Wait(200); // 2,3の紙コップに当たらないように後退する。
     until (SENSOR_2 < black); // 2と3をつなぐ線を光センサーが認識するまで後退する。
     right;
     Wait(145); // Cに置いてある紙コップをガイドが捉えられる角度まで右旋回する。
     go;
     Wait(200); // Cの紙コップの手前の黒い線を越えるまで前進する。
     until (SENSOR_2 < black); // Cの紙コップを捉え、少し押しながら、紙コップの下の黒い線を認識するまで前進する。
     Stop; // 止まる。
 }
 
 sub Cto3() // Cから3へ行くプログラム。
 {
     get; // 紙コップを掴む。
     back;
     Wait(200); // 旋回するときにCの紙コップに当たらないように後退する。
     left;
     Wait(130); // 3の紙コップをガイドが捉えられる角度まで左旋回する。
     go;
     Wait(250); // 3の紙コップの手前の黒い線を越えるまで前進する。
     go;
     until (SENSOR_2 < black); // 3の紙コップを捉え、少し押しながら、紙コップの下の黒い線を認識するまで前進する。
     back;
     Wait(45); // 紙コップを重ねられる距離まで後退する。
     Stop;
     Wait(20); // 後退後のブレが収まるのを待つ。
     put; // 紙コップを置く。
     back;
     Wait(50); // 後退し、アームを紙コップから遠ざける。
     Stop; // 止まる。
 }
 
 sub Ato3() // Aから3へ行くプログラム。
 {
     get; // 紙コップを掴む。
     left;
     Wait(66); // 3の紙コップをガイドが捉えられる角度まで左旋回する。
     go;
     Wait(350); // 3の紙コップの手前の黒い線を越えるまで前進する。
     go;
     until (SENSOR_2 < black); // 3の紙コップを捉え、少し押しながら、紙コップの下の黒い線を認識するまで前進する。
     back;
     Wait(45); // 紙コップを重ねられる距離まで後退する。
     Stop;
     Wait(20); // 後退後のブレが収まるのを待つ。
     put; // 紙コップを置く。
     back;
     Wait(50); // 後退し、アームを紙コップから遠ざける。
     Stop; // 止まる。
 }
 
 sub 3toC() // 3からCへ行くプログラム。
 {
     back;
     Wait(50); // 旋回するときに3の紙コップに当たらないように後退する。
     right;
     Wait(116); // Cの紙コップをガイドが捉えられる角度まで右旋回する。
     go;
     Wait(100); // Cの紙コップの手前の黒い線を越えるまで前進する。
     until (SENSOR_2 < black); // Cの紙コップを捉え、少し押しながら、紙コップの下の黒い線を認識するまで前進する。
     Stop;
     get; // 紙コップを掴む。本当はここから次のサブルーチンである。
     Off(OUT_B); // アームのモーターを止める。
 }
 
 task main() // メインのプログラム。
 {
     SetSensor(SENSOR_2, SENSOR_LIGHT); // ライントレース用の光センサーを起動する。
     STARTtoA();  
     SetSensor(SENSOR_3, SENSOR_LIGHT); // 紙コップに当たったところで、紙コップ区別用の光センサーを起動する。
 
     if (SENSOR_3 >= siro1){ // Aで白色の紙コップだと判断したら、
       ClearSensor(SENSOR_3); // 紙コップ区別用の光センサーを停止して、
       Ato2(); // Aから2へ行く。
       2toC(); // 2からCへ行く。
     }
 
     else if (SENSOR_3 <= siro1 && SENSOR_3 >= kuro3){ // Aで灰色の紙コップだと判断したら、
       ClearSensor(SENSOR_3); // 紙コップ区別用の光センサーを停止して、
       Ato1(); // Aから1へ行く。
       1toC(); // 1からCへ行く。
 
       if (SENSOR_3 <= kuro3){ // Cで黒色の紙コップだと判断したら、
         ClearSensor(SENSOR_3); // 紙コップ区別用の光センサーを停止して、
         Cto3(); // Cから3へ行く。
       } 
     }
 
     else if (SENSOR_3 <= kuro3){ // Aで黒色の紙コップだと判断したら、
       ClearSensor(SENSOR_3); // 紙コップ区別用の光センサーを停止して、
       Ato3(); // Aから3へ行く。
       3toC(); // 3からCへ行く。
     }
 }

**工夫点 [#r61c7509]
++時折ロボットのブレが収まるまで待った。←次の動作に支障が出たためである。

**反省 [#l2c8f9c7]
++光センサーで紙コップの色を区別して6つの場合分けをすればよい、と考えプログラムを作ったが、時間が足りず途中までしか作れなかったのが残念である。時間が足りなくなったのは、モーターの疲弊による時間調整を繰り返していたことによるものが多い。時間調整を極力減らせるようなライントレース主体のプログラムを作れればよかった。

++紙コップを置くときに後退して待つプログラムをputの定義の中に組み込んでもよかった。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS