2010b

課題の内容

  • 交差点 2箇所以上
  • 直角コーナー 左右1箇所以上
  • 近道を点線 2箇所以上
  • スタートは横5cmの目印
  • 線の幅 15−25mm
  • 2周 ゴールはスタート地点の30cm手前
  • 速さと正確さを追求すること
  • 2周目はスタート地点の直前で自動的に止まること
  • 近道を選択するプログラムとそうでないプログラムを2人で分担して作成すること

メンバー

  • 植田みるく
  • 仁野陽日

コース

line.JPG

規定のルールに最低限従った簡単なコースにしたつもりです。

製作したロボット

工夫したところ

  • タイヤを四輪から二輪と補助輪にして動きをスムーズにしました。
  • 光センサの間隔が、規定の線の幅に合うように取り付けました。

最初、前の課題で作ったロボットの土台をそのまま使う事を考えていましたが、黒線をトレーースするときに、四輪だとカーブや直角の際に

苦労しそうだと思ったので、思いきってRCXを横倒しではなく立てて設置し、二輪プラス補助輪という形のロボットにしてみました。

これで、四輪の時に比べて、動きがスムーズになったと思います。

また、光センサの間隔もちょうどよく取り付けられたので、黒線の上を走るだけなら、割 とシンプルなプログラムで作動してくれました。

robo1.jpg robo2.jpg

左が正面から見たロボットで、右が横から見たロボットです。

問題点とその解決

最初、タイヤ部分の補強がうまくいっておらず、何度も動かすとタイヤ回りの部品がとれ る事があったので、補強の仕方を変えました。

最初のロボットでは頑丈にしようと、やけにいろいろな部品をつけ足していたのが逆によくなかったようだったので、できるだけシンプルに補強しました。

robo3.jpg

赤い丸で囲った部分がシンプルにした後の補強です。これだけで全然大丈夫です。

プログラム

みるくのプログラム

基本的に

  • 2つのセンサが白い部分にある場合→直進
  • 2つのセンサが黒い部分にある場合→直進
  • 右のセンサが黒、左のセンサが白の部分にある場合→右折
  • 右のセンサが白、左のセンサが黒の部分にある場合→左折

ただし、これだけだと、下の写真の黄色い丸で囲ったようなところで、コースを外れてしまいます。

そこで、タイマーを使って、この部分に来た時に直進をするようなプログラムにしました。

line2.jpg

#define go_s OnRev(OUT_A+OUT_C);  //直進
#define STOP Off(OUT_A+OUT_C);  //止まる  
#define turn_c OnRev(OUT_A);OnFwd(OUT_C);  //A側に曲がる  
#define turn_a OnRev(OUT_C);OnFwd(OUT_A);  //C側に曲がる  
#define T 41  //閾値  
#define RUN_TIME1 30  //タイマーのセット時間  
#define RUN_TIME2 30
#define RUN_TIME3 70
#define RUN_TIME4 35

