[[2019a/Member]] *課題3 [#j69b07a2] ピンポン玉または青と赤のボールを運搬して、所定の容器の中に入れる。 フィールドの説明 フィールドは課題2で使用した紙を使用する。 生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片方に玉を2個入れる。 残りの2個の玉は課題2と同じ位置に置く。その際、ゴムタイヤやプレートの上に置いてもよい。 プラ容器には色をつけたり文字や記号を書いてもよい。 プラ容器は両面テープ等でフィールドに固定してもよい。 2枚の紙の境界にはそれぞれ幅1cm、合計2cmの黒線を描いてもよい。 #ref(2019a/Member/Tomi/Mission3/2019a-mission3.png,25%) -基本ルール 競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。 図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。 開始の合図から5秒以内にスタートボタンを押す作業を完了すること。 競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。 途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。 競技終了後、ロボットが、ゴールのプラ容器に触れていてはいけない。 競技終了後、もともと玉が入っていたプラ容器が、ゴールのプラ容器に触れていてはいけない。 -基本得点の計算方法 プラ容器内の玉を1個運べば8点。二つとも運べば20点。 L地点とL'地点の玉をどちらか1個運べば4点、2個とも運べば12点。 競技終了後、ゴールのプラ容器が完全に円から出しまった場合、もとの基本点の1/4を減点。 競技終了後、ゴールのプラ容器の半分以上が円から出ていれば、もとの基本点の3/4を減点。 競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれば、もとの基本点の1/2を減点。 競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれば、もとの基本点の1/2を減点。 競技終了後、ゴールのプラ容器にロボットが触れていれば、もとの基本点の1/4を減点。 技術点の計算方法 以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(5チーム)が20点満点で採点し、その平均点を求める。 得点の目安: 玉を探し取りにいくまでの動作 (3点) 玉を掴む動作 (3点) 玉をを運ぶ動作 (2点) 玉を容器の中に入れる動作 (2点) 2台のRIS、NXT、EV3の連携の良さ(2点) 自立型のロボットとしての形や動作の美しさ、斬新さ(2点) その他 (3点) *ロボットの全体像 [#gc6ad349] プログラミングの量を減らすために通信を行なったのでRISを2台用いることになった。それによって全体が大きくなってしまった。その2台は全体をタイヤを動かす方とピンポン球を回収するのに用いたアームを動かすのでわけた。 #ref(2019a/Member/Tomi/Mission3/line_92280379971507.jpg,25%) +アーム ピンポン球をつかんでためておき、まとめてだすようにした。また取りやすいように突起をつけた。 #ref(2019a/Member/Tomi/Mission3/line_922652412773648.jpg,25%) #ref(2019a/Member/Tomi/Mission3/line_92265241273648.jpg,25%) +シーソー アーム全体が上下運動できるようにした。この動きをするのにギアのパワーを上げるためギアを6枚用いた。また全体のバランスを取るために後ろにモーターを用いた。 #ref(2019a/Member/Tomi/Mission3/line_92229901054703.jpg,25%) +ベルトコンベアー ピンポン球を回収したあとためるのにベルトコンベアーを片方のみ動かしてで後ろに流す。 #ref(2019a/Member/Tomi/Mission3/line_92242857796365.jpg,25%) +足回り タイヤは3輪で動かした。前の2輪はモーターで動かし後ろは1輪は支えるために用いた。 #ref(2019a/Member/Tomi/Mission3/line_92235093634805.jpg,25%) #ref(2019a/Member/Tomi/Mission3/line_92232115503088.jpg,25%) *動き [#o894b6dd] 全体が重くなってしまったためライントレースを少なくして成功できるようにした。 +1つ目のピンポン球 ピンポン球をキャッチ→90度回転→箱にピンポン球をいれる スタートラインから2本の黒線を横切って、3本目の黒線で停止する。 +2つ目のピンポン球 90度回転→ピンポン球をキャッチ +りりぱっくの中のピンポン球 90度回転→下がる→ピンポン球をキャッチ ピンポン球を取るのにりりぱっくが当たってしまうので、少し下がってからつかむ。 +箱に入れるまで 90度回転→直進→アームを下げていれる 2本目の黒線で停止し、少し進みいれる。 *プログラム [#d62f467d] +アームのプログラム A:キャッチアーム B:シーソー C:コンベアー マクロ #define signal_catch 1 #define signal_release 2 #define signal_end 3 ボール回収のサブルーチン sub CATCH() { ClearMessage(); until(Message()==signal_catch);//signal_catchが送られるまで待機 // アームを下げる OnFwd(OUT_B); Wait(30); Off(OUT_B); Wait(100); SetPower(OUT_A,2); // つかむ OnRev(OUT_A); Wait(90); Off(OUT_A); Wait(100); // 上げる OnRev(OUT_B); Wait(50); Off(OUT_B); Wait(100); // 手を元に戻す OnFwd(OUT_A); Wait(90); Off(OUT_A); Wait(100); // コンベアーで奥へ送る OnFwd(OUT_C); Wait(200); Off(OUT_C); Wait(100); SendMessage(signal_end);//動作終了を足のRISに送信 } 箱に入れるサブルーチン sub release() { ClearMessage(); until(Message()==signal_release); //signal_releaseが送られてくるまで待機 // アーム下げる OnFwd(OUT_B); Wait(30); Off(OUT_B); Wait(100); // コンベアーで前へ送る OnRev(OUT_C); Wait(200); Off(OUT_C); Wait(100); // アーム上げる OnRev(OUT_B); Wait(50); Off(OUT_B); Wait(100); SendMessage(signal_end);//動作終了を足のRISに送信 } メインプログラム task main() { ClearMessage(); CATCH();//L'でつかむ�� release();//J'でリリース�� CATCH();//Lでつかむ�� CATCH();//Jでリリパックからつかむ�� CATCH(); ClearMessage(); until(Message()==signal_release);//�� // 下がる OnFwd(OUT_B); Wait(30); Off(OUT_B); Wait(100); // 前へ送る OnRev(OUT_C); Wait(200); Off(OUT_C); Wait(100); // 上がりながら送る OnRev(OUT_BC); Wait(50); Off(OUT_BC); Wait(100); SendMessage(signal_end); } +車体 A:右の車輪 C:左の車輪 2:光センサー マクロ・グローバル変数 #define black 40 #define gray_black 44 #define gray 47 #define gray_white 50 #define white 60 #define go_ahead OnFwd(OUT_AC); #define turn_left OnFwd(OUT_A);Off(OUT_C); #define turn_right OnFwd(OUT_C);Off(OUT_A); #define circling_left OnRev(OUT_C);OnFwd(OUT_A); #define circling_right OnRev(OUT_A);OnFwd(OUT_C); #define signal_catch 1 #define signal_release 2 #define signal_end 3 int t; サブルーチン sub follow_line()// 右側トレース { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<t) { if(SENSOR_2<black) { circling_right; } else if(SENSOR_2<gray_black) { turn_right; } else if(SENSOR_2<gray) { go_ahead; } else if(SENSOR_2<gray_white) { turn_left; } else if(SENSOR_2<white) { circling_left; } } Off(OUT_AC); Wait(100); } メインプログラム 1つ目のピンポン球 task main() { ClearMessage(); //白なら直進 ※1 while(SENSOR_2>gray) {OnFwd(OUT_AC);} Off(OUT_AC); Wait(100); //黒なら直進 while(SENSOR_2<gray) {OnFwd(OUT_AC);} Off(OUT_AC); Wait(100); while(SENSOR_2>gray) {OnFwd(OUT_AC);} Off(OUT_AC); Wait(100); while(SENSOR_2<gray) {OnFwd(OUT_AC);} Off(OUT_AC); Wait(100); while(SENSOR_2>gray) {OnFwd(OUT_AC);} Off(OUT_AC); Wait(100);//K'付近に到達 t=90;follow_line();//※2 Wait(100); SendMessage(signal_catch);// L'でつかむ命令を送る�� ClearMessage(); until(Message()==signal_end);//アームの動作が終わるまで待機 //90°左旋回�� circling_left; Wait(102); Off(OUT_AC); // ボールをリリパックに入れる命令を送る�� SendMessage(signal_release); ClearMessage(); until(Message()==signal_end); 2つ目のピンポン球 //後ろに下がる OnRev(OUT_AC); Wait(30); Off(OUT_AC); //90°左旋回�� circling_left; Wait(102); Off(OUT_AC); //白なら直進 ※1 while(SENSOR_2>gray) {OnFwd(OUT_AC);} Off(OUT_AC); Wait(100); //黒なら直進 while(SENSOR_2<gray) {OnFwd(OUT_AC);} Off(OUT_AC); Wait(100); while(SENSOR_2>gray) {OnFwd(OUT_AC);} Off(OUT_AC); Wait(100); while(SENSOR_2<gray) {OnFwd(OUT_AC);} Off(OUT_AC); Wait(100); while(SENSOR_2>gray) {OnFwd(OUT_AC);} Off(OUT_AC); Wait(100); turn_right;//右に回転 Wait(100); //白なら直進 ※1 while(SENSOR_2>gray) {OnFwd(OUT_AC);} Off(OUT_AC); Wait(100); //黒なら直進 while(SENSOR_2<gray) {OnFwd(OUT_AC);} Off(OUT_AC); Wait(100); t=150;follow_line();//※2 SendMessage(signal_catch);// Lでつかむ命令を送る�� ClearMessage() ; until(Message()==signal_end); 3,4つ目のピンポン球 //90°左旋回�� circling_left; Wait(102); Off(OUT_AC); //後ろに下がる�� OnRev(OUT_AC); Wait(23); Off(OUT_AC); SendMessage(signal_catch);// リリパックでつかむ命令1�� ClearMessage(); until(Message()==signal_end); Wait(100); SendMessage(signal_catch);// リリパックでつかむ命令2 ClearMessage(); until(Message()==signal_end); 箱に入れるまで //90°左旋回�� circling_left; Wait(102); Off(OUT_AC); //後ろに下がる�� OnRev(OUT_AC); Wait(23); Off(OUT_AC); SendMessage(signal_catch);// リリパックでつかむ命令1�� ClearMessage(); until(Message()==signal_end); Wait(100); SendMessage(signal_catch);// リリパックでつかむ命令2 ClearMessage(); until(Message()==signal_end); *まとめ [#vf9a1f49] リハーサルの時点では3つまたは4ついれることができたが、本番はうまく行かなかった。その点は悔しいが最後までやりきれたことはうれしい。