2016a/Member

目次

はじめに

今回の課題は、課題2で使ったコースを使い、紙コップを重ねるミニロボコンを行うものだった。 ルールはこちら→2016年度前期 課題3

ロボットの説明

今回は、紙コップ運搬用と積み重ねる用の2つのロボットを作った。

s_DSC_0239 (1).JPG

紙コップ運搬ロボ

s_1470408939269.jpgs_DSC_0242.JPGs_DSC_0243.JPGs_DSC_0244.JPG ドライブベースは小回りのきくように3輪にし、ライントレースしやすくした。

紙コップを捕まえる腕は、空回りするギアを使い、腕がとれないようにした。

紙コップ積み重ねロボ

s_DSC_0246.JPG s_DSC_0247.JPG s_DSC_0245.JPG s_DSC_0249.JPG

複雑で説明するのが難しいが、出力Aのモーターでアームを開閉し、出力Cのモーターでアームを上下している。

下の方に光センサーがついていて、光センサーに紙コップが触れると、アームが動き出す。光センサーの真上にアームが来るように調整し、紙コップがつかめるようにした。

プログラム

運搬ロボ用プログラム

#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レポート

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

積み重ねロボ用プログラム

#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つねらいの作戦にした。

結果

基本得点  0点

技術点   10.2点

___________________

合計    10.2点

反省・感想

自分たちのグループは、ハードを作る方に時間をかけてしまい、あまりきれいなプログラムが作れなかった。もう少しきれいにまとめることが出来たと思った。

テスト週間ということもあり、人があまり集まらないときが多かったけれど、本番までにある程度は形に出来て良かった。

紙コップの接触など少し博打要素があった。そのため、電池を換えた後の誤差に、ひどく悩まされた。

調整が楽なプログラムを書いておけば良かったと思った。


添付ファイル: files_DSC_0249.JPG 133件 [詳細] files_DSC_0247.JPG 117件 [詳細] files_DSC_0246.JPG 106件 [詳細] files_DSC_0245.JPG 114件 [詳細] files_DSC_0244.JPG 108件 [詳細] files_DSC_0243.JPG 122件 [詳細] files_DSC_0242.JPG 119件 [詳細] files_DSC_0239 (1).JPG 115件 [詳細] files_1470408939269.jpg 134件 [詳細]

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