今回の課題

 黒いラインを障害物(缶)をよけ、交差点かどうかを判断させるプログラム。ぼくは時計回り担当。

ロボットの紹介

ロボ全体

 ロボットをつくる際に、まずライントレースを円滑に行わせるためにタイヤ部分の小回りが利くようにしなければと思い、駆動するタイヤを前方におき、後方は補助輪にした。

ロボアーム部分

 また、障害物を動かすためにタッチセンサと片側だけのアームを取り付けた。アームを作る際には障害物の重さに十分耐えれるようにと作った。若干前重心となってしまったが動作に影響はあまりない程度で収まった。

プログラムの説明

  • 定義
    #define THRESHOLD 40
    #define HIPOWER 4
    #define LOWPOWER 2
    #define set_power_H SetPower(OUT_AC,HIPOWER);
    #define set_power_L SetPower(OUT_AC,LOWPOWER);
    #define go_forward set_power_H; OnFwd(OUT_AC);
    #define turn_left1 set_power_L; OnFwd(OUT_C); OnRev(OUT_A);
    #define turn_left0 set_power_L; OnFwd(OUT_C); Off(OUT_A);
    #define turn_right0 set_power_L; OnFwd(OUT_A); Off(OUT_C);
    #define turn_right1 set_power_L; OnFwd(OUT_A); OnRev(OUT_C);
    #define STEP 1
    #define nMAX 2
    #define short_break Off(OUT_AC); Wait(50);
    #define CROSS_TIME 30
    #define cross_line go_forward; Wait(CROSS_TIME); short_break;
    #define time0 1130
    #define time1 1300
    #define time2 500
    #define time3 400
    #define time4 1000
  • 最初の交差点にいくまで通常のライントレースをするサブルーチン
    sub line1() { 
              if (SENSOR_2 < THRESHOLD -5) { turn_left1; }
         else if (SENSOR_2 < THRESHOLD -2) { turn_left0; } 
         else if (SENSOR_2 < THRESHOLD +4) { go_forward; }
         else if (SENSOR_2 < THRESHOLD +8) { turn_right0; }
         else                              { turn_right1; } }
  • 交差点をわたるサブルーチン
    sub cross() {      
      int n=0;
       while(n < nMAX){
              if (SENSOR_2 < THRESHOLD -5) { turn_left1; n++; PlaySound(SOUND_CLICK); } 
        else{ if (SENSOR_2 < THRESHOLD -2) { turn_left0;  }
        else  if (SENSOR_2 < THRESHOLD +4) { go_forward;  } 
        else  if (SENSOR_2 < THRESHOLD +8) { turn_right0; }
        else                               { turn_right1; } 
         n=0; }
         Wait(STEP); }
         short_break;
         turn_right1; Wait(nMAX*STEP*5);
         cross_line;
         n=0;  }
  • 直線に進むサブルーチン
    sub line2() {
              if (SENSOR_2 < THRESHOLD -3) { turn_left1; }
         else if (SENSOR_2 < THRESHOLD +1) { turn_left0; } 
         else                              { go_forward; }  }
  • 缶をどかすサブルーチン
    sub can1()
    	{ 
                   OnFwd(OUT_B); //アームでつかむ
    		Wait(7);
    		OnFwd(OUT_AC); //前進
    		Wait(130);
    		OnFwd(OUT_C); OnRev(OUT_A); Off(OUT_B); //左旋回
    		Wait(180);
    		Off(OUT_AC);  //停止
    		Wait(50);	
    		OnRev(OUT_B);  //缶を離す
    		Wait(10);		
    		OnRev(OUT_AC);  //後進
    		Wait(180);		
                  OnFwd(OUT_A); OnRev(OUT_C); Off(OUT_B);  //右旋回
    		Wait(70);
    		OnFwd(OUT_AC);
    		Wait(100);			
    		Off(OUT_ABC); }
  • メインのプログラム
    task main ()
    {
      SetSensor(SENSOR_2,SENSOR_LIGHT);
      SetSensor(SENSOR_3,SENSOR_TOUCH); 
      ClearTimer(0);
      PlaySound(SOUND_UP); Wait(20);
      while (FastTimer(0) <= time0) { line1();   if(SENSOR_3 == 1) { line_can(); }  //タッチセンサが反応したら缶をどかすプログラム
    		                  } }         //最初の交差点までのプログラム
      ClearTimer(1);
      PlaySound(SOUND_DOWN); Wait(20);
      while (FastTimer(1) <= time1) { cross(); }  //最初の交差点をわたる
      ClearTimer(0);
      PlaySound(SOUND_UP); Wait(20);
      while (FastTimer(0) <= time2) { line2(); }  //円を回り次の円へいく
      ClearTimer(1);
      PlaySound(SOUND_DOWN); Wait(20);
      while (FastTimer(1) <= time3) { cross(); }  //二番目の円を回ったあとの交差点をわたる
      ClearTimer(0);
      PlaySound(SOUND_UP); Wait(20);
      while (FastTimer(0) <= time4) { line1(); }  //通常のライントレースに戻る
      Off(OUT_AC);   
    }

まとめ

  • 交差点のを判断させるときのプログラムの曲がりすぎかの判断の値を決めるのにてまどい、なかなか成功することができなかった。判断に成功したあとも、交差点をわたるプログラムと通常のライントレースをさせるプログラムの切り替えのタイミングをはかるのに苦労した
  • ロボットを思い通りに動かすことが難しくて苦労した。また重心の位置をもうちょっと考えることができたらよかったと思った。
  • 今回は缶一つでも相当苦労したが、次の課題では使いこなせるようにしたい。

添付ファイル: filerobo2.JPG 232件 [詳細] filerobo1.JPG 239件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-01-23 (木) 18:44:45 (2035d)