[[2006a/TeamOnly/進行状況C]]
#hr
CENTER:&size(30){〜光を追いかけるロボットを作る〜};
#hr
*今回の課題の内容 [#hf45b5ea]
 &color(yellow,black){懐中電灯の光を追いかけて進むロボット};を製作し、以下の中から&color(red){2種類以上};のプログラムを作成する。

+光源を見失った時には曲を演奏しながらぐるっと旋回して光源を探す
+光源を見失った時には明るさに比例した周波数の音を出しながら旋回して光源を探す
+光源を見失っていないときにはある曲を演奏し、見失った時には別の曲を演奏しながら光源を探す
+上記のいずれかに『光源に近づき過ぎると停止する』という機能を追加する

ただし支給されているモータ、光センサ、タッチセンサはいくつ使ってもよい。
 →&color(red){今回は1と3を選択しました。};

-&size(20){目次};

#contents
***&size(15){制作者}; [#u5e8262d]
たかくん
ほたる
サルバカ

***&size(15){ページ製作開始日 6月30日}; [#a80efaf5]

*プログラムの概要 [#xad16a29]
**照度が最大の方を向くプログラムについて [#rab13c10]
まず、光の強さ(以後照度とする)が最大のところを感知して、その方向に向くプログラムについてである。これは、ロボットが一周する間に、光センサーによって、毎回照度を感知し、より大きい照度をみつけたら、そこでどんどん塗り替えていって、最終的に最大の照度のところを決める。その最大照度の値を変数として記憶する。さらに、その最大照度のところまでの回った時間を記憶して、その値も変数として記憶する。さらにその最大照度のところへ向くために、一周の時間からその最大照度までの時間を引いただけの時間、回る。

**光の後を追いかけるプログラムについて [#ma5d484a]
次に、最大照度のところを向いた後に、その光の後を追っていくプログラムについてである。光センサーを2つ使った。(光センサー1、2)2つの光センサーをまっすぐ前に向けて、まず最初に光の最大のところを読み取るときにセンサー1、2、1+2のそれぞれについて最大の照度を同時に読み取らせる。これによって、1+2の値が最大値になったときには、直進する。また、光源がロボットからみて、左に移動したとき、1の照度が、先ほど測定した最大の照度より上昇し、かつ、2の照度が最大の照度より低下しているときには、左に旋回するようにする。これは、光源が左に移動したときには、センサー1の方が強く光があたり、センサー2の方が、弱く光があたるからである。右に旋回するときには、センサー1が最大値より低く、センサー2は、最大値より高くなればよい。また、最後に、、光を見失ったときにまた旋回して光源を探すものである。これは、光源を見失ってから、旋回して、先ほどの最初に測った最大の照度の値のところを見つけたら、もうそこへ向かっていくものである。光を見失ってからまた一回転せずに、最大のところを見つけたらもうそこで向かって行ってしまう。これは、センサー1と2の照度がともに非常に低くなったら(具体的な照度を入力する)旋回するというものである。そうしてから、また最大と同じ照度のところを見つけたら、そこで直進する。
次に、最大照度のところを向いた後に、その光の後を追っていくプログラムについてである。光センサーを2つ使った。(光センサー1、2)2つの光センサーをまっすぐ前に向けて、まず最初に光の最大のところを読み取るときにセンサー1、2、1+2のそれぞれについて最大の照度を同時に読み取らせる。これによって、1+2の値が最大値になったときには、直進する。また、光源がロボットからみて、左に移動したとき、1の照度が、先ほど測定した最大の照度より上昇し、かつ、2の照度が最大の照度より低下しているときには、左に旋回するようにする。これは、光源が左に移動したときには、センサー1の方が強く光があたり、センサー2の方が、弱く光があたるからである。右に旋回するときには、センサー1が最大値より低く、センサー2は、最大値より高くなればよい。また、最後に、、光を見失ったときにまた旋回して光源を探すものである。これは、光源を見失ってから、旋回して、先ほどの最初に測った最大の照度の値のところを見つけたら、もうそこへ向かっていくものである。光を見失ってからまた一回転せずに、最大のところを見つけたらもうそこで向かって行ってしまう。これは、センサー1と2の照度がともに非常に低くなったら(具体的な照度を入力する)旋回するというものである。そうしてから、また最大と同じ照度のところを見つけたら、そこで直進する。

**音楽を流すプログラムについて [#g34027d7]
次に、音楽を流すプログラムについてである。まず、旋回するときに流す音楽はキラキラ星で、まず、周波数をドレミごとに定義する。そして、そのドレミをプログラムでくみ、その流れる長さも設定し、さらにその音が重ならないように、音の長さよりもWaitで長くする。それで作った音楽をtask mainで流していく。音楽を流すプログラムは、それを始めたら、止めるまでずっと続くプログラムである。これは、光を見失った条件のところに、音楽を流し始めるプログラムを入れ、他の直進するときや、左や右に旋回するときの条件のときには、音楽を止めるプログラムを入れる。

**課題3の、2つの音楽を流すプログラムについて [#r1b9d0eb]
また、課題3についてである。こちらは、旋回するときの音楽とは別に、光についていってるときにも別の音楽を流す。このときには、課題1のときより光についていくときのプログラムを改良した。光源が、ロボットから向かって左に向かったときには、センサー1の照度の方が、センサー2の照度よりも大きくなるときであるとした。また、2つの音楽を流すときのプログラムついてである。旋回するときには、キラキラ星で、光についていってるときには、メリーさんの羊である。これは、2つの音楽の動作をtask play musicとtask play music_2として区別し、stopとstartを駆使してどちらの音楽も同時に流れないようにした。
 
 
 
*我が子(ロボ)の成長日記 [#w6fcba57]
&ref(2006a/C1/課題3右/DSC00313.JPG,20%,タッチセンサー);我が子は初めは暴れん坊でした

まずスムーズに旋回できるようかなりスリムアップしました&ref(2006a/C1/課題3右/DSC00314.JPG,20%,ライントレース);

そして光を見つけやすいように光センサーを2つ搭載
 
*&color(blue){プログラム}; [#a5f84111]
**光源を見失った時には曲を演奏しながらぐるっと旋回して光源を探す [#b9289fb4]
 #define Do  262   //音程を定義
 #define Re  294
 #define Mi  330
 #define Fa  349
 #define So  392
 #define La  440


 task play_music()   //音楽はキラキラ星
 {
    while(true)
    {
    PlayTone(Do,25);Wait(30);
    PlayTone(Do,25);Wait(30);
    PlayTone(So,25);Wait(30);
    PlayTone(So,25);Wait(30);
    PlayTone(La,25);Wait(30);
    PlayTone(La,25);Wait(30);
    PlayTone(So,25);Wait(60);
    PlayTone(Fa,25);Wait(30);
    PlayTone(Fa,25);Wait(30);
    PlayTone(Mi,25);Wait(30);
    PlayTone(Mi,25);Wait(30);
    PlayTone(Re,25);Wait(30);
    PlayTone(Re,25);Wait(30);
    PlayTone(Do,25);Wait(50);
    PlayTone(So,25);Wait(30);
    PlayTone(So,25);Wait(30);
    PlayTone(Fa,25);Wait(30);
    PlayTone(Fa,25);Wait(30);
    PlayTone(Mi,25);Wait(30);
    PlayTone(Mi,25);Wait(30);
    PlayTone(Re,25);Wait(50);
    PlayTone(So,25);Wait(30);
    PlayTone(So,25);Wait(30);
    PlayTone(Fa,25);Wait(30);
    PlayTone(Fa,25);Wait(30);
    PlayTone(Mi,25);Wait(30);
    PlayTone(Mi,25);Wait(30);
    PlayTone(Re,25);Wait(50);
    }
 }




 #define t 260   //定数tを決める
 int light_max;   //変数を定義
 int light_max_1;
 int light_max_2;
 int time_max;

 void turn_right(int u)   //右に曲がる
 {
    OnFwd(OUT_C);   
    OnRev(OUT_A);
    Wait(u);
    Off(OUT_A+OUT_C);
 }

 void turn_left(int v)   //左に曲がる
 {
    OnFwd(OUT_A);
    OnRev(OUT_C);
    Wait(v);
    Off(OUT_A+OUT_C);   
 }


 task main()
 {
     SetSensor(SENSOR_1,SENSOR_LIGHT);   //センサーの定義
     SetSensor(SENSOR_2,SENSOR_LIGHT);
     stop play_music; 
   
     OnFwd(OUT_C);   //マシンを回転
     OnRev(OUT_A);
   
     light_max=SENSOR_1+SENSOR_2;
     light_max_1=SENSOR_1;
     light_max_2=SENSOR_2;
   
     ClearTimer(0);   //タイマーをクリアーする
   
    while(FastTimer(0)<t)   //以下のプログラムをt以下の時間で無限ループ
    {
       if(SENSOR_1+SENSOR_2>light_max)   //センサー1+センサー2がライトマックスより大きければ
       {
          light_max=SENSOR_1+SENSOR_2;   //ライトマックスは入れ替わる
          time_max=FastTimer(0);   //時間を覚える
       }
       if(SENSOR_1>light_max_1)   //センサ−1がライトマックス1より大きければ
       {
          light_max_1=SENSOR_1;   //ライトマックス1は入れ替わる
       }
       if(SENSOR_2>light_max_2);   //センサ−2がライトマックス2より大きければ
       {
          light_max_2=SENSOR_2;   //ライトマックス2は入れ替わる
       }
    }
  turn_left(t-time_max);   //一番明るかった所に向く
 
  while(true)  //以下のプログラムを無限ループ
  {
     while(SENSOR_1+SENSOR_2>light_max-10)   //ライトマックス−10よりセンサ−1+センサ−2が大きければ
     {
        OnFwd(OUT_A+OUT_C);   //直進
        stop play_music;
     }
     while(SENSOR_1>SENSOR_2+10)   //センサ−2+10よりセンサ−1が大きければ
     {
        turn_left(10);   //左へ
        stop play_music;
     }
     while(SENSOR_1+10<SENSOR_2)   //センサ−1+10よりセンサ−2が大きければ
     {
        turn_right(10);   //右へ
        stop play_music;
     }
     while(SENSOR_1<50&&SENSOR_2<50);   //センサ−1が50以下かつセンサ−2が50以下ならば
     {
        OnFwd(OUT_A);   //回転して光源を探す
        OnRev(OUT_C);
        start play_music;   //光源を探す間キラキラ星をながす
     }
  }
  stop play_music;
 }



**光源を見失っていないときにはある曲を演奏し、見失った時には別の曲を演奏しながら光源を探す [#l7b4cc5a]
 #define Do  262   //音程を定義
 #define Re  294
 #define Mi  330
 #define Fa  349
 #define So  392
 #define La  440


 task play_music_2()   //音楽はメリーさんの羊   
 {
    while (true)
    {
        PlayTone(Mi,25); Wait(30);  
        PlayTone(Re, 5); Wait(10);  
        PlayTone(Do,15); Wait(20);
        PlayTone(Re,15); Wait(20);
        PlayTone(Mi,15); Wait(20);
        PlayTone(Mi,15); Wait(20);
        PlayTone(Mi,35); Wait(40);
        PlayTone(Re,15); Wait(20);
        PlayTone(Re,15); Wait(20);
        PlayTone(Re,35); Wait(40);
        PlayTone(Mi,15); Wait(20);
        PlayTone(So,15); Wait(20);
        PlayTone(So,35); Wait(40);
        PlayTone(Mi,25); Wait(30);
        PlayTone(Re, 5); Wait(10);
        PlayTone(Do,15); Wait(20);
        PlayTone(Re,15); Wait(20);
        PlayTone(Mi,15); Wait(20);
        PlayTone(Mi,15); Wait(20);
        PlayTone(Mi,35); Wait(40);
        PlayTone(Re,15); Wait(20);
        PlayTone(Re,15); Wait(20);
        PlayTone(Mi,25); Wait(30);
        PlayTone(Re, 5); Wait(10);
        PlayTone(Do,55); Wait(60);
        Wait(20);
    }
 }

 task play_music()   //音楽はキラキラ星  
 {
   while(true)
   {
       PlayTone(Do,25);Wait(30);
       PlayTone(Do,25);Wait(30);
       PlayTone(So,25);Wait(30);
       PlayTone(So,25);Wait(30);
       PlayTone(La,25);Wait(30);
       PlayTone(La,25);Wait(30);
       PlayTone(So,25);Wait(60);
       PlayTone(Fa,25);Wait(30);
       PlayTone(Fa,25);Wait(30);
       PlayTone(Mi,25);Wait(30);
       PlayTone(Mi,25);Wait(30);
       PlayTone(Re,25);Wait(30);
       PlayTone(Re,25);Wait(30);
       PlayTone(Do,25);Wait(50);
       PlayTone(So,25);Wait(30);
       PlayTone(So,25);Wait(30);
       PlayTone(Fa,25);Wait(30);
       PlayTone(Fa,25);Wait(30);
       PlayTone(Mi,25);Wait(30);
       PlayTone(Mi,25);Wait(30);
       PlayTone(Re,25);Wait(50);
       PlayTone(So,25);Wait(30);
       PlayTone(So,25);Wait(30);
       PlayTone(Fa,25);Wait(30);
       PlayTone(Fa,25);Wait(30);
       PlayTone(Mi,25);Wait(30);
       PlayTone(Mi,25);Wait(30);
       PlayTone(Re,25);Wait(50);
    }
 }
 

 #define t 260   //定数tを決める
 int light_max;   //変数を定義
 int light_max_1;
 int light_max_2;
 int time_max;

 void turn_right(int u)   //右へ曲がる
 {
   OnFwd(OUT_C);   
   OnRev(OUT_A);
   Wait(u);
   Off(OUT_A+OUT_C);
 } 

 void turn_left(int v)   //左へ曲がる
 {
   OnFwd(OUT_A);
   OnRev(OUT_C);
   Wait(v);
   Off(OUT_A+OUT_C);   
 }


 task main()
 {
   SetSensor(SENSOR_1,SENSOR_LIGHT);   //センサーの定義
   SetSensor(SENSOR_2,SENSOR_LIGHT);
    
   OnFwd(OUT_C);   //マシンを回転
   OnRev(OUT_A);
   
   light_max=SENSOR_1+SENSOR_2;
   light_max_1=SENSOR_1;
   light_max_2=SENSOR_2;
   
   ClearTimer(0);   //タイマーをクリアーする
   
   while(FastTimer(0)<t)   //以下のプログラムをt以下の時間で無限ループ
   {
      if(SENSOR_1+SENSOR_2>light_max)   //センサ−1+センサ−2がライトマックスより大きければ
      {
         light_max=SENSOR_1+SENSOR_2;   //ライトマックスは入れ替わる
         time_max=FastTimer(0);   //時間を覚える
      }
      if(SENSOR_1>light_max_1)   //センサ−1がライトマックス1より大きければ
      {
         light_max_1=SENSOR_1;   //ライトマックス1が入れ替わる
      }
      if(SENSOR_2>light_max_2)   //センサ−2がライトマックス2より大きければ
      {
         light_max_2=SENSOR_2;   //ライトマックス2が入れ替わる
      }
   }
  turn_left(t-time_max);   //一番明るかった所に向く
 
  while(true)   //以下のプログラムを無限ループ
  {
    start play_music_2;   //光を追っている間はメリーさんの羊をながす
    while(SENSOR_1+SENSOR_2>light_max-10)   //ライトマックス−10よりセンサ−1+センサ−2が大きければ
    {
       OnFwd(OUT_A+OUT_C);   //直進
       stop play_music;
    }
    while(SENSOR_1>SENSOR_2+10)   //センサ−2+10よりセンサ−1が大きければ
    {
       turn_left(10);   //左へ
       stop play_music;
    }
    while(SENSOR_1+10<SENSOR_2)   //センサ−1+10よりセンサ−2が大きければ
    {
       turn_right(10);   //右へ
       stop play_music;
    }
    stop play_music_2;
    while(SENSOR_1<50&&SENSOR_2<50);   //センサ−1が50以下かつセンサ−2が50以下ならば
    {
        OnFwd(OUT_A);   //回転して光源を探す
        OnRev(OUT_C);
        start play_music;   //光源を探す間キラキラ星をながす
    }
  }
  stop play_music;
 }


*ロボット・プログラム制作過程での&color(blue,yellow){問題点};と解決策 [#gc129313]
++&color(blue,yellow){旋回に摩擦の負荷がかかる};
 →四輪構造をやめ、二輪だけにし支えを作って三点支点構造にした。支えの摩擦を減らすために曲面を持つパーツを使用。
++&color(blue,yellow){光の方を向かない};
 →ライトセンサーを2つ付け、それぞれについてライトマックスをはからせることにした。
++&color(blue,yellow){光の方を向くロボットから、光の方についていくロボットを作る};
 →そのためには、ロボットが右、左の方向を感知しないといけないと思い、光センサーを2つつけた。そして、それぞれの光センサーについて、(2つの合計についても)照度の最大値を読み取り、それより低くなったかどうかで光源の移動を読み取り、それについていくようにした。これは、最初の光の最大値を読み取るプログラムの課題があったので、そこのからの発想として最大値をそれぞれのセンサーについて調べてそれと比較することとした。
++&color(blue,yellow){光についていく、その感度をよくする};
 →光源が左に移動したときには、センサー1が照度が最大値より上昇し、かつ、センサー2が最大値より低下するという条件として、より、それぞれ、左、右、直進するときの条件を厳しくした。しかし、その感度を上げるために、課題3では、左に向きたいときには、センサー1の方が2より大きいときとした。それで感度は上昇したものの、その条件が、重なってしまって、それによって逆にうまく動いてくれないときもあった。例えば、光を見失ったときには、その条件は、センサー1も2もともに50以下のときとした。また、左に向かうときには、センサー1の方がセンサー2よりも照度が大きいとした。これにより、センサー1の方が2よりも大きかったとしても、ともに照度が50よりも低かったときには、どちらの条件にも当てはまってしまう。懐中電灯も、ロボットも全く動かないかなくても、照度はコロコロ変わるものであって、様々な条件に変わってしまう。そこで、その照度の差の条件を大きくした。つまり、センサー2よりも1の方がより大きな照度がない限り、左に動かないなどした。これは、センサー2の照度の値よりも、照度が10足されたものよりもセンサー1の値が大きいときなどというようにした。
++&color(blue,yellow){プログラム自体も、今回は高度なものとした};
 →while(true)として、無限ループとした中に、さらにwhileの条件として何度も繰り返して行うプログラムとした。
++&color(blue,yellow){キラキラ星の音楽をプログラムする};
 →キラキラ星の楽譜をインターネット上からもっとこようとしたが、うまく載っているものがなく、図書館にある、楽譜の載った音楽の本を探してそこから使った。
++&color(blue,yellow){音楽が早すぎてよく何の音楽かが分からない};
 →音楽の早さをWaitで遅くした。
++&color(blue,yellow){音楽が2つ同時に再生した};
 →再生させたくない所にはstop play_musicを入れまくった。
++&color(blue,yellow){プログラムが長くなった};
 →関数を使う事により幾分短くした。
*反省点 [#y4b93437]
 ロボットの作り始めはテキストをモデルに&color(red){基本構造を四輪車にした};。そしてプログラムを作る過程で旋回時間を調べることになったが&color(red){本体が回転しなかった};。そこで本体を&color(red){二輪構造に作り直し};、そこから本格的にプログラム作りに取りかかったので&color(red){他のチームに出遅れた};。
**反省を踏まえてロボコンに活かしたいこと [#gff1481d]
 今までの課題をやってきて本体自体の重心や床との摩擦、パーツはめ込みの強さなどが動作に大きく影響することがわかった。
*コメント欄 [#t91375ec]
 コメントをどうぞ
-ようやくタイヤの向きが固定されている四輪構造をあきらめていただくことができてホッとしています。 -- [[松本(教員)]] &new{2006-07-11 (火) 10:36:53};
-字が小さくて、読みにくいです・・・ -- [[ゆき(TA)]] &new{2006-07-14 (金) 11:53:26};
-読みやすくなりました。ありがとう。ところで、長文もいいのですが、長くなりそうなときは構造化することで、読みやすくなりますよ。段落を分けてみるとか、副見出しをつけるとか。 -- [[ゆき(TA)]] &new{2006-07-20 (木) 11:10:35};

#comment

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS