目次

課題2

コース

図のようなコースを作り、次の経路を黒い線に沿って進むロボットを作る。 Bスタート → R直進 → P右折 → Q直進 → (ピンポン玉をキャッチ) → Q直進 → R右折 → P直進 → S右折 → Cへシュート

ロボットの説明

全体図

今回のロボットは光センサーが車軸から少しずれるように調整した。 また、ボールをキャッチする際には超音波センサーを用いてボールのある位置を探した。

アーム

アームはボールの上からかぶせるように動かして、車体とアームの間にボールを挟むようにして固定する。

駆動部

駆動部には、12枚のギアと24枚のギアを用いてより少ない力で動くようにした。

プログラム

#define power 30  //モーターのパワー
#define nMax 1500  //この数値よりも黒と判断される回数が大きいと交差点と判断する
#define LET_TIME 850  //交差点を直進するときにロボットを引き戻す際に使う時間
#define CATCH_TIME 500  //ボールを取るためにアームを動かす時間
#define SHOOT_TIME 500  //シュートするときにロボットを動作させる時間
#define go_foward OnFwd(OUT_AC,power);  //前進
#define go_back OnRev(OUT_AC,power);  //後退
#define turn_right OnFwd(OUT_A,power);  //右折
#define turn_left OnFwd(OUT_C,power);  //左折
#define circle_right OnFwd(OUT_A,power); OnRev(OUT_C,power);  //方向転換(右)
#define circle_left OnFwd(OUT_C,power); OnRev(OUT_A,power);  //方向転換(左)
#define CROSS_LINE_TIME 800  //交差点を直進するときに動作させる時間
#define CROSS_TURN_RIGHT_TIME 2750  //右に90度旋回させるために動作させる時間
#define cross_line circle_left; Wait(LET_TIME); go_foward; Wait(CROSS_LINE_TIME);Off(OUT_AC);   //交差点を直進
#define cross_turn_right circle_right Wait(CROSS_TURN_RIGHT_TIME-nMax);Off(OUT_AC);  //交差点を右折
#define white 60  //白
#define pale_gray 50  //白よりの灰
#define deep_gray 40  //黒よりの灰
#define black 34  //黒
#define ball_catch OnFwd(OUT_B,power); Wait(CATCH_TIME); Off(OUT_B); //ボールを取る
#define ball_shoot circle_left; Wait(nMax); OnRev(OUT_B,power); Wait(CATCH_TIME); Off(OUT_B); go_back; Wait(SHOOT_TIME); go_foward; Wait(SHOOT_TIME+300); //ボールをシュートする
sub line_trace()  //ボールを取るまでの間、ライントレースする
{
    if (SENSOR_1 > white){
        circle_left;
     }
    else if (SENSOR_1 > pale_gray){
        turn_left;
     }
    else if (SENSOR_1 > deep_gray){
        go_foward;
     }
    else if (SENSOR_1 > black){
        turn_right;
     }
    else{
        circle_right;
     }
}

task main()
{
    SetSensorLight(S1);
    SetSensorLowspeed(S2);
    int nOnline=0; //黒い線の上にいた回数  
    int n=0;   //交差点に着いた回数
 
    while(1){
       while(1){
          n++;
          nOnline=0;
          while(nOnline < nMax){
            if (SENSOR_1 > white){
               circle_left;
               nOnline=0;
              }
            else if (SENSOR_1 > pale_gray){
                turn_left;
                nOnline=0;
              }
            else if (SENSOR_1 > deep_gray){
                go_foward;
                nOnline=0;
              }
            else if (SENSOR_1 > black){
                turn_right;
                nOnline=0;
              }
            else{
                 circle_right;
                 nOnline++;
              }
            }
//交差点に差し掛かるまでの間ライントレースする
         Off(OUT_AC);
         Wait(1000);

         if(n==1){
           PlaySound(SOUND_FAST_UP);
           cross_line;
           break;
         }
//最初の交差点を横断する
         else if(n==2){
          PlaySound(SOUND_FAST_UP);
          cross_turn_right;
          break;
         }
//二回目のの交差点を右折する
         else if(n==3){
          PlaySound(SOUND_FAST_UP);
          cross_line;
          while(SensorUS(S2) > 10){
          line_trace();
          }
          ball_catch;
          break;
         }
//三回目の交差点を横断して、ボールを認識したところでキャッチする
         else if(n==4){
           PlaySound(SOUND_FAST_UP);
           cross_line;
           break;
         }
//四回目の交差点を横断する
         else if(n==5){
           PlaySound(SOUND_FAST_UP);
       cross_turn_right;
           go_foward;
           Wait(1000);
           break;
         }
//ヘアピンカーブの入り口を交差点と判断して曲がる
        else if(n==6){
           PlaySound(SOUND_FAST_UP);
           cross_turn_right;
           go_foward;
           Wait(500);
           Off(OUT_AC);
           break;
         }
//ヘアピンカーブの出口付近を交差点と判断して曲がる
        else if(n==7){
           PlaySound(SOUND_FAST_UP);
           cross_turn_right;
           break;
         }
//五回目の交差点を右折する
    else if(n==8){
           PlaySound(SOUND_FAST_UP);
           cross_line;
           break;
         }
//六回目の交差点を直進する
         else if(n==9){
           PlaySound(SOUND_FAST_UP);
           cross_turn_right;
           break;
         }
//七回目の交差点を右折する
         else{
           PlaySound(SOUND_FAST_UP);
           cross_line;
           ball_shoot;
         }
//ゴールにボールをシュートする
        }
    }
}

まとめ

今回の機体は挙動を制御しやすいように作られているが、光センサーの閾値の調整に関しては簡単にできるようにはなった訳ではない。また、ボールをキャッチする場所によっては光センサーの値がそれまでと変ってしまうことがあるのか、正確な挙動をしなくなることがある。ヘアピンカーブではライントレースを用いずに進んでいるのでヘアピンカーブ用のライントレースさせるプログラムを追加する必要がある。


添付ファイル: file_20161222_170750.JPG 98件 [詳細] file_20161222_170651.JPG 71件 [詳細] file_20161222_163051.JPG 78件 [詳細] file2016b-mission2.png 84件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-12-25 (日) 17:30:55