[[2016a/Member]]

目次
#contents
*はじめに [#zf01f81e]
今回の課題は、課題2で使ったコースを使い、紙コップを重ねるミニロボコンを行うものだった。
ルールはこちら→[[2016年度前期 課題3:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMission3]]

*ロボットの説明 [#y7972c6d]
今回は、紙コップ運搬用と積み重ねる用の2つのロボットを作った。
#ref(s_DSC_0239 (1).JPG)

**紙コップ運搬ロボ [#b1588ff0]
&ref(2016a/Member/kefusuke/Mission3/s_1470408939269.jpg)
&ref(s_DSC_0242.JPG)
&ref(s_DSC_0243.JPG)
&ref(s_1470408939269.jpg);&ref(s_DSC_0242.JPG);&ref(s_DSC_0243.JPG);&ref(s_DSC_0244.JPG);

**紙コップ積み重ねロボ [#ob27ccd2]
&ref(s_DSC_0246.JPG);
&ref(s_DSC_0247.JPG);
&ref(s_DSC_0245.JPG);
&ref(s_DSC_0249.JPG);
































*プログラム [#eea129c6]

**運搬ロボ用プログラム [#wc81d06a]
 #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); //円に向かう
 }
紙コップ運搬ロボは、Aからスタートし、C→B→D→Bを3回行い、6つの紙コップをBにおいてある紙コップ積み重ねロボへ運ぶようにプログラムを書いた。

サブールーチンとインライン関数は前回の課題と基本的に同じだが、ロボットの電池を変えたら、元気になり、nの値をn<15からn<10に変えたらちょうど良くなった。

前回の課題のレポート→[[2016年度前期 課題2レポート:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2Fkefusuke%2FMission2]]

本番はrepeatの回数を1回にして、4つねらいの作戦にした。

**積み重ねロボ用プログラム [#rc40ad43]
 #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つ目の紙コップを重ねる
 }
紙コップ積み重ねロボは常にBにいるようにした。

紙コップは白で、光センサーと接触すると光センサーの値が50を超える。
なので、SENSOR_1>50になったら、動作するようにプログラムを書いた。

紙コップを持ち上げる個数が増えると、アームが持ち上げる高さと握りの強さが変わってしまうので、
回数ごとのに時間を伸ばした。

本番ではn<=2にし、4つねらいの作戦にした


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