task main()
{
  SetSensor(SENSOR_1,SENSOR_LIGHT);  //光センサを設置
  SetSensor(SENSOR_3,SENSOR_LIGHT);

  repeat(2){  

  ClearTimer(0); //タイマーをリセット

  while(Timer(0)<=RUN_TIME1){              //ランタイム1の間ライントレース
  if ((SENSOR_1>T)&&(SENSOR_3>T)) {go_s;}  //センサ1、3が白いとき直進
  if ((SENSOR_1>T)&&(SENSOR_3<T)) {turn_c;}  //センサ1が白、センサ3が黒の時C側に曲がる
  if ((SENSOR_1<T)&&(SENSOR_3>T)) {turn_a;}  //センサ1が黒、センサ3が白の時A側に曲がる
  if ((SENSOR_1<T)&&(SENSOR_3<T)) {go_s;}  //センサ1、3が黒いとき直進
 }
  STOP;Wait(20);  //2秒止まる
  go_s;Wait(25);  //2.5秒直進
  STOP;Wait(20);  //2秒止まる
  ClearTimer(0); //タイマーをリセット

  while(Timer(0)<=RUN_TIME2){               //ランタイム2の間ライントレース
  if ((SENSOR_1>T)&&(SENSOR_3>T)) {go_s;}  
  if ((SENSOR_1>T)&&(SENSOR_3<T)) {turn_c;}  
  if ((SENSOR_1<T)&&(SENSOR_3>T)) {turn_a;}
  if ((SENSOR_1<T)&&(SENSOR_3<T)) {go_s;}
 }
  STOP;Wait(20);
  go_s;Wait(25);
  STOP;Wait(20);
  ClearTimer(0);

  while(Timer(0)<=RUN_TIME3){              //ランタイム3の間ライントレース
  if ((SENSOR_1>T)&&(SENSOR_3>T)) {go_s;}
  if ((SENSOR_1>T)&&(SENSOR_3<T)) {turn_c;}
  if ((SENSOR_1<T)&&(SENSOR_3>T)) {turn_a;}
  if ((SENSOR_1<T)&&(SENSOR_3<T)) {go_s;}
 }
  
  STOP;Wait(20); 
  go_s;Wait(35);
  STOP;Wait(20);
 
  ClearTimer(0);

  while(Timer(0)<=RUN_TIME4){          //ランタイム4の間ライントレース
  if ((SENSOR_1>T)&&(SENSOR_3>T)) {go_s;}
  if ((SENSOR_1>T)&&(SENSOR_3<T)) {turn_c;}
  if ((SENSOR_1<T)&&(SENSOR_3>T)) {turn_a;}
  if ((SENSOR_1<T)&&(SENSOR_3<T)) {go_s;}
 }
  STOP;Wait(20);
  go_s;Wait(25);
  STOP;Wait(20);
  

  while((SENSOR_1<T)&&(SENSOR_3<T)){     //両センサが黒い部分にくるまでライントレース
  if ((SENSOR_1>T)&&(SENSOR_3>T)) {go_s;}
  if ((SENSOR_1>T)&&(SENSOR_3<T)) {turn_c;}
  if ((SENSOR_1<T)&&(SENSOR_3>T)) {turn_a;}
  if ((SENSOR_1<T)&&(SENSOR_3<T)) {go_s;}
 }
 
  STOP;Wait(30);
 }


 }
                

仁野のプログラム

プログラムの概要としては

センサーが二つとも黒と認識するときを考えて

交差点の部分では線を越えるまで直進し

自分は近道を担当しているので近道の入り口では近道コースに入るようにプログラムしました。

#define START OnRev(OUT_A+OUT_C);                // 前進
#define BACK OnFwd(OUT_A+OUT_C);                 // 後退
#define STOP Off(OUT_A+OUT_C);                   // 停止
#define TURN_R OnFwd(OUT_C);OnRev(OUT_A);        // 右折
#define TURN_L OnFwd(OUT_A);OnRev(OUT_C);        // 左折
#define L1 39                                    // 閾値を39と定義


sub chika()                                            //近道のサブルーチン
{
         if (SENSOR_1 > L1)                            // 1が白のときに
            {if (SENSOR_3 > L1) {START;}               // 3も白のときは直進
             else {TURN_R;}                            // 3が黒のときは右折
            }
         else {                                        // 1が黒のときに
               if (SENSOR_3 > L1) {TURN_L;}            // 3が白のときは左折
               else {STOP;Wait(10);                    // 3が黒のときは一度停止し
                     START;Wait(10);                   // 線を越えるまで前進
                     PlaySound(SOUND_CLICK);           // 1度音を鳴らす
                     cross++;                          // cross に1を足す
                   }
              }
}


sub kousaten()                                         //交差点のサブルーチン
{
         if (SENSOR_1 > L1)                            // 1が白のときに
            {if (SENSOR_3 > L1) {START;}               // 3も白のときは直進
             else {TURN_R;}                            // 3が黒のときは右折
            }
         else {                                        // 1が黒のときに
               if (SENSOR_3 > L1) {TURN_L;}            // 3が白のときは左折
               else {STOP;Wait(10);                    // 3が黒のときは一度停止し
                     TURN_L;Wait(30);                  // 0.3秒左折し
                     START;Wait(10);                   // 線を越えるまで前進
                     PlaySound(SOUND_DOUBLE_BEEP);     // 2回音を鳴らす
                     cross++;                          // cross に1を足す
                    }
              }
}


