**目次 [#s0b0810b]
#contents
**課題2の説明 [#cfbf6862]
&ref(robocon2013a.png);
**ロボット [#c09087d8]
**プログラム [#h7f1574a]
 #define zone1 37
 #define zone2 45
 #define zone3 60
 #define zone4 65
 #define SPEED 45
 #define LOWSPEED SPEED*0.625
 #define mae OnFwd(OUT_BC,SPEED*0.8); //前進するだけ
 #define STEP 1 //一回の判定でロボが進む時間
 #define nMAX 100 //STEP秒間に赤外線センサーがnMAX回37以下の値を叩きだしたら次の動作へ
 #define SIGNAL1 11 //「打った」と宣言する信号
 #define SIGNAL2 12 //「打て」と宣言する信号
 #define CONN 1

 int p=0; //センサーが黒線の上にあるとき、pを使ってカウントし、pがnMAXの値を超えたらそこは交差点
 int n=0;
 int m=0;
 int r=0;
 int msg=0;


    sub migigawa(int x) //交差点をx回通過するまで右側をライントレースし続けるよ
        {
          while(m < x) {

            while(p < nMAX && m<x) {
                if (SENSOR_4 < zone1) {
                OnFwd(OUT_B,SPEED);OnRev(OUT_C,LOWSPEED); //小回りな右折
                p++;
          } else {
              if (SENSOR_4 < zone2) {
                OnFwd(OUT_B,SPEED);Off(OUT_C); //普通の右折
            } else if (SENSOR_4 < zone3) {
                mae;
            } else if (SENSOR_4 < zone4) {
                OnFwd(OUT_C,SPEED);Off(OUT_B); // 普通の左折
            } else {
                OnFwd(OUT_C,SPEED);OnRev(OUT_B,LOWSPEED); //小回りな左折
               }
                p=0;
               }
                Wait(STEP);
               }
                OnFwd(OUT_C,SPEED);OnRev(OUT_B,LOWSPEED); //小回りな左折
                Wait(nMAX*STEP);
                OnFwd(OUT_BC,SPEED);Wait(300);
                p=0;
                m++;
               }
                m=0;
 }



    sub hidarigawa(int x) //交差点をx回通過するまでライントレースし続けるよ
      {
        while(m < x) {

            while(p < nMAX && m<x) {
                if (SENSOR_4 < zone1) {
                OnFwd(OUT_C,SPEED);Off(OUT_B); // 普通の左折
                p++;
          } else {
              if (SENSOR_4 < zone2) {
                OnFwd(OUT_C,SPEED);OnRev(OUT_B,LOWSPEED); //小回りな左折
            } else if (SENSOR_4 < zone3) {
                mae;
            } else if (SENSOR_4 < zone4) {
                OnFwd(OUT_B,SPEED);Off(OUT_C); //普通の右折
            } else {
                OnFwd(OUT_B,SPEED);OnRev(OUT_C,LOWSPEED); //小回りな右折
               }
                p=0;
               }
                Wait(STEP);
               }
                OnFwd(OUT_B,SPEED);OnRev(OUT_C,LOWSPEED);
                Wait(nMAX*STEP);
                OnFwd(OUT_BC,SPEED);Wait(300);
                p=0;
                m++;
               }
                m=0;
 }



 task main ()
 {
    SetSensorLight(S4); //四番ポートに赤外線センサーを設置

    Wait(2000); //ロボットを置く時間






    //一回目の缶当てスタート!





    migigawa(2); //交差点を二回カウントするまでライントレース

    Off(OUT_BC);Wait(1000);
    RotateMotor(OUT_C,-SPEED,200);RotateMotor(OUT_B,SPEED,120);Off(OUT_BC); //角度調整
    mae;OnRev(OUT_A,20);Wait(1500);Off(OUT_A); //アームで球を捕獲
    mae;until(SENSOR_4 < 50);Off(OUT_BC); //黒線まで直進
    OnRev(OUT_BC,SPEED);Wait(500);OnRev(OUT_BC,SPEED);until(SENSOR_4 < 50); //後ろの黒線までバック
    OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED);Wait(500); //旋回
    OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED);until(SENSOR_4 < 50); //ライントレース出来る体制に戻る

    hidarigawa(1); //左側をライントレースしながら交差点を一回カウント

    Off(OUT_BC);Wait(1000);RotateMotor(OUT_BC,-SPEED,430);Wait(1000); //打つ地点までバック
    RotateMotor(OUT_B,-SPEED,300);RotateMotor(OUT_C,SPEED,100);Off(OUT_BC); //角度調整
    Wait(1000);SendRemoteNumber(CONN,MAILBOX1,SIGNAL1); //信号を送る
    OnFwd(OUT_BC,SPEED);RotateMotor(OUT_A,100,400);Off(OUT_ABC); //打つ

    RotateMotor(OUT_BC,-SPEED,200);
    OnRev(OUT_BC,SPEED);until(SENSOR_4 < 50);RotateMotor(OUT_BC,SPEED,50); //打った状態から元に戻る
    OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED);until(SENSOR_4 < 50); //打った状態から元に戻る
    Off(OUT_BC);Wait(5000); //五秒待つ

    hidarigawa(1); //左側ライントレース交差点を一回カウント

    RotateMotor(OUT_BC,SPEED,100);Off(OUT_BC); //受け取る場所まで移動
    RotateMotor(OUT_BC,-SPEED,10);RotateMotor(OUT_C,SPEED,550);Off(OUT_BC); //90°旋回
    SendRemoteNumber(CONN,MAILBOX2,SIGNAL2); // 相手に「打て」とメッセージを送る
    Wait(500); //相手が打ってから球が来るまで待つ時間
    OnRev(OUT_A,20);Wait(1500);Off(OUT_A); //球を受け取る

    OnRev(OUT_BC,SPEED);until(SENSOR_4 < 50);Off(OUT_BC);RotateMotor(OUT_BC,SPEED,80);
    OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED);until(SENSOR_4 < 50); //ライントレース出来る体制に戻る
    Off(OUT_BC);Wait(7000); //七秒待つ

    hidarigawa(1); //左側、交差点を一回カウント

    RotateMotor(OUT_BC,SPEED,50);Off(OUT_BC); //打つ地点まで移動
    RotateMotor(OUT_B,-SPEED,400);Off(OUT_B);RotateMotor(OUT_C,-SPEED,20); //角度調整
    SendRemoteNumber(CONN,MAILBOX3,SIGNAL1); //「打つ」と送る
    OnFwd(OUT_BC,SPEED);RotateMotor(OUT_A,100,400);Off(OUT_ABC); //打つ
    RotateMotor(OUT_BC,-SPEED,50);Off(OUT_BC); //打った時のズレを修正










    //一回目の缶当て終了!
    //二回目の缶当てスタート!









    RotateMotor(OUT_C,-SPEED,50);
    Wait(65000); //相手が準備できるまで待機
    SendRemoteNumber(CONN,MAILBOX4,SIGNAL2); //「打て」と相手に送る    
    Wait(1500);OnRev(OUT_A,20);Wait(1500);Off(OUT_A); //球を受け取る

    RotateMotor(OUT_C,SPEED,50);Wait(5000); //相手が準備できるまで待つ

    RotateMotor(OUT_BC,-SPEED,200);
    RotateMotor(OUT_C,-SPEED,180);RotateMotor(OUT_B,-SPEED,380); //打つ準備をする
    RotateMotor(OUT_BC,SPEED,300);RotateMotor(OUT_B,SPEED,80); //打つ準備をする
    RotateMotor(OUT_BC,-SPEED,100);
    SendRemoteNumber(CONN,MAILBOX5,SIGNAL1); //「打つぞ」と相手に送る
    Wait(500);OnFwd(OUT_BC,SPEED);RotateMotor(OUT_A,80,400);Off(OUT_ABC); //打つ

    Wait(1500);OnRev(OUT_BC,SPEED);until(SENSOR_4 < 50);Off(OUT_BC);//打ってから黒線まで戻る
    RotateMotor(OUT_BC,SPEED,50);
    OnFwd(OUT_C,SPEED);OnRev(OUT_B,SPEED); //ライントレース出来る体制に戻る
    until(SENSOR_4 < 50);Off(OUT_BC); //ライントレースできる体制に戻る

    migigawa(1); //目の前のT字路をカウント
 
    RotateMotor(OUT_BC,SPEED,350);RotateMotor(OUT_B,SPEED,400); //受け取る位置まで移動
    RotateMotor(OUT_C,-SPEED,180);Off(OUT_BC);RotateMotor(OUT_C,-SPEED,100); //受け取り角度調整
    SendRemoteNumber(CONN,MAILBOX6,SIGNAL2); //「打て」と送る
    Wait(1500); //球が来るのを待つ
    OnRev(OUT_A,20);Wait(1500);Off(OUT_A); //球を受け取る

    Wait(1000);OnRev(OUT_BC,SPEED);until(SENSOR_4 < 50);Off(OUT_BC); //ライントレース出来る体制に戻る
    RotateMotor(OUT_BC,SPEED,50); //ライントレースできる体制に戻る!
    OnFwd(OUT_C,SPEED);OnRev(OUT_B,SPEED);until(SENSOR_4 < 50);Off(OUT_BC); //ライントレースd(ry

    migigawa(1);

    Off(OUT_BC);
    RotateMotor(OUT_B,-SPEED,420);
    RotateMotor(OUT_A,100,400); //缶に当てる
    }
 }
**反省 [#k139bc56]
**意見 [#r8e90b9c]
-ロボット同士の通信のやり方を詳しく資料に記述してほしい
-RotateMotorのコマンドはほぼ必須なので、詳しく資料に記述してほしい

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS