[[2016a/Member]]
#contents
*今回の課題 [#ea03fa7c]

まず簡単に言うと課題はロボットに紙コップを運ばせることである。

紙コップをたくさん重ねて運べば、その分点数は高くなる。

さらに紙コップを1つも運べなかったとしても、他のチームからロボットの評価をしてもらう。

ロボットの工夫点や見た目など様々な評価基準があり、20点満点で評価され、

課題の点数に追加する形で加点される。

*私たちのロボット [#t24740f0]

**積み重ねロボット [#t50ef94d]
&ref(2016a/Member/katsumi/Mission3/積み重ねロボット2.JPG);
&ref(2016a/Member/katsumi/Mission3/積み重ねロボット1.JPG);

このロボットの役割は紙コップを重ねることである。

モーターAでアームを開閉し、モーターCでアームを上下している。

下に光センサーがついているのがポイントで、白いコップの明るさを感知するようになっている。

また紙コップをつかむために、センサーとアームの位置が微調整されている。

さらにこのロボット自体は移動しないので、ロボットの位置のズレによるミスは発生しない。

**運搬ロボット [#m4fcedcd]
&ref(2016a/Member/katsumi/Mission3/運搬ロボット2.JPG);
&ref(2016a/Member/katsumi/Mission3/運搬ロボット1.JPG);

このロボットはライトレース用のロボットをベースとしている。

3輪にすることで小回りが効くようになっていて、変更点は見ての通り紫色のアームである。

このアーム内にコップを入れることで確実に目的地まで運搬することが可能になる。

*積み重ねロボットのプログラミング [#w3a0c570]

 #define nigiru OnFwd(OUT_A);Wait(move_timeA);Off(OUT_A); //アームを閉じる
 #define hanasu OnRev(OUT_A);Wait(350);Off(OUT_A);        //アームを開く
 #define arm_up OnFwd(OUT_C);Wait(move_timeB);Off(OUT_C); //アームを下げる
 #define arm_down OnRev(OUT_C);Wait(500);Off(OUT_C);      //アームを上げる
 #define s_arm_down OnRev(OUT_C);Wait(200);Off(OUT_C);    //アームを少し下げる 
 int move_timeA;                                          //アームを閉じる時間
 int move_timeB;                                          //アームを上げる時間
 
 task main()
 {
     SetSensor(SENSOR_1, SENSOR_LIGHT);
    int n=0;                                  //紙コップを持ち上げた回数を数えるカウンター                
   move_timeA=400;                           //アームを閉じる時間を4秒に設定
   move_timeB=800;                           //アームを上げる時間を8秒に設定
 
 while(n<=4){
    if(SENSOR_1>50){                        
        s_arm_down;hanasu;arm_down;        //紙コップを重ねる                   
        nigiru;move_timeB=move_timeB+80;   //アームを閉じる(1回ごとに+0.8秒する)
        arm_up;move_timeA=move_timeA+1;    //紙コップを持ち上げる(1回ごとに+0.01秒する)
        n++;                               //カウンターを+1する
    }
 }
 s_arm_down;hanasu;arm_up;Off(OUT_A);       //6つ目の紙コップを重ねる
 }

*運搬ロボットのプログラミング [#oac2641e]

 #define THRESHOLD 42                                     //閾値
 #define gofw OnFwd(OUT_AC);Wait(5);                      //直進
 #define turn_left Off(OUT_A); OnFwd(OUT_C);              //左折
 #define senkai_left OnFwd(OUT_C);OnRev(OUT_A);Wait(63);  //交差点左旋回
 #define turn_right OnFwd(OUT_A); Off(OUT_C);             //右折
 #define senkai_right OnFwd(OUT_A);OnRev(OUT_C);Wait(60); //交差点右旋回
 #define senkai OnFwd(OUT_A);OnRev(OUT_C);Wait(90);       //180度旋回
 #define STEP 1                                           //一回の判定で進む時間  
 #define B_up OnFwd(OUT_B);Wait(80);Off(OUT_B);           //出力Bの腕を上げる
 #define B_down OnRev(OUT_B);Wait(80);Off(OUT_B);         //出力Bの腕を下げる
 #define back OnRev(OUT_AC);Wait(move_time);Off(OUT_AC);  //後退
 #define tyousei_l(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);  //角度調整のための左旋回 
 #define tyousei_r(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);  //角度調整のための右旋回
 #define watasu OnFwd(OUT_AC);Wait(120);Off(OUT_AC);\
                OnRev(OUT_AC);Wait(50);Off(OUT_AC);Wait(2000); //積み重ねロボとの接触調整
 int move_time;                                           //後退の時間

 void line_follow(int t)
 { 
   SetSensor(SENSOR_2, SENSOR_LIGHT);
   ClearTimer(0);
 
  while (Timer(0)<t) {
     if (SENSOR_2 < THRESHOLD){  
         turn_left;                
     } else {                  
         turn_right;            
     }
     Wait(STEP); 
   }Off(OUT_AC);
 }
 
 sub crossing_fwd()
 {
   SetSensor(SENSOR_2, SENSOR_LIGHT);
   int n=0;
 
  while(n<10){
     if (SENSOR_2 < THRESHOLD){  
         turn_left;n++;             
     } else {                    
         turn_right;n=0;              
     }
    Wait(STEP); 
   }Off(OUT_AC);Wait(100);gofw;
 }
 
 sub crossing_stop()
 {
   SetSensor(SENSOR_2, SENSOR_LIGHT);
   int n=0;
 
  while(n<10){
     if (SENSOR_2 < THRESHOLD){  
         turn_left;n++;             
     } else {                    
         turn_right;n=0;              
     }
    Wait(STEP); 
   }Off(OUT_AC);Wait(100);
 }
 
 sub crossing_right()
 {
   SetSensor(SENSOR_2, SENSOR_LIGHT);
    int n=0;
 
  while(n<10){
     if (SENSOR_2 < THRESHOLD){  
         turn_left;n++;             
     } else {                    
         turn_right;n=0;              
     }
    Wait(STEP); 
   }Off(OUT_AC);Wait(100);senkai_right;OnFwd(OUT_AC);Wait(30);
 }
 
 sub crossing_left()
 {
   SetSensor(SENSOR_2, SENSOR_LIGHT);
   int n=0; 
 
  while(n<10){
     if (SENSOR_2 < THRESHOLD){  
         turn_left;n++;             
     } else {                    
         turn_right;n=0;              
     }
     Wait(STEP); 
   }Off(OUT_AC);Wait(100);senkai_left;
  }  
 
 task main()
 {
 move_time=50;           //後退の時間を0.5秒に設定
 
 line_follow(105);
 tyousei_l(30);          //急カーブ手前の角度調整
 crossing_left();        //Pを左折
 line_follow(50);
 crossing_right();       //Sを右折
 crossing_stop();        //Cで停止
 tyousei_r(20);          //紙コップを取るための角度調整
 back;                   //1つ目の紙コップを取るための後退                  
 B_down;
 senkai;
 line_follow(50);
 crossing_left();        //Sを左折
 line_follow(50);
 crossing_fwd();         //Pを直進
 line_follow(25);
 tyousei_l(40);          //急カーブ手前の角度調整
 crossing_fwd();         //Rを直進
 tyousei_r(15);          //紙コップを渡す場所の調整
 watasu;
 tyousei_l(25);          //旋回前の調整
 senkai;
 B_up;
 repeat(2)
 {
 OnFwd(OUT_AC);Wait(100); //Rをこし、トレースしやすくする直進
 line_follow(50);
 crossing_fwd();          //Pを直進
 crossing_left();         //Sで左折
 crossing_stop();         //Dで停止
 tyousei_r(20);           //紙コップを取るための角度調整
 back;                    //1つ目の紙コップを取るための後退     
 B_down;
 senkai;
 crossing_right();        //Sを右折
 crossing_fwd();          //Pを直進
 line_follow(25);
 tyousei_l(40);           //急カーブ手前の角度調整
 crossing_fwd();          //Rを直進
 tyousei_r(15);           //紙コップを渡す場所の調整
 watasu;
 tyousei_l(25);           //旋回前の調整
 senkai;
 B_up;
 OnFwd(OUT_AC);Wait(100); //Rをこし、トレースしやすくする直進
 line_follow(20);
 crossing_fwd();          //Pを直進
 crossing_right();        //Sを右折
 crossing_stop();         //Cで停止
 tyousei_r(20);           //紙コップを取るための角度調整
 back;move_time=move_time-25; //3つ目、5つ目の紙コップを取るとき後退時間を-0.25秒している 
 B_down;
 senkai;
 line_follow(50);
 crossing_left();         //Sを左折
 line_follow(50);
 crossing_fwd();          //Pを直進
 line_follow(25);
 tyousei_l(40);           //急カーブ手前の角度調整
 crossing_fwd();          //Rを直進
 tyousei_r(15);           //紙コップを渡す場所の調整
 watasu;
 tyousei_l(25);           //旋回前の調整
 senkai;
  B_up;
  }
 OnFwd(OUT_AC);Wait(100); //Rをこし、トレースしやすくする直進
 line_follow(50);         
 crossing_fwd();          //Pを直進     
 crossing_left();         //Sを左折
 crossing_stop();         //Dで停止
 tyousei_r(20);           //紙コップを取るための角度調整
 back;
  B_down;
 senkai;
 crossing_right();        //Sを右折
 crossing_fwd();          //Pを直進
 line_follow(25);
 tyousei_l(40);           //急カーブ手前の角度調整
 crossing_fwd();          //Rを直進     
 tyousei_r(15);           //紙コップを渡す場所の調整
 watasu;
 senkai;
 line_follow(15);
 crossing_right();        //Rを右折
 OnFwd(OUT_AC);Wait(200);Off(OUT_AC); //円に向かう
 )


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