[[2007a/MemberOnly/進行状況A]]
#contents
*ライン・トレース・ロボット [#z3a0f3c5]
黒い線に沿って走るロボットを作成した。A4Rの班と、一つのコースで二つのロボットが走るコースを作った。
*ロボット紹介 [#k75fc585]
*ロボット紹介(光センサーが一つ) [#k75fc585]
タッチセンサーの下に光センサーを取り付けたロボット。
#ref(2007a/A4/課題2左/TS3C0001.JPG)
*制作過程Part1 [#hc04852f]
**1:光センサー一つのロボット作成 [#sc2255f3]

僕たちのグループでは、初めに光センサーが一つのロボットを作成してみた(上の写真のロボット)。なぜなら、ほとんどのグループが光センサーを二つ使っていたので、なんとか一つでやってみたかったからである。 

**2:コースで走らせよう [#u5352988]

できあがった光センサーが一つのロボットをコースで走らせた時、重大なミスに気づいた。それは左カーブか右カーブのどちらか一つしか動くことができないということだ。僕たちのグループでは光センサーが黒い線から外れると右のタイヤが動くようにプログラミングをしたので、右カーブを曲がることができなっかた。しかし、光センサーが一つのロボットは急カーブも簡単に曲がることができるというメッリトがあったので、センサーが一つのままで改良をしてみた。

**3:改良 [#dac961c3]

光センサーが一つのロボットではどうやっても左右のカーブに対応してくれなかった。そこで、タイマーを使ってみた。右カーブに入る直前までの時間を計り、そこから右に曲がれるプログラムを取り入れてみた。初めは良いと思ったこの改良だったが、ロボット同士の衝突や交差点での一時停止などを考慮すると、右カーブ直前までの時間が少しずつ変わってしまい、うまく曲がることはできなっかた。僕たちは改めてロボットを作り直すことにした。

*新ロボット(光センサー二つ) [#ad3ec446]
光センサーが二つあるどんなカーブにも対応できるロボット↓

#ref(2007a/A4/課題2左/TS3C0004.JPG)




*製作過程Part2 [#u7b552c8]
**1:光センサー二つのロボット作成 [#g6a5672f]

土台は前ロボットのままで、前方に光センサーを二つ取り付けた。↓

#ref(2007a/A4/課題2左/TS3C0005.JPG)



**2:メリット [#m9bafa30]

光センサーが一つの時と違い、左右どちらのカーブにも対応することが可能である。

交差点を判断することができるので、一時停止などのプログラムにも対応できる。



**3:デメリット [#hfccc881]

急なカーブを曲がることができない。

**4:まとめ [#ue9dc629]

光センサーが二つの方が、作ったコースをうまく走ることができるし、どんなプログラムにもしっかり対応できるロボットになった。

*苦労した点 [#u66b42a9]
タッチセンサーと光センサーを同じ場所に取り付けるのに苦労した。光センサーが地面に近すぎると、うまく明るさを認識できずに走らなかったり、遠すぎるとずっと走り続けたりした。最終的にはちょうど良い位置(地面から5センチくらい)を見つけることができた。

光センサー一つのロボットの時while のループの中に until (SENSOR_3==1); というプログラムを作ってしまいロボットが動かなかった。間違いを指摘していただき、先生に感謝しています。ありがとうございます。今度は自分たちで気づけるようにしたい。


*プログラム [#c3f2ae2f]
 #define THRESHOLD 40
 #define Do  523
 #define Re  587
 #define Mi  659
 #define Fa  698
 #define Sol 784

 task play_music()                               // 走行時に鳴る音楽のプログラム
 {
     while(true)
     {
        PlayTone(Mi,25); Wait(15); 
        PlayTone(Re, 5); Wait(5);  
        PlayTone(Do,15); Wait(10);  
        PlayTone(Re,15); Wait(10);
        PlayTone(Mi,25); Wait(15);        //ミ 
        PlayTone(Re, 5); Wait(5);                //レ
        PlayTone(Do,15); Wait(10);               //ド
        PlayTone(Re,15); Wait(10);               //レ

        PlayTone(Mi,15); Wait(10);
        PlayTone(Mi,15); Wait(10);
        PlayTone(Mi,35); Wait(20);
        PlayTone(Mi,15); Wait(10);               //ミ 
        PlayTone(Mi,15); Wait(10);               //ミ
        PlayTone(Mi,35); Wait(20);               //ミ

        PlayTone(Re,15); Wait(10);
        PlayTone(Re,15); Wait(10);
        PlayTone(Re,35); Wait(20);
        PlayTone(Re,15); Wait(10);               //レ
        PlayTone(Re,15); Wait(10);               //レ
        PlayTone(Re,35); Wait(20);               //レ

        PlayTone(Mi,15); Wait(10);
        PlayTone(Sol,15); Wait(10);
        PlayTone(Sol,35); Wait(20);
        PlayTone(Mi,15); Wait(10);               //ミ
        PlayTone(Sol,15); Wait(10);              //ソ
        PlayTone(Sol,35); Wait(20);              //ソ

        PlayTone(Mi,25); Wait(15);
        PlayTone(Re, 5); Wait(5);
        PlayTone(Do,15); Wait(10);
        PlayTone(Re,15); Wait(10);
        PlayTone(Mi,25); Wait(15);               //ミ
        PlayTone(Re, 5); Wait(5);                //レ
        PlayTone(Do,15); Wait(10);               //ド
        PlayTone(Re,15); Wait(10);               //レ

        PlayTone(Mi,15); Wait(10);
        PlayTone(Mi,15); Wait(10);
        PlayTone(Mi,35); Wait(20);
        PlayTone(Mi,15); Wait(10);               //ミ
        PlayTone(Mi,15); Wait(10);               //ミ
        PlayTone(Mi,35); Wait(20);               //ミ

        PlayTone(Re,15); Wait(10);
        PlayTone(Re,15); Wait(10);
        PlayTone(Mi,25); Wait(15);
        PlayTone(Re, 5); Wait(5);
        PlayTone(Re,15); Wait(10);               //レ
        PlayTone(Re,15); Wait(10);               //レ
        PlayTone(Mi,25); Wait(15);               //ミ
        PlayTone(Re, 5); Wait(5);                //レ

        PlayTone(Do,55); Wait(30);
   }    
        PlayTone(Do,55); Wait(30);               //ド           }    
 }    

 task main ()
 {
 SetSensor(SENSOR_1,SENSOR_LIGHT);       // センサー1は光センサーである
 SetSensor(SENSOR_3,SENSOR_TOUCH);     //   センサー3はタッチセンサーである
task main ()
{
 SetSensor(SENSOR_1,SENSOR_LIGHT);
  SetSensor(SENSOR_2,SENSOR_LIGHT);
 SetSensor(SENSOR_3,SENSOR_TOUCH);
 

 
 while(true) 
 {
        start play_music;                             // 音楽スタート       
       if(SENSOR_1<THRESHOLD) {             //   センサー1が40以上なら
       OnFwd(OUT_A);                                
       Off(OUT_C);
       }
          else                                               //   それ以外
          {       
          Off(OUT_A);
          OnFwd(OUT_C);
           }
          until (SENSOR_3==1);                    //    センサー3が反応したとき
    Off(OUT_A+OUT_B);Wait(270);
    stop play_music;                                  //     音楽停止
       start play_music;       //音楽スタート
       
       while (SENSOR_3==0){          //センサー3が働いていない時、以下を実行
          if(SENSOR_1<THRESHOLD) {  //センサー1が黒線上にある時
              OnFwd(OUT_A);     //モーターAを正回転
              Off(OUT_C);      //モーターCを停止
          } 
          if(SENSOR_2<THRESHOLD)   //センサー2が黒線上にある時
           {                
             Off(OUT_A);       //モーターAを停止
            OnFwd(OUT_C);      //モーターCを正回転
         }else{           //それ以外
            OnFwd(OUT_A+OUT_C);}   //モーターAとCを停止
     }
    while  (SENSOR_3==1){      //センサー3が働いた時、以下を実行
    stop play_music;         //音楽停止    
    Off(OUT_A+OUT_C);        //AとCのモーター停止
    OnRev(OUT_A+OUT_C);Wait(130);}  //AとCのモーターを逆回転させる
    
    }  
    
 }
*感想 [#c0c44a14]
黒い線が光に反射してしまい、練習ではうまくセンサーが線を認識できずに大変だった。

音楽の鳴らすタイミングのプログラムがなかなか上手くできなくrて少し苦労した。
音楽の鳴らすタイミングのプログラムがなかなか上手くできなくて少し苦労した。

光センサーが一つのロボットをコースでうまく走らせることができなくて残念だった。
*コメントをどうぞ [#ja4dc233]
-もう少し"過程"の説明があると面白い物に仕上がると思います。 -- [[ヒロヤ]] &new{2007-06-21 (木) 13:02:08};
-while のループの中に until (SENSOR_3==1); という命令がありますが、この命令があるとタッチセンサーが反応するまで次の命令に進むことができず、ライントレースを行うことができないのではないでしょうか。もう一度、プログラムの流れをよく考えてみてください。 -- [[松本]] &new{2007-06-26 (火) 08:57:49};

#comment


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