目次 #contents **メンバー [#db3ff25c] ・ryu-abe(私) ・kowhich(課題1でのメンバー) ・kiyomizu(課題2からのメンバー) ・suiden(課題2からのメンバー) **課題の説明 [#l34c839f] 今回は課題1で使ったコースを2枚を使用し、1〜3まで番号づけられた紙コップ2組を2枚のコートにそれぞれ同じ所定の位置に配置する。スタート側のコースの紙コップは固定、もう片方のコースの紙コップをスタート側の紙コップに番号ごとに入れていく。 **ロボットの紹介 [#n03090c3] 今回のロボを作る際、NXT本体を他の部分が完成した後に取りつける事としsuidenが移動部分、kiyomizuが紙コップを取る機構を作った。suidenは移動部分はこれまでのロボとほぼ同じに組み立て前方にコースをライントレースするために下向きの光センサーや紙コップを見分けるための前方方向を向いている光センサーを取り付けた。 一方kiyomizuは歯車を使う機構を作り上げた。この機構はモーターがある方向に動けば紙コップを挟む部分が開き、逆方向に動けば閉じるという動きを滑らかに行う良い機構であった。 しかし、NXT本体を全く考慮していなかった事によってロボに取り付ける部分が見つからず最終的にはロボの上の部分に取り付けたが、そうすると重心が高くなりライントレースや他の動作において早く直進以外の動作を行うとロボが倒れてしまうという問題が発生した。これは本番が延長になったことによりsuidenが結果的に軽量で重心が高くなりすぎないように配置するなどのロボの改良を行った。#ref(mission2) **プログラム [#jdcddda3] 定義の部分 #define THRESHOLD 50 #define turn_left0 OnFwd(OUT_B,30); #define turn_left1 OnFwd(OUT_B,30);OnFwd(OUT_C,-30); #define turn_right0 OnFwd(OUT_C,30); #define turn_right1 OnFwd(OUT_C,30);OnFwd(OUT_B,-30); #define STEP 1 #define nMAX 250 #define short_break Off(OUT_BC);Wait(1000); #define cross_line;OnFwd(OUT_BC,40);Wait(300);short_break;PlaySound(SOUND_UP); サブルーチン sub catch() { OnFwd(OUT_A,-20);Wait(1000); OnFwd(OUT_A,-50);Wait(400); Off(OUT_A); } sub release() { OnFwd(OUT_A,20);Wait(1000); OnFwd(OUT_A,50);Wait(100); Off(OUT_A); } 以下が動作のプログラミング task main() { SetSensorLight(S2); SetSensorLight(S3); int nOnline = 0; int nPoint = 0; OnFwdSync(OUT_BC,60,0);Wait(2000);Off(OUT_BC); OnFwdSync(OUT_BC,75,-100);Wait(450);Off(OUT_BC);Wait(1000); //最初のこの一連の動きはkiyomizuが作っていった プログラミングと同様であり、最初の紙コップを確実に取るため OnFwdSync(OUT_BC,60,0);Wait(1200);Off(OUT_BC); プログラミングと同様であり、最初の紙コップを確実に取るため OnFwdSync(OUT_BC,60,0);Wait(1200);Off(OUT_BC); catch(); OnFwdSync(OUT_BC,60,0);Wait(700); OnFwdSync(OUT_BC,60,-100);Wait(500);Off(OUT_BC);Wait(1000); long t0 = CurrentTick(); //時間を計る while (CurrentTick() - t0 < 3000) { //3秒以内ならライントレースを行うための調整を実行 if (SENSOR_3 > THRESHOLD +2) { OnFwd(OUT_B,40); } else { Off(OUT_BC); } Wait(STEP); } while (nPoint <= 1) { //ライントレース実行中 また交差点検知も行っている while (nOnline < nMAX){ if (SENSOR_3 < THRESHOLD -10) { turn_right1; nOnline++; } else { if (SENSOR_3 < THRESHOLD -5) { turn_right0; } else if (SENSOR_3 < THRESHOLD +2) { OnFwdSync(OUT_BC,30,0); } else if (SENSOR_3 < THRESHOLD +8) { turn_left0; } else { turn_left1; } nOnline=0; } Wait(STEP); } short_break; turn_left1; Wait(nMAX*STEP); cross_line; nPoint++; nOnline=0; } while (nPoint == 2) { OnFwdSync(OUT_BC,30,0);Wait(1500);Off(OUT_BC);Wait(1000);Wait(1000); OnFwdSync(OUT_BC,-30,0);Wait(500);Off(OUT_BC); release(); //1つ目の紙コップを入れる OnFwd(OUT_C,-30);Wait(200); OnFwdSync(OUT_BC,-60,0);Wait(900);Off(OUT_BC); catch(); OnFwdSync(OUT_BC,75,-100);Wait(900);Off(OUT_BC); nPoint++; } long t1 = CurrentTick(); t1に開始から今までの時間を保存 while (CurrentTick() - t1 < 3000) { //ライントレースを行うための調整中 if (SENSOR_3 > THRESHOLD +2) { OnFwd(OUT_C,40); } else { Off(OUT_BC); } Wait(STEP); } while (nPoint <= 6) { //再びライントレース開始 while (nOnline < nMAX + 50){ if (SENSOR_3 < THRESHOLD -10) { turn_left1; nOnline++; } else { if (SENSOR_3 < THRESHOLD -5) { turn_left0; } else if (SENSOR_3 < THRESHOLD +2) { OnFwdSync(OUT_BC,30,0); } else if (SENSOR_3 < THRESHOLD +8) { turn_right0; } else { turn_right1; } nOnline=0; } Wait(STEP); } short_break; turn_right1; Wait(nMAX*STEP); cross_line; nPoint++; nOnline=0; } while (nPoint == 7) { OnFwdSync(OUT_BC,75,100);Wait(300);Off(OUT_BC);Wait(1000); OnFwdSync(OUT_BC,-60,0);Wait(900);Off(OUT_BC); OnFwdSync(OUT_BC,75,100);Wait(200);Off(OUT_BC);Wait(1000); release(); //ここで2つ目の紙コップを掴む。 OnFwdSync(OUT_BC,60,0);Wait(1000);Off(OUT_BC);Wait(1000); catch(); nPoint++; OnFwdSync(OUT_BC,60,0);Wait(500);Off(OUT_BC);Wait(1000); } } Wait(STEP); } long t2 = CurrentTick(); //t2に現在の時間を保存 while (CurrentTick() - t2 < 5000) { if (SENSOR_3 > THRESHOLD +2) { //ライントレース開始のための調整 OnFwd(OUT_B,-20);OnFwd(OUT_C,50); } else { Off(OUT_BC); } Wait(STEP); } while (nPoint == 8) { //ライントレース開始 while (nOnline < nMAX){ if (SENSOR_3 < THRESHOLD -10) { turn_left1; nOnline++; } else { if (SENSOR_3 < THRESHOLD -5) { turn_left0; } else if (SENSOR_3 < THRESHOLD +2) { OnFwdSync(OUT_BC,30,0); } else if (SENSOR_3 < THRESHOLD +8) { turn_right0; } else { turn_right1; } nOnline=0; } Wait(STEP); } short_break; turn_right1; Wait(nMAX*STEP + 600); cross_line; OnFwd(OUT_BC,30);Wait(200); nPoint++; nOnline=0; } long t3 = CurrentTick(); //t3に開始から今までの時間を保存 while (CurrentTick() - t3 < 18000) { //ライントレース中 if (SENSOR_3 < THRESHOLD -10) { turn_right1; } else { if (SENSOR_3 < THRESHOLD -5) { turn_right0; } else if (SENSOR_3 < THRESHOLD +2) { OnFwd(OUT_BC,30); } else if (SENSOR_3 < THRESHOLD +8) { turn_left0; } else { turn_left1; } Wait(STEP); } } OnFwdSync(OUT_BC,75,-100);Wait(1000);Off(OUT_BC);Wait(1000); while (nPoint == 9) { while (nOnline < nMAX){ if (SENSOR_3 < THRESHOLD -10) { turn_left1; nOnline++; } else { if (SENSOR_3 < THRESHOLD -5) { turn_left0; } else if (SENSOR_3 < THRESHOLD +2) { OnFwdSync(OUT_BC,30,0); } else if (SENSOR_3 < THRESHOLD +8) { turn_right0; } else { turn_right1; } nOnline=0; } Wait(STEP); } short_break; turn_right1; Wait(nMAX*STEP); cross_line; nPoint++; nOnline=0; } while (nPoint == 10) { OnFwdSync(OUT_BC,30,0);Wait(800);Off(OUT_BC);Wait(1000); OnFwdSync(OUT_BC,-30,0);Wait(600);Off(OUT_BC);Wait(1000); release(); //ここで2つ目の紙コップを置く nPoint++; } while (nPoint == 11) { OnFwdSync(OUT_BC,-60,0);Wait(1200);Off(OUT_BC); OnFwdSync(OUT_BC,75,-100);Wait(500);Off(OUT_BC);Wait(1000); //最後はkiyomizu方式で3つ目の紙コップを取りに行く OnFwdSync(OUT_BC,60,0);Wait(1800);Off(OUT_BC); catch(); nPoint++; } while (nPoint == 12) { OnFwdSync(OUT_BC,75,-100);Wait(1000);Off(OUT_BC);Wait(1000); OnFwdSync(OUT_BC,60,0);Wait(2500);Off(OUT_BC); OnFwdSync(OUT_BC,-30,0);Wait(600);Off(OUT_BC);Wait(1000); release(); //3つ目の紙コップを置く nPoint++; } } **感想・反省 [#j137b16d] 感想としては課題1では別行動であったメンバーとも一緒に出来て課題1とはまた違った準備期間だったと思う。私達のグループでは当初、プログラミングをkowhichが主に担当し、kiyomizuとsuidenがロボの担当、私がサポートという形で制作していたが後半になるとkowhichのプログラミングが上手く作動しない、またNXT本体を後回しにほかの部分からロボを作る形にしてしまい、NXT本体の配置位置に困る、ライントレーズが作動しないなど、プログラミングとロボ制作を切り離して進んでいったこと弊害が出てしまった。そして途中からライントレースが上手くいかなくなると言うトラブルも発生し、本番が延長される際にロボをコンパクトにし直した。その後プログラミングはsuidenのライントレースに基づいたもの、kiyomizuのライントレースが上手くいかなかったので時間方式の二つの方法を模索し、最終的にはsuidenの方法を採用した。反省点としては紙コップの検知をほぼ捨て、どの紙コップがどの配置しても同じ順序で動作する事や、紙コップを入れる時の精度を運頼みで行ってしまった事であった。しかし、紙コップを持ち上げたり、動いたり、おろしたりする動作を追求した結果であり、その部分は上手くいったので良かったと思っている。