2006a/B6
2006a/MemberOnly/進行状況B

光を追いかけるロボット

メンバー

  • さんさー     :プログラム担当
  • ゆかいな仲間たち :ロボット担当
  • HAL       :HP担当

ロボット

1.jpg
  • 今回の光を追いかけるロボット
  • 部品を減らし、軽量&単純化
  • 小さいので小回りも利きます
2.jpg
  • 正面から撮影
  • 正面にセンサーを二つ設置
  • ライントレースの時と違いセンサーを正面に向けてみる
3.jpg
  • 後ろから撮影
  • 少し高くして本体を固定
  • これで転ばなくなりました

プログラム

光を追いかけるプログラム     byさんさー

#define go_straight OnFwd(OUT_A+OUT_C);       //前進のプログラムを定義する

task main ()
{
     SetSensor(SENSOR_1, SENSOR_LIGHT);
     SetSensor(SENSOR_3, SENSOR_LIGHT);
     while (true){
         go_straight;                         //何もないときは前進する
         if (SENSOR_1 <  SENSOR_3) {          //センサ−1よりセンサ−3のが強い光を感知したとき
             OnFwd(OUT_A);                    //右側のタイヤを止めて、右に曲がる
             Off(OUT_C);
         } else {                             //そうでない場合
             Off(OUT_A);                      //左側のタイヤを止めて、左に曲がる
             OnFwd(OUT_C);
         }
     }
}

第九     byさんさー

#define C 523                                 //周波数と音の設定:ド
#define D 587                                 //        :レ
#define E 659                                 //        :ミ
#define F 698                                 //        :ファ
#define G 784                                 //        :ソ


task play_music()
{
    while (true){
        PlayTone(E,30); Wait(35);             //  ミ
        PlayTone(E,30); Wait(35);             //  ミ
        PlayTone(F,30); Wait(35);             //   ファ
        PlayTone(G,30); Wait(35);             //    ソ
        PlayTone(G,30); Wait(35);             //    ソ
        PlayTone(F,30); Wait(35);             //   ファ
        PlayTone(E,30); Wait(35);             //  ミ
        PlayTone(D,30); Wait(35);             // レ
        PlayTone(C,30); Wait(35);             //ド
        PlayTone(C,30); Wait(35);             //ド
        PlayTone(D,30); Wait(35);             // レ
        PlayTone(E,30); Wait(35);             //  ミ
        PlayTone(E,60); Wait(65);             //  ミ
        PlayTone(D,15); Wait(20);             // レ
        PlayTone(D,30); Wait(35);             // レ
        Wait(30);                             //休符
        
        PlayTone(E,30); Wait(35);             //  ミ
        PlayTone(E,30); Wait(35);             //  ミ
        PlayTone(F,30); Wait(35);             //   ファ
        PlayTone(G,30); Wait(35);             //    ソ
        PlayTone(G,30); Wait(35);             //    ソ
        PlayTone(F,30); Wait(35);             //   ファ
        PlayTone(E,30); Wait(35);             //  ミ
        PlayTone(D,30); Wait(35);             // レ
        PlayTone(C,30); Wait(35);             //ド
        PlayTone(C,30); Wait(35);             //ド
        PlayTone(D,30); Wait(35);             // レ
        PlayTone(E,30); Wait(35);             //  ミ
        PlayTone(D,60); Wait(65);             // レ
        PlayTone(C,15); Wait(20);             //ド
        PlayTone(C,60); Wait(65);             //ド
        Wait(60);                             //終
        }
}

1,光源を見失った時には曲を演奏しながらぐるっと旋回して光源を探す  byさんさー

#define turn_left OnRev(OUT_A);OnFwd(OUT_C);  //左回転のプログラムを定義する
#define go_straight OnFwd(OUT_A+OUT_C);       //前進のプログラムを定義する
#define C 523                                 //周波数と音の設定:ド
#define D 587                                 //        :レ
#define E 659                                 //        :ミ
#define F 698                                 //        :ファ
#define G 784                                 //        :ソ


