目次 #contents *メンバー [#kfc80a19] 池上君 伊藤君 アン君 希(自分) *課題の説明 [#z44c92ec] 詳しい説明は [[2014a/Mission2]] *作戦 [#c37552b1] #ref(作戦.png) メイン機はオレンジの矢印で示しています。 サブ機は緑の矢印で示しています。 サブ機はコップA、B、Cを横一直線に並べます。 *ロボット本体 [#ydf82c26] **メイン機 [#fd9810c1] ***写真 [#p3360bd4] #ref(メイン機.jpeg) ***プログラム [#ed8f188f] ****定義 [#oe028242] #define set_power_L SetPower(OUT_A,1);SetPower(OUT_C,1); // 遅い速度 #define THRESHOLD 45 // しきい値 #define go_forward OnFwd(OUT_AC); // 前進 #define turn_right0 OnFwd(OUT_A);OnRev(OUT_C); // 右旋回 #define turn_right1 OnFwd(OUT_A);Off(OUT_C); // 右回転 #define turn_left1 Off(OUT_A);OnFwd(OUT_C); // 左回転 #define turn_left0 OnRev(OUT_A);OnFwd(OUT_C); // 左旋回 #define STEP 1 // 動作をもう一回 #define U_turn OnFwd(OUT_A);OnRev(OUT_C);Wait(180);Off(OUT_AC); // Uターン #define cup_up OnFwd(OUT_B);Wait(130);Off(OUT_B); // コップを持ち上げる #define cup_down OnRev(OUT_B);Wait(130);Off(OUT_B); // コップを下す ****変数 [#s652e509] int number=0; // グローバル変数。コップの色に応じて1〜3の値をとり、点Aからのパターン分岐を決める ****ライントレース [#ja59e2ce] sub line() { if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){ go_forward; Wait(STEP); // センサーが2つともしきい値よりも大きい値をとった時、前進する }else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){ turn_right1; Wait(STEP); // センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値をとった時、右回転をする }else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){ turn_left1; Wait(STEP); // センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転をする }else{go_forward; Wait(STEP); // センサーの値が条件を満たさない時は前進 } } ****紙コップを掴んだ後の動作 [#m312a003] sub carry_cup(){ if(number==1){ while((SENSOR_2<47)&&(SENSOR_2>35)){ if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){ go_forward; Wait(STEP); // センサーが2つともしきい値よりも大きい値をとった時、前進する }else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){ turn_right1; Wait(STEP); // センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値、右回転する }else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){ turn_left1; Wait(STEP); // センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転する }else{ go_forward; Wait(STEP); // センサーの値が条件を満たさない時は前進 } } go_forward; Wait(10); // 紙コップに完全に接触するまで前進 Off(OUT_AC); cup_down; U_turn; while((SENSOR_2<47)&&(SENSOR_2>35)){ // 紙コップBかCを認識するまで前進させる if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){ go_forward; Wait(STEP); // センサーが2つともしきい値よりも大きい値をとった時、前進する }else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){ turn_right1; Wait(STEP); // センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値をとった時、右回転をする }else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){ turn_left1; Wait(STEP); // センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転する }else{ go_forward; Wait(STEP); // センサーの値がそれ以外の時は前進 } } }else if(number==2){ while((SENSOR_1>THRESHOLD)||(SENSOR_3>THRESHOLD)){ // 交差点を認識するまで前進させる if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){ go_forward; Wait(STEP); // センサーが2つともしきい値よりも大きい値をとった時、前進する }else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){ turn_right1; Wait(STEP); // センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値をとった時、右回転をする }else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){ turn_left1; Wait(STEP); // センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転する }else{ go_forward; Wait(STEP); // センサーの値が条件を満たさない時は前進 } } turn_right0; Wait(75); // コップ2の逆方向を向かせる go_forward; Wait(10); U_turn; // 交差点でそのまま左折するとコップ2を押してしまう為 while((SENSOR_2<47)&&(SENSOR_2>35)){ // 紙コップ2を認識するまで前進させる if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){ go_forward; Wait(STEP); // センサーが2つともしきい値よりも大きい値をとった時、前進する }else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){ turn_right1; Wait(STEP); // センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値をとった時、右回転をする }else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){ turn_left1; Wait(STEP); // センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転する }else{ go_forward; Wait(STEP); // センサーの値が条件を満たさない時は前進 } } go_forward; Wait(20); // 紙コップに完全に接触するまで前進 Off(OUT_AC); cup_down; OnRev(OUT_AC); Wait(130); while((SENSOR_1>THRESHOLD)||(SENSOR_3>THRESHOLD)){ // 交差点を認識するまで前進させる if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){ go_forward; Wait(STEP); // センサーが2つともしきい値よりも大きい値をとった時、前進する }else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){ turn_right1; Wait(STEP); // センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値をとった時、右回転をする }else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){ turn_left1; Wait(STEP); // センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転する }else{ go_forward; Wait(STEP); // センサーの値が条件を満たさない時は前進 } } turn_left0; Wait(75); // 軸にそって紙コップBかCに向かせる while((SENSOR_2>35)&&(SENSOR_2<47)){ // 紙コップを認識するまで if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){ go_forward; Wait(STEP); // センサーが2つともしきい値よりも大きい値をとった時、前進する }else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){ turn_right1; Wait(STEP); // センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値をとった時、右回転をする }else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){ turn_left1; Wait(STEP); // センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転する }else{ go_forward; Wait(STEP); // センサーの値が条件を満たさない時は前進 } } }else{ while((SENSOR_1>THRESHOLD)||(SENSOR_3)>THRESHOLD){ // 交差点を認識するまで前進させる if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){ go_forward; Wait(STEP); // センサーが2つともしきい値よりも大きい値をとった時、前進する }else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){ turn_right1; Wait(STEP); // センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値をとった時、右回転をする }else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){ turn_left1; Wait(STEP); // センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転する }else{ go_forward; Wait(STEP); // センサーの値が条件を満たさない時は前進 } } go_forward; Wait(10); while((SENSOR_1>THRESHOLD)||(SENSOR_3)>THRESHOLD){ // 交差点を認識するまで前進させる go_forward; } turn_right0; Wait(75); while((SENSOR_2>35)&&(SENSOR_2<47)){ // 紙コップを認識するまで go_forward; } go_forward; Wait(25); Off(OUT_AC); cup_down; OnRev(OUT_AC); Wait(110); while((SENSOR_1>THRESHOLD)||(SENSOR_3)>THRESHOLD){ // 交差点を認識するまで前進させる OnRev(OUT_AC); } turn_right0; Wait(75); } while((SENSOR_2<47)&&(SENSOR_2>35)){ // 紙コップを認識するまで if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){ go_forward; Wait(STEP); // センサーが2つともしきい値よりも大きい値をとった時、前進する }else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){ turn_right1; Wait(STEP); // センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値をとった時、右回転をする }else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){ turn_left1; Wait(STEP); // センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転する }else{ go_forward; Wait(STEP); // センサーの値が条件を満たさない時は前進 } } } ****開始直後の紙コップAを掴み振り向くまでの動き [#x11d3542] void start_dash(){ go_forward; Wait(120); // スタート地点から出る為の動き while((SENSOR_1>THRESHOLD)||(SENSOR_3)>THRESHOLD){ go_forward; // 交差点を認識するまで前進 } turn_right0; Wait(75); while((SENSOR_2<47)&&(SENSOR_2>35)){ // 紙コップを認識するまで if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){ go_forward; Wait(STEP); // センサーが2つともしきい値よりも大きい値をとった時、前進する }else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){ turn_right1; Wait(STEP); // センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値をとった時、右回転をする }else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){ turn_left1; Wait(STEP); // センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転する }else{ go_forward; Wait(STEP); // センサーの値が条件を満たさない時は前進 } } go_forward; Wait(100); // コップに接触するまで Off(OUT_AC); if(SENSOR_2>47){ number=1; }else if((SENSOR_2<47)&&(SENSOR_2>37)){ number=2; }else{ number=3; } // 紙コップの色を感知したセンサーの値に応じてnumberに値を入れる cup_up; U_turn; } ****全体のプログラム [#w37e466e] task main(){ SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); set_power_L; int cross=0; // 交差点通過回数のカウンタ start_dash(); // コップAを掴む carry_cup(); go_forward; Wait(50); // コップBに接触するまで Off(OUT_AC); if(SENSOR_2>47){ number=1; }else if((SENSOR_2>35)&&(SENSOR_2<47)){ number=2; }else{ number=3; } // センサーの値に応じてnumberに値を入れる cup_up; U_turn; ClearTimer(0); // タイマー設置 while(Timer(0)<40){ if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){ go_forward; Wait(STEP); // センサーが2つともしきい値よりも大きい値をとった時、前進する }else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){ turn_right1; Wait(STEP); // センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値をとった時、右回転をする }else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){ turn_left1; Wait(STEP); // センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転する }else{ go_forward; Wait(STEP); // センサーの値が条件を満たさない時は前進 } } carry_cup(); go_forward; Wait(50); // コップCに接触するまで Off(OUT_AC); if(SENSOR_2>47){ number=1; }else if((SENSOR_2>35)&&(SENSOR_2<47)){ number=2; }else{ number=3; } // センサーの値に応じてnumberに値を入れる cup_up; U_turn; ClearTimer(0); while(Timer(0)<20){ if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){ go_forward; Wait(STEP); // センサーが2つともしきい値よりも大きい値をとった時、前進する }else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){ turn_right1; Wait(STEP); // センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値をとった時、右回転をする }else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){ turn_left1; Wait(STEP); // センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転する }else{ go_forward; Wait(STEP); // センサーの値が条件を満たさない時は前進 } } carry_cup(); Off(OUT_AC); } **サブ機 [#g1e6b118] このサブ機は紙コップを任意の位置まで移動させる車です。 任意の位置まで移動させた後、メイン機がコップを回収します。 ***写真 [#e07a2332] 本体 #ref(IMG_20140801_182103.jpg) アーム部 #ref(IMG_20140801_174708.jpg) このアームは動きません。 紙コップを移動させるための装置です。 ***プログラム [#w173ad17] task main() { OnFwd(OUT_AC); Wait(540); OnFwd(OUT_C);OnRev(OUT_A);Wait(150);//左旋回 OnFwd(OUT_AC); Wait(150); OnRev(OUT_AC); Wait(100); OnFwd(OUT_C);OnRev(OUT_A);Wait(160);//左旋回 OnFwd(OUT_AC); Wait(155); OnFwd(OUT_A);OnRev(OUT_C);Wait(150);//右旋回 OnFwd(OUT_AC); Wait(350); OnFwd(OUT_A);OnRev(OUT_C);Wait(270);//1回転 OnFwd(OUT_AC); Wait(90); OnRev(OUT_AC); Wait(100); Off(OUT_AC); } 即席で作ったので定義等は使はず、最も単純な構造で作りました。 *感想 [#qcb1d117] LEGOは小さいころから親しみがあり、得意だと思っていたのですが、コンピュータを使ってのLEGO作りは初めてでかなり苦戦しました。また、プログラミングも初めてで、解らないこともありましたが、この授業を通して学べたことがたくさんあり、とても有意義な時間でした。自分は工学部なので、今回の授業で得たことは今後必ず生きてくると思うので、大事にしていきたいです。