[[2014a/Member]]

目次

#contents

* 課題の説明 [#mffb653f]

詳しい説明は[[2014a/Mission1]]を参照

写真の入れかた例え:&ref(2014a/Member/mame/Mission1/sample2-small.jpg.30%);



* メンバー [#j0ee8e63]

mame

dai

* ロボット本体 [#g0b2bc6e]

** ライトセンサー [#jf97ef47]

** ドライブベース [#ta82ecff]

** アーム [#qa948bf2]

* 課題 [#ff560aa8]

* プログラム [#w9871f04]

** プログラムの概要 [#v140454d]

 #define SPEED_HIGH 40
 #define SPEED_MEDIUM 30
 #define SPEED_LOW 25
 #define SPEED_ZERO 0
#define THRESHOLD 37 //しきい値   
 #define THRESHOLD 37 //しきい値   
#define SPEED_H 25   //最も早い速度
#define SPEED_L 20   //最も遅い速度
#define OnRL(speedR,speedL);OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); //右・左車輪のスピード
#define go_forward OnRL(SPEED_H, SPEED_H);   //前進のスピード
#define turn_left1 OnRL(SPEED_L, -SPEED_L); //左旋回
#define turn_left0 OnRL(SPEED_L, 0); //左に曲がる
#define turn_right0 OnRL(0, SPEED_L); //右旋回
#define turn_right1 OnRL(-SPEED_L,SPEED_L); //右に曲がる
#define STEP 1 //白と黒の境界をセンサが読む時間(1/1000秒)
#define nMAX 300 //通常のカーブとして許容できる繰り返しの最大値
#define short_break Off(OUT_BC); Wait(1000); //小休止
#define CROSS_TIME 100 //交差点通過にかかる時間
#define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break; //交差点を渡る

 #define TURN_COUNT_MAX 300
 #define GO_COUNT_MAX 150
 #define Catch OnFwd(OUT_A,70);Wait(700);Off(OUT_A);
 #define shoot OnRev(OUT_B,100);Wait(1000);Off(OUT_B);
 #define Catch OnFwd(OUT_B,70);Wait(700);Off(OUT_B);
 #define go_forward OnFwd(OUT_AC,50);
task main() 
{ 
  SetSensorLight(S1); //光センサーをセット 
  SetSensorLowspeed(S4); //超音波センサーをセット 
  int nOnline=0; //黒い線になった回数  
  int nCrossline=0; //交差点を渡った回数

 void On(int leftSpeed, int rightSpeed){
    if(leftSpeed > 0){
        OnFwd(OUT_C, leftSpeed);
    }else{
        OnRev(OUT_C, -leftSpeed);
 while (true) {
    
   go_Fwd(OUT_BC);  //黒線になるまで前進
  until(SENSOR_1 = 1);
  
   while (nOnline < nMAX) { //黒の認識が最大値より小さい間
    
   if(SensorUS(S4) <= 8) { //8cm以内に障害物があった場合下記2行を実行する
       OnFwd(OUT_A,70);Wait(500);Off(OUT_A); //
  Wait(2000); //アームを前方向に2秒回転(ボールをつかむ)
    }
    if(rightSpeed > 0){
        OnFwd(OUT_A, rightSpeed);
    }else{
        OnRev(OUT_A, -rightSpeed);
   if(nCrossline >= 5) { //交差点を5回通過した場合
      OnRev(OUT_A,100);Wait(1000);Off(OUT_A);
     break; //アームを後方向に1秒回転(ボールを放つ)
    }
 }

 void GoForward(){
    On(SPEED_HIGH, SPEED_HIGH);
 }

 void GoLeft(){
    On(SPEED_ZERO, SPEED_MEDIUM);
 }

 void GoRight(){
    On(SPEED_MEDIUM, SPEED_ZERO);
 }

 void TurnLeft(){
    On(-SPEED_LOW, SPEED_LOW);
 }

 void TurnRight(){
    On(SPEED_LOW, -SPEED_LOW);
 }

 void Back(){
    On(-SPEED_HIGH, -SPEED_HIGH);
 }

 void BackLeft(){
    On(SPEED_ZERO, -SPEED_MEDIUM);
 }

 void BackRight(){
     On(-SPEED_MEDIUM, SPEED_ZERO);
 }

 bool Light(){
    if(SENSOR_1 < 28){
        return 0;
    }else if(SENSOR_1 < 35){
        return 1;
    }else if(SENSOR_1 < 40){
        return 2;
    }else if(SENSOR_1 < 45){
        return 3;
    }else{
        return 4;
    }
 }


 task main()
 {
    
     {SetSensorLowspeed(S4);
   
       go_forward;
   

     if(SensorUS(S4)  <=8) { Catch;Off(OUT_BC); }
    if (SENSOR_1 < THRESHOLD -11)  { //白の場合
      turn_left1; //左に旋回
      nCrossline++; //交差点を渡る回数を増やす
    }  else {
      if (SENSOR_1 < THRESHOLD-5) { //やや白の場合 
       turn_left0; //左に曲がる
    }  else if (SENSOR_1 < THRESHOLD+5) { //やや黒の場合
       go_forward; //直進
    }  else if (SENSOR_1 < THRESHOLD +11) { //黒の場合
       turn_right0; //右に曲がる
    }  else {
       turn_right1; //右に旋回
     }
    nOnline=0; //カウントをリセットする
     }
   Wait(STEP); //(1/1000秒待機)
   }
   short_break; //小休止
   turn_right1; Wait(nMAX*STEP); //進行方向修正
   cross_line; //交差点を渡る
   nOnline=0; //カウントをリセットする
  }
}


 {   int turnCount = 0;
    int goCount = 0;
    int nCorner = 0;
    SetSensorLight(S1);
    while(true){
        Wait(1);
        switch(Light()){
            case 0:
                TurnLeft();
                if(turnCount < 0 || goCount < 0){
                    turnCount = 0;
                    goCount = 0;
                }
                turnCount++;
                break;
            case 1:
                GoLeft();
                if(turnCount < 0 || goCount < 0){
                    turnCount = 0;
                    goCount = 0;
                }
                goCount++;
                break;
            case 2:
                GoForward();
                break;
            case 3:
                GoRight();
                if(turnCount > 0 || goCount > 0){
                    turnCount = 0;
                    goCount = 0;
                }
                goCount++;
                break;
            case 4:
                TurnRight();
                if(turnCount > 0 || goCount > 0){
                    turnCount = 0;
                    goCount = 0;
                }
                turnCount++;
                break;
                break;
              }
        if(turnCount > TURN_COUNT_MAX && goCount < GO_COUNT_MAX){
            PlayTone(440, 100);
            switch(nCorner++){
                case 0:
                case 1:
                case 3:
                    TurnRight();
                    Wait(turnCount * 3);
                    Off(OUT_AC);
                    Wait(100);
                    GoForward();
                    Wait(100);
                    break;
                case 4:OnRev(OUT_A,100);Wait(1000);Off(OUT_B);
               }
            turnCount = 0;
            goCount = 0;
      }
  }
    }
  }

** ライントレースのプログラム [#r829ca55]

** ボールをつかむプログラム [#gad1054c]

** ボールを放つ(シュートする)プログラム [#vc7dbfbf]

 task main() 

   OnFwd(OUT_BC);


** 反省と感想 [#a4021e1b]

難しかった。しきい値が安定しなかった。


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