task play_music()                             //上記した第九の演奏プログラム
{
    while (true){
        PlayTone(E,30); Wait(35);
        PlayTone(E,30); Wait(35);
        PlayTone(F,30); Wait(35);
        PlayTone(G,30); Wait(35);
        PlayTone(G,30); Wait(35);
        PlayTone(F,30); Wait(35);
        PlayTone(E,30); Wait(35);
        PlayTone(D,30); Wait(35);
        PlayTone(C,30); Wait(35);
        PlayTone(C,30); Wait(35);
        PlayTone(D,30); Wait(35);
        PlayTone(E,30); Wait(35);
        PlayTone(E,60); Wait(65);
        PlayTone(D,15); Wait(20);
        PlayTone(D,30); Wait(35);
        Wait(30);
        
        PlayTone(E,30); Wait(35);
        PlayTone(E,30); Wait(35);
        PlayTone(F,30); Wait(35);
        PlayTone(G,30); Wait(35);
        PlayTone(G,30); Wait(35);
        PlayTone(F,30); Wait(35);
        PlayTone(E,30); Wait(35);
        PlayTone(D,30); Wait(35);
        PlayTone(C,30); Wait(35);
        PlayTone(C,30); Wait(35);
        PlayTone(D,30); Wait(35);
        PlayTone(E,30); Wait(35);
        PlayTone(D,60); Wait(65);
        PlayTone(C,15); Wait(20);
        PlayTone(C,60); Wait(65);
        Wait(60);
        }
}


task main ()                                   //メインプログラム
{
     SetSensor(SENSOR_1, SENSOR_LIGHT);
     SetSensor(SENSOR_3, SENSOR_LIGHT);
     while(true){
         start play_music ;                    //第九の演奏開始
         while (SENSOR_1+SENSOR_3 < 70){       //センサ−1とセンサ−3を足した値が70より小さければ
             turn_left;                        //左に回転する
         }
         while (SENSOR_1+SENSOR_3 > 70){       //センサ−1とセンサ−3を足した値が70より大きければ
             stop play_music;                  //第九の演奏をやめて
             go_straight;                      //前進する

             if (SENSOR_1 <  SENSOR_3) {       //以下は"光を追いかけるプログラム"と同じ
                 OnFwd(OUT_A);
                 Off(OUT_C);
             } else {
                 Off(OUT_A);
                 OnFwd(OUT_C);
             }
         }
     }
}

上記のプログラムに『光源に近づき過ぎると停止する』という機能を追加する     byさんさー

#define turn_left OnRev(OUT_A);OnFwd(OUT_C);   //左回転のプログラムを定義する
#define go_straight OnFwd(OUT_A+OUT_C);        //前進のプログラムを定義する
#define G2 392                                 //周波数と音の設定:低いソ
#define C 523                                  //        :ド
#define D 587                                  //        :レ
#define E 659                                  //        :ミ
#define F 698                                  //        :ファ
#define G 784                                  //        :ソ


task play_music()                              //上記した第九の演奏プログラム+α
{
    while (true){
        PlayTone(E,30); Wait(35);
        PlayTone(E,30); Wait(35);
        PlayTone(F,30); Wait(35);
        PlayTone(G,30); Wait(35);
        PlayTone(G,30); Wait(35);
        PlayTone(F,30); Wait(35);
        PlayTone(E,30); Wait(35);
        PlayTone(D,30); Wait(35);
        PlayTone(C,30); Wait(35);
        PlayTone(C,30); Wait(35);
        PlayTone(D,30); Wait(35);
        PlayTone(E,30); Wait(35);
        PlayTone(E,60); Wait(65);
        PlayTone(D,15); Wait(20);
        PlayTone(D,30); Wait(35);
        Wait(30);
        
        PlayTone(E,30); Wait(35);
        PlayTone(E,30); Wait(35);
        PlayTone(F,30); Wait(35);
        PlayTone(G,30); Wait(35);
        PlayTone(G,30); Wait(35);
        PlayTone(F,30); Wait(35);
        PlayTone(E,30); Wait(35);
        PlayTone(D,30); Wait(35);
        PlayTone(C,30); Wait(35);
        PlayTone(C,30); Wait(35);
        PlayTone(D,30); Wait(35);
        PlayTone(E,30); Wait(35);
        PlayTone(D,60); Wait(65);
        PlayTone(C,15); Wait(20);
        PlayTone(C,60); Wait(65);
        Wait(30);
        
        PlayTone(D,30); Wait(35);             // レ
        PlayTone(D,30); Wait(35);             // レ
        PlayTone(E,30); Wait(35);             //  ミ
        PlayTone(C,30); Wait(35);             //ド
        PlayTone(D,30); Wait(35);             // レ
        PlayTone(E,15); Wait(20);             //  ミ
        PlayTone(F,15); Wait(20);             //   ファ
        PlayTone(E,30); Wait(35);             //  ミ
        PlayTone(C,30); Wait(35);             //ド
        PlayTone(D,30); Wait(35);             // レ
        PlayTone(E,15); Wait(20);             //  ミ
        PlayTone(F,15); Wait(20);             //   ファ
        PlayTone(E,30); Wait(35);             //  ミ
        PlayTone(D,30); Wait(35);             // レ
        PlayTone(C,30); Wait(35);             //ド
        PlayTone(D,30); Wait(35);             // レ
        PlayTone(G2,50); Wait(55);            //低いソ
        Wait(30);                             //
        
        PlayTone(E,30); Wait(35);
        PlayTone(E,30); Wait(35);
        PlayTone(F,30); Wait(35);
        PlayTone(G,30); Wait(35);
        PlayTone(G,30); Wait(35);
        PlayTone(F,30); Wait(35);
        PlayTone(E,30); Wait(35);
        PlayTone(D,30); Wait(35);
        PlayTone(C,30); Wait(35);
        PlayTone(C,30); Wait(35);
        PlayTone(D,30); Wait(35);
        PlayTone(E,30); Wait(35);
        PlayTone(D,60); Wait(65);
        PlayTone(C,15); Wait(20);
        PlayTone(C,60); Wait(65);
        Wait(60);
        }
}


