[[2010b]] *第三回課題〜ライントレースと砲撃〜 [#u30e76b5] **課題概要 [#g5b5abab] 1.光センサーを一つだけ用いて、ライントレースして逃げつづける。その際、ロボット後部にはもう一つセンサーをつけ、常に光を発するようにする。 2.前者のロボット後部の光センサーから発せられる光を検出し逃げるロボットを追いかけて、届くところまで着たら弾代わりの黄色いホイールを逃げるロボットめがけて投げつける。 **メンバー紹介 [#e3e6b5a6] -こっちの松本 -貴トラマンヒロ **ポイント [#v69213e8] -ロボットは、移動以外に「弾送り」、「射出」にモーターを使うので、移動にはモーターは1つしか使えないので、ディファレンシャルギアを用いることで、モーターの回転方向を変えて、ロボット左右のタイヤを交互に前進させることで、進む。 -逃げるロボットから発せられる光を検出するには、光の最大値を求めるようなプログラムを入れる。ただし、この時まわりの光は具体的な関数として表すことはできないので、2つの数値を比較することで、最大値を決定する。 つまり、最初に検出した光の強さを仮の最大値とし、ロボットを回転させる、そこで、もし次に検出された光の値が仮の最大値よりも大きかった場合には、最初に決定した仮の最大値を次に出てきた光の強さの値に入れ替える。これを一回転やることで、最大値を決定する。 **ロボット紹介 [#o09cabc8] ***マシン全体 [#f93cd9e6] #ref(DSCN0470.JPG) #ref(DSCN0471.JPG) #ref(DSCN0456.JPG) -色々搭載したらこんなサイズになった。どのチームよりもでかい自信がある。 -何よりカッコよい!! ***駆動部 [#r3f1e461] #ref(DSCN0466.JPG) ***弾送り機構 [#bc80ddbe] #ref(DSCN0459.JPG) -箱の間にシャフトを噛ませた。 #ref(DSCN0467.JPG) ***砲撃機構 [#lfe6a3dc] #ref(DSCN0465.JPG) -光センサーで反応して発射できるようにした。 -打ちだす機構はモーターにプレートを取り付け、プロペラみたいにした。 **コース紹介 [#eea4ff0f] #ref(DSCN0450.JPG) -課題2でお馴染みのこれ!! **プログラミング紹介 [#oa6e8a27] -逃げる側のプログラミング(ライントレース) #define right OnFwd(OUT_A);Wait(search_time);Off(OUT_A); //右に曲がる動きを定義 #define left OnRev(OUT_A);Wait(search_time);Off(OUT_A); //左に曲がる動きを定義 #define search_time 2 //左右に首を振る時間を0.02秒と定義 #define THRESHOLD 45 //閾値を45と定義 task_main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーと宣言 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー2を光センサーと宣言 while(true) { if(SENSOR_1<THRESHOLD) //センサー1の値が閾値より小さい、すなわち黒線上の場合…↓ { right; //右に曲がる until(SNESOR_1>THRESHOLD); //センサー1が閾値より大きい、すなわち黒線外になったら…↓ left; //左に曲がる } } //これを繰り返す。 } -追いかける側のプログラミング(追跡なしver) int Light_max; //Light_maxという変数を定義 sub tamaokuri_tobasu() //弾を装填して飛ばすサブルーチン { SetPower(OUT_B,1); //モーターBの馬力を1(最小)に設定 SetPower(OUT_C,7); //モーターCの馬力を7(最大)に設定 while(true) { if(SENSOR_1 == Light_max) //センサー1がLight_maxの値をとったとき { OnFwd(OUT_B); //モーターB(ベルトコンベアー)を回転して弾を装填 until(SENSOR_3 > 38); //センサー3が弾に反応したら…↓ Off(OUT_B); //モーターBを停止(弾装填停止) } else //センサー1がLight_maxではないとき { Off(OUT_B); //ベルトコンベアーを1秒間停止 Wait(100); } if(SENSOR_3 < 38) //センサー3が閾値より小さい値の時(弾がない時) { Off(OUT_C); //モーターCを停止(打ち出しアームを停止) } else //センサー3が閾値より大きい値の時(弾があるとき) { OnRev(OUT_C); //モーターC(打ち出しアーム)を半回転して弾を打ち出し Wait(11); Off(OUT_C); //そのまま停止 } } //以上を繰り返す } task main () { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーと定義(閾値35) SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー2を光センサーと定義(閾値38) ClearTimer(0); //タイマをリセット Light_max = 0; //変数をリセット while(true) { while(Timer(0)<=48) //4.8秒間whileの中を実行する { OnFwd(OUT_A); //右回りをして各部分の光量を計測 if(SENSOR_1 > Light_max) //もしセンサー1よりLight_maxが大きかったら…↓ { Light_max = SENSOR_1; //その値をセンサー1とする } } OnFwd(OUT_A); until((SENSOR_1==Light_max)); //センサー1がLight_maxの値になる場所まで右回転する Off(OUT_A); tamaokuri_tobasu(); } //以上を繰り返す。 } -追いかける側のプログラム(追跡あり) sub tamaokuri_tobasu() { SetPower(OUT_B,1); SetPower(OUT_C,7); SetSensor(SENSOR_1,SENSOR_LIGHT); //閾値35 SetSensor(SENSOR_3,SENSOR_LIGHT); //閾値38 while(true) { if(SENSOR_1 ==Light_max) { OnFwd(OUT_B); Wait(100); Off(OUT_B); OnRev(OUT_C); Wait(11); Off(OUT_C); } else { Off(OUT_B+OUT_C); Wait(100); } } } task main() { int Light_max=0; //光の最大値用の変数 ClearTimer(0); //Timer(0)をリセット while(Timer(0)<=300) { if(SENSOR_1<THRESHOLD){ //最初にライン上(黒)の場合 OnFwd(OUT_C);Wait(15); //左に逸らす if(SENSOR_1>THRESHOLD) { OnRev(OUT_C);Wait(15); //右に逸らす } } if(SENSOR_3>60) { Light_max=SENSOR_3; // Light_maxに観測値を代入 if(SENSOR_3>Light_max) { Light_max=SENSOR_3; // Light_maxに観測値lを代入(Light_maxを更新) } } } if(SENSOR_3>=(Light_max)){ //SENSOR_3がLight_max(相手の光)を感知したら…↓ repeat(16){ //5秒間追跡する OnFwd(OUT_C);Wait(15); OnRev(OUT_C);Wait(15); } shoot(); //弾を打つ tamaokuri_tobasu(); //弾を打つ } } Off(OUT_C); } **感想 [#s055577b] **コメントをお願いします [#ad8dc4f7] - まだ途中みたいなので、またあとで見ます -- [[FI]] &new{2011-02-08 (火) 01:31:17}; #comment