task main()
{

   SetSensor(SENSOR_1, SENSOR_LIGHT);                  // センサー1を光センサーと設定
   SetSensor(SENSOR_3, SENSOR_LIGHT);                  // センサー3を光センサーと設定


   int round=0;                                        // roundを定数とする
 

   while (round < 2)                                    // roundが2以下の時
   {

      int cross=0;                                     // crossを定数とする


      while (cross < 2)                                // 近道の入口までは
        { kousaten(); }

      while (cross < 4)                                //近道を通るときは
        { chika(); }

      while (cross < 6)                                // cross < 2 の時と同じ
        { kousaten(); }

      while (cross < 8)                                // cross < 4 の時と同じ
        { chika(); }

      while (cross < 9)                                // cross < 2 の時と同じ
        { kousaten();
          round++;                                     // round に1を足す
          }
    } 

     ClearTimer(0);                           // Timer(0) をリセット

     while ( Timer(0) <= RUN_TIME )                    // Timer(0) が0.8秒以下のときに
        {if (SENSOR_1 > L1)                            // 1が白のときに
            {if (SENSOR_3 > L1) {START;}               // 3も白のときは直進
             else {TURN_R;}                            // 3が黒のときは右折
               }
         else {                                        // 1が黒のときに
               if (SENSOR_3 > L1) {TURN_L;}            // 3が白のときは左折
                }
         }

  STOP;                                                // スタートライン前で停止

}

プログラムは基本的に「サブルーチン」と「while」を主にして定数を使い

定数は「round」を周回確認用に

   「cross」を交差点確認用に定義しました。

『cross』は

  • 1がスタートライン
  • 2が1つ目の交差点
  • 3,4が近道の出入口(1)
  • 5,6が2,3つ目の交差点
  • 7,8が近道の出入口(2)
  • 9が最後の交差点       を示しています。

線に沿って走るプログラムはすぐにできたのですが、 近道に入るところのプログラムが最初うまくできず苦労しました。

反省・感想

みるく

今回は、ロボットを作る作業は、前回に比べて楽だったけど、プログラムがすごい苦労しました。まず、どんなプログラムを組めばいいのか全く分からなかったので、とりあえず、基本の動きをプログラムして、あとは少し無理やりな感じになってしまいました。次の課題はもう少しまともにできたらいいとおもいます。

仁野

ロボット製作については4輪では機動性がよくないと思い3輪のロボットを考えました。 モーターと連動している2つの車輪の軸の真ん中に光センサーがあると 反応してからの行動が少なくてすむのではないかと思ったのでそのように設計しました。

プログラムについては、whileを使いすぎたかなと思います。 でも、今どこのプログラムを実行しているかは分かりやすいのでその点はよかったと思います。

今回、回転センサーをロボットにとりつけたものの、使用できませんでした。 理由としては、最初、回転センサーを使いプログラムを考えたのですが、数値の設定が上手く行かず、最終的に使わない方が成功しやすかったからです。次回の課題では使いこなせるようにしたいです。

コメント

  • プログラムについては、まだ工夫ができると思います。また、ロボットの説明をさらに詳しく書くと良いと思います -- TAKA? 2010-12-24 (金) 16:43:29
  • プログラムに関しては、ライントレースの部分が何度も出てきますが、サブルーチンや関数を用いることですっきりできると思います。また、時間なり回転センサーを用いて、2周目のゴール直前で止まることが課題なので、そこもなおしてみてください。ロボットのほうの説明は書くべき点を書いていると思います -- FI? 2011-01-08 (土) 02:55:00


添付ファイル: fileline2.jpg 208件 [詳細] fileline.JPG 271件 [詳細] filerobo3.jpg 288件 [詳細] filerobo2.jpg 251件 [詳細] filerobo1.jpg 241件 [詳細]

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