task main ()
{
     SetSensor(SENSOR_1, SENSOR_LIGHT);
     SetSensor(SENSOR_3, SENSOR_LIGHT);
     while(true){
         start play_music ;                   //第9の演奏開始
         while (SENSOR_1+SENSOR_3 < 70){      //センサ−1とセンサ−3を足した値が70より小さければ
             turn_left;                       //左に回転する
         }
         while (SENSOR_1+SENSOR_3 > 70){      //センサ−1とセンサ−3を足した値が70より大きければ
             if(SENSOR_1+SENSOR_3 < 140){     //さらに、センサ−1とセンサ−3を足した値が140より小さければ
                 stop play_music ;            //第9の演奏をやめて
                 go_straight;                 //直進する
                 if (SENSOR_1 <  SENSOR_3) {  //以下は"光を追いかけるプログラム"と同じ
                     OnFwd(OUT_A);
                     Off(OUT_C);
                 } else {
                     Off(OUT_A);
                     OnFwd(OUT_C);
                 }
             } else {                          //センサ−1とセンサ−3を足した値が140より大きければ
                 Off(OUT_A+OUT_C);             //停止する
             }  
         }
     }
}

苦労・工夫した点,反省

課題3−1に関して

  • ロボットが光センサーを二基搭載していたため、左右のセンサーの明るさを比べることにより光を追跡するプログラム自体は比較的簡単に作ることができた。
  • 光を追いかけるプログラムを元に、感知する光の量が一定以下(光を見失う)になった時旋回して光を探すプログラムにすれば良いと考えた。
  • 光が一定以下になったとき、違う動きをするというのプログラムを最初は全部ifでやろうとしたが、うまく違う動きに移ることができなかった。
  • ifだった部分をwhileに書き換えたら、うまく次の動作にうつることができた。
  • if,whileについての認識が甘かったのが今回の反省。しかし、試行錯誤により、両者の違いを知ることができた。

課題3−4に関して

  • 止まらせるプログラムにwhileを多用したら、繰り返しのループから抜けないので、次の動作に移らずifにしたらちゃんと動くようになった。
  • センサーを一つから二つにすることによって、より細かく光を追いかけられるようになった。
  • 曲を長くする事により、プログラムがむだに重くなったが後悔はしていない。
  • 今回は比較的プログラムが思い通りにできたので、体感製作時間が短かった。

ロボットに関して

  • 前の課題2左のときのロボットがかなり大型な印象だったので、元々作ってあったドライブベースを参考にして小型のものを作ろうと思った。
  • 前の課題のドライブベースをそのまま利用したために製作時間がとても短くなってしまったのと、オリジナリティがなくなってしまった。
  • シンプルを目指して製作し、目標は達成できたと思うが、最終的にロボットは写真に撮ってホームページにのせればよいので、余った時間を利用して少し手を加えてみてもよかったと思う。
  • 光センサーの上にNQCの本体がかぶって、影ができることによりプログラムに何らかの影響がないように考えて完成型に至ったけれど、机の下の少し暗い場所で試行錯誤を繰り返したために、このことは最終的にはあまり関係がなかった。
  • ロボットの形状によるプログラムへの悪影響がなかったのでよかった。

  • 何かあれば書き足してってください。後でまとめて編集します -- HAL? 2006-07-12 (水) 22:19:47

感想

  • さんさー    :今回でプログラムは引退します。
  • HAL       :そろそろ誰かホームページ代わって下さい...泣
  • ゆかいな仲間たち:大変申し訳ありませんでした。盛り上げ役は今回をもちまして引退させていただきます。これからは第二の人生への一歩を強く踏み出したいと思います。

コメント

  • 音楽を演奏するタスクの中のコメント文はうまく工夫しましたね。 -- 松本(教員)? 2006-07-04 (火) 14:36:45
  • コメント文で笑いました。 -- ゆき(TA)? 2006-07-07 (金) 17:03:49


添付ファイル: file3.jpg 222件 [詳細] file2.jpg 210件 [詳細] file1.jpg 190件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-09-04 (月) 16:37:33