2014a/Member

取り組んだ課題の説明

 今回取り組んだ課題の詳細についてはfile?2014a%2FMission2を参照

メンバー

・tacchan
・yukiyamaneko
・monodoll
・nari

戦略

2014a-mission2.png

・この課題を以下の手順で攻略するつもりであった。

.灰奪Aを取りに移動しコップの識別をする。(コップには黒・ねずみ色・白の三色に塗られたコップをライトセンサーで読み取り光の強さで識別する。)
Aがあった地点を基準点とし識別されたコップを入れる場所まで移動しアームを下ろす。
A地点まで戻り次のコップを取りにいき再びA地点まで戻り△魴り返す。
きの繰り返し。

大会当日ではコップAを取り識別し対応するコップにかぶせ再びA地点まで戻ってくるところまでしかプログラムが完成しなかった。

ロボット

front.jpg

・車軸のそばにライントレース用のライトセンサーをつけそれと直角になる向きにコップ識別用のライトセンサーを付けた。
・アームはコップを掴んだあと、さらに力が加わるとそれをコップを持ち上げる向きに力が働くようにした。またアームはコップ識別用のライトセンサーから離れすぎないようにするためにSlaveと垂直になるように固定した。

left.jpg

・MainとSlaveを車体に垂直に固定し車体の重心が後ろに行き過ぎたため、後輪を2つにした。

under.jpg

  • Main:本体制御
    #define bri 55
    #define s1 50 //高速
    #define s2 30 //低速
    #define OnRL(x,y) OnFwd(OUT_A,x); OnFwd(OUT_C,y);
    #define go OnFwdSync(OUT_AC,s2,0); //直進
    #define left1 OnRL(-s2,s2); //左旋回
    #define left0 OnRL(0,s2); //左折
    #define right0 OnRL(s2,0); //右折
    #define right1 OnRL(s2,-s2); //右旋回
    #define step 1
    #define nMAX 300 //nMAXを超えた時交差点と判断する
    #define short_break Off(OUT_AC); Wait(500); //小休憩
    #define cross_line go;Wait(200);short_break; //交差点を渡る
    #define open 4
    #define motiageru 1 
    #define tukamu 2
    #define hanasu 3
    #define time1 2000  //始めの旋回、ちょうど90°旋回できる時間、要設定
    #define part2 15000  //Aを掴んでから1に置くまでの時間、要設定
    #define part3 10000  //Aを掴んでから2に置くまでの時間、要設定
    #define part4 15000 //Aを掴んでから3に置くまでの時間、要設定
    #define song PlaySound(SOUND_CLICK);//音を鳴らす
    
    task main()
    {
      SetSensorLight(S2); //ライントレースをするライトセンサーを設置
      SetSensorLight(S3); //紙コップを識別するためのライトセンサーを設置
    
      go;
      Wait(4500);//4.5秒間直進
      song;
      left1;//左に旋回
      Wait(time1);//90度回転するまで続ける
      song;
      go;//直進
      Wait(800);
      song;
    
      SendRemoteNumber(1,0,open);
      song;
      go;
      Wait(3000);
      SendRemoteNumber(1,0,tukamu);//つかむ
      song;
    
      int n1 = 0;//n1という関数を設置
      int rooot = 0;//roootという関数を設置
      /*こっから判別に入る*/
      while(rooot = 0){
       if(SENSOR_3 < 42){
        rooot = 3;}//センサーが42未満の場合ルート3へ
        else if(SENSOR_3 < 50){
        rooot = 2;}//センサーが50未満の場合ルート2へ
        else{
        rooot = 1;}//それ以外の場合ルート1へ
      }
      Wait(1000);
      song;
    
      SendRemoteNumber(1,0,motiageru);  //子機に送信しアームを稼働し持ち上げる
      song;
    
      go;//直進
      Wait(1000);//1秒間続ける
      left0;//左折
      Wait(1000);
      until(SENSOR_2 <45);//ライントレースするセンサーが45未満になるまで続ける
    
      long line = 0;//long lineという関数を設置
      long t1 = CurrentTick();//t1という関数を設置
    
     while(rooot = 1){ //roootが1の間ライントレースを続ける
    
      while(CurrentTick()-t1 <= part2){ //t1がpart2より大きくなるまでライントレースを続ける
        while (line < nMAX) { // lineがnMAX以上になるまで続ける
    
          if (SENSOR_2 < 40) {
              right1;
              line = line + 10;   //交差点を抜けやすくする
           } else {
             if (SENSOR_2 < 45) {
                right0;
             } else if (SENSOR_2 < 55) {
                go;
             } else if (SENSOR_2 < 60) {
                left0;
             } else {
                left1;
               }
              line=0;
             }
            Wait(step);
        }
        short_break;
        right1;
        Wait(200);
        cross_line;
        line=0;
      }
    
      SendRemoteNumber(1,0,hanasu);
    
      rooot = 0;
    
      OnRev(OUT_AC,50);     //A地点付近まで戻る
      Wait(500);
      left1;
      Wait(time1*2);
      go;
      Wait(4000);
      }
    
    
      while(rooot = 2){
    
        while(CurrentTick()-t1 <= part3){
    
           if(SENSOR_2 < 40){
            left1;}
           else if(SENSOR_2 < 45){
            left0;}
           else if(SENSOR_2 < 55){
            go;}
           else{
           right0;}    //右旋回はなし、2に向かうには交差点判断も必要ない
         Wait(step);
         }
    
      SendRemoteNumber(1,0,hanasu);
    
      rooot = 0;
    
      OnRev(OUT_AC,50);     //A地点付近まで戻る
      Wait(500);
      left1;
      Wait(time1);
      go;
      until(SENSOR_2 < 45);
    
      }
    
      while(rooot = 3){
    
        while(CurrentTick()-t1 <= part4){
                                              //右ライントレース
            if(SENSOR_2  < 40){
             right1;}
            else if(SENSOR_2 < 45){
             right0;}
            else if(SENSOR_2 < 55){
             go;}
            else if(SENSOR_2 < 60){
             left0;}
            else{
             left1;}
    
         }
    
      SendRemoteNumber(1,0,hanasu);
    
      rooot = 0;
    
      OnRev(OUT_AC,50);   //A地点付近まで戻る
      Wait(500);
      right1;
      Wait(time1 + 300);
      go;
      Wait(3000);
      go;
      until(SENSOR_2 < 45);
    
      }
    
             //ここから2つ目をつかみにかかる
            //2枚目のスタート地点に向かう、円軌道に乗ってる途中、右に曲がってスタート地点に行  く前に
            //B地点にショートカットする
    
    }
  • slave:アーム制御
    #define on 1
    
    
    
    
    
    task main()
    
    {
    
    
    
    int moterOn;
    
    while(true){
    
    ReceiveRemoteNumber(0,true,moterOn);
    
    
    
    if(moterOn == 4){
    
    
    
    OnFwd(OUT_B,50);
    
    Wait(300);
    
    Off(OUT_B);
    
    Wait(500);
    
    
    
    }
     
    
    
    if(moterOn == 1){
    
    
    
    OnRev(OUT_B,30);
    
    Wait(1000);
    
    Off(OUT_B);
    
    int moterOn =0;
    
    
    
    }
    
    
    
    else if(moterOn == 2){
    
    
    
    OnRev(OUT_B,30);
    
    Wait(1000);
    
    Off(OUT_B);
    
    int moterOn =0;
    
    }
    
    
    
    else if(moterOn == 3){
    
    
    
    OnFwd(OUT_B,30);
    
    Wait(1000);
    
    Off(OUT_B);
    
    int moterOn = 0;
    
    }
    
    
    
    
    
    }
    
    }

感想

・今回の課題は前回のようにものを掴みある地点まで運ぶものであったが、コップを掴むときに識別もする必要がありロボットに掴ませ識別させる方法を、考えるのに苦労した。またコップは三つあったためライントレースも三つのコースそれぞれに必要でロボット本体も二つのNXTをつかい行動させるプログラムする必要があり、以前の課題よりも長い準備期間が与えられたが思うようなプログラムができず本番に間に合わせることができなかった。講義の終盤に行った二つの課題は難しいものであったがメンバーと試行錯誤し問題解決へ少しでも近づくことができおもしろかった。


添付ファイル: fileunder.jpg 103件 [詳細] fileleft.jpg 101件 [詳細] filefront.jpg 113件 [詳細] file2014a-mission2.png 104件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-08-10 (日) 22:53:19 (1841d)