2012b/Member
目次

課題1

課題1コース図

※2012年度後期/課題ページの図を使いました。

図のようなコースを各自で作成した上で、次のような動作をするロボットを作成せよ。

  1. スタート地点から出発し、スタート地点外のすぐ近くに置かれたピンポン玉をつかむ。
  2. ピンポン玉をつかんだら速やかにスタート地点の境界の黒線に戻り、そこから黒線に沿って動いてゴール地点を目指す。ただしT字路では、直進、右折、左折を正しく判断させること。また、曲線部中央の障害物に接触しないようにすること。
  3. ゴール地点に到達したら、ゴールエリア外からピンポン玉をゴールにシュートする。 ただし、どうしてもエリア外からのシュートが難しい場合は、エリア内からシュートした後、エリアから出てもよい。

メンバー

ロボットの説明

ピンポン玉をつかむ機構1
ピンポン玉をつかむ機構2

ピンポン玉をつかむ機構。 モーターの動力をゴムで歯車に伝えそれに応じて動く、という簡単な機構。

次は車体の後ろにある補助輪。 滑らかに曲がるためには地味に重要なパーツ。

補助輪

パッと見てどうなっているかわからないので
これを、

補助輪解説

ブロックの上の部分が360度回転するので平面内なら自由自在に移動できる。

最後に横からの写真

横からの写真

両側から本体を固定し、安定度を増した。

プログラムの説明

本番で使ったプログラム

#define THRESHOLD 42    //しきい値、調節してこの値になった
#define HIPOWER 7     //直線用のパワー
#define LOWPOWER 2       //カーブ用のパワー
#define set_power_H SetPower(OUT_AC,HIPOWER);    //直線用のパワーをモーターにセット
#define set_power_L SetPower(OUT_AC,LOWPOWER);   //カーブ用のパワーをセット
#define go_forward set_power_H; OnFwd(OUT_AC);                 //直進
#define turn_left1 set_power_L; OnRev(OUT_A); OnFwd(OUT_C);    //左旋回
#define turn_left0 set_power_L; Off(OUT_A); OnFwd(OUT_C);      //左折
#define turn_right0 set_power_L; OnFwd(OUT_A); Off(OUT_C);     //右折
#define turn_right1 set_power_L; OnFwd(OUT_A); OnRev(OUT_C);   //右旋回
#define STEP 1        //1回の判断で動作させる時間(これは1/100秒)
#define n0MAX 15      //通常のカーブとして許容できる繰り返しの最大値
#define n1AMAX 2      //コース前半の急なカーブと判断される回数
#define n1BMAX 4      //コース後半の急なカーブと判断される回数 
#define short_break Off(OUT_AC); Wait(100);                    //小休止
#define CROSS_TIME 20                                          //交差点を渡る時間
               /* 交差点を渡る */
#define cross_line set_power_L; OnFwd(OUT_AC); Wait(CROSS_TIME); short_break;
               /* ピンポン玉をつかむ */
#define catch_ball set_power_L; Wait(300); OnRev(OUT_B);\
Wait(50); Off(OUT_B);OnFwd(OUT_AC); Wait(100); OnFwd(OUT_B);\
Wait(50); Off(OUT_B); OnRev(OUT_AC); Wait(20); Off(OUT_AC); Wait(100);
               /* ピンポン玉をゴールにねじ込む */
#define kick_ball OnFwd(OUT_AC); OnRev(OUT_B);\
Wait(150); Off(OUT_B); OnRev(OUT_AC); Wait(150); Off(OUT_AC);
#define first_time 400                                        //交差点を認識する時間
task main()
   {
   SetSensor(SENSOR_2, SENSOR_LIGHT);  //光センサーをセット
   int n0nline=0;                      //続けて黒になった回数(カウンタ)
   int n1nline=0;                      //急カーブの回数
   catch_ball;
       while(n1nline < n1AMAX)         //急なカーブが2回あるまで{}の中を繰り返す(n1AMAXは2なので)
       {
	    while(n0nline < n0MAX)   //急なカーブがあるまで繰り返す
           {
	    if (SENSOR_2 < THRESHOLD -4){ turn_left1; n0nline++;} //より暗いとき左旋回してカウンタを1増やす
	    else if (SENSOR_2 < THRESHOLD -2){ turn_left0; }      //暗いとき左折
	    else if (SENSOR_2 < THRESHOLD +2){ go_forward; }      //中間のとき直進
	    else if (SENSOR_2 < THRESHOLD +4){ turn_right0; }     //明るいとき右折
	    else { turn_right1; }                                 //より明るいとき右旋回
	    Wait(STEP);
           }
       PlaySound(SOUND_UP);  //急なカーブの度に高い音を1回鳴らす
	n0nline=0;            //カウンタをリセット
	n1nline++;            //急なカーブの数をカウント
       }
   n1nline=0;
   ClearTimer(0);                        //タイマーをリセットして開始
       while(FastTimer(0) <= first_time) //交差点を渡りきるまで繰り返す
       {
	    while(n0nline < n0MAX)
           {
	    if (SENSOR_2 < THRESHOLD -4){ turn_left1; n0nline++; }
           else if (SENSOR_2 < THRESHOLD -2){ turn_left0; }
	    else if (SENSOR_2 < THRESHOLD +2){ go_forward; }
	    else if (SENSOR_2 < THRESHOLD +4){ turn_right0; }
	    else { turn_right1; }
	    Wait(STEP);
	    }
       short_break;          //小休止
	turn_right1; Wait(n0MAX*STEP); //進行方向修正
	cross_line;                    //交差点を渡る
	n0nline=0;                     //カウンタをリセット
       }
   n0nline=0;
       while((FastTimer(0) > first_time)&&(n1nline <n1BMAX)) //急なカーブが4回あるまで(最後のT字路を含む)繰り返す
       {
	    while(n0nline < n0MAX)
           {
	    if (SENSOR_2 < THRESHOLD -4){ turn_left1; n0nline++; }
	    else if (SENSOR_2 < THRESHOLD -2){ turn_left0; }
	    else if (SENSOR_2 < THRESHOLD +2){ go_forward; }
	    else if (SENSOR_2 < THRESHOLD +4){ turn_right0; }
	    else { turn_right1; }
	    Wait(STEP);
	    }
	 n1nline++;
	 n0nline=0;
	 PlaySound(SOUND_DOWN);  //急なカーブがある度に低い音を鳴らす
       }
   short_break;
   turn_right1; Wait(n0MAX*STEP); Off(OUT_AC); //方向転換
   kick_ball;                 //シュート
   }

まとめ

工夫した点

反省点

感想


添付ファイル: filehojorin_kaisetu.png 486件 [詳細] filehojorin.jpeg 475件 [詳細] filezentai.jpeg 514件 [詳細] fileyoko.jpeg 359件 [詳細] filehasami2.jpeg 579件 [詳細] filehasami1.jpeg 499件 [詳細] file2012b-mission1.png 455件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-12-21 (金) 17:26:23