2006a/B6課題3左

光を追うロボット

メンバー

  • 偏頭痛(HP担当)
  • 偽プログラマー(プログラム担当)
  • ロボット制作者(株)(ロボ作り担当)

制作時間

約15時間

今回の目標

  • 課題3では、光源を見失った時には曲を演奏しながらぐるっと旋回して光源を探すプログラムと、光源を見失っていないときにはある曲を演奏し、見失った時には別の曲を演奏しながら光源を探すプログラムの作製に挑みます。 より円滑に、そして確実な動きを目指します。

ロボ紹介

060706_174448_M.jpg
  • メインは説明書に載っているシンプルな作りです。
  • 前方に光センサーを一つ。後方には余ったパーツでプロペラを設置しました。一応回ります。
  • 班員からの一言です。
    • 課題に必要な機能はものはライトセンサーだけなので基本構造はシンプルに作製。後ろの変なやつは無視の方向で、、、。by偏頭痛
    • こいつの必殺は回転プロペラです。ちゃんと動くんですよ。それに逆回転もするし、従って(以下略)by偽プログラマー
    • 結構でかいです!!最初はこんなはずじゃなかったのに…偽プログラマーのせいで…byロボット制作者(株)
      060714_1443~01.jpg
  • センサー二つバージです。
  • とてもシンプルな作りになってます。
  • プロペラは重いのでなくしました。完全に走らせるためだけのロボです。

進行手順と考察

メインとなるプログラム作り

音を無視して光を追わせるために作ったものです。  

  • まずtimerとlight_maxを使って作ってみたが、一周回って機能停止した。
    • 原因がわからなかったので、その二つを省いて一からプログラムを作ったところ、しっかり光を追いかけた。
  • センサーの感度が悪くたまに無視する。
    • 反応する数値を48に下げ、問題を改善した。
  • よってこのプログラムを今回の課題の基礎として使うことに決定。

音がなるように設定

  • とりあえずtask_mainの中に音のプログラムを入れてみる。
    • 音が止まることなく流れ続けてしまった。
  • taskを分けないといけないと知り新たなtaskに音用のプログラムを作った。
    • 目標は完全に沈黙.....原因解明を急ぐ。
  • play_musicを書き込んだ位置がいけないのかと思いプログラムの中で移動してみる。
    • error地獄からぬけだせない。
      • わからないので別の方法を探すことに。
  • 先輩たちのホームページをあさっていたところvoidという記号を発見。さっそくまねて使ってみる。
    • 音は流れたが、今度はなぜか光に反応しなくなった。神は二物を与えない。
  • プログラムを見直し、いらないwaitやoffなどが混ざっていないか探してみる。
    • until,whileがあると動かなくなると気づいたので、なくしてみた。
      • 動いたが処理速度が遅い。ライトを1秒ほどあてていないと反応しない。こいつは鈍すぎる。
  • モーターの出力を低くして処理速度を上げてみた。
    • スピードを犠牲にして改善に成功。
  • 意味も無くプロペラが回るプログラムを作成。
  • 完成。プロペラの回転が妙にマッチしいい出来になった。
    • 一つ問題点として光を探すとき常に時計回りに回転するので逆方向に逃げる光を追えないことに気づく。

センサー2つバージョン

  • センサー一個のプログラムを参考にして二個にした場合も作製。
    • 反応したセンサーにより旋回方向を変更し、より光の追跡性能を高めようとした。
      • 処理速度の遅さにより思うように動かない。
  • task_main内にvoidを入れると重くなると指摘を受けtask musicを作成
  • 光センサーは50で反応するようセットし、旋回時間は150が一番よい結果になった。
  • 両方の光センサーに光が当たると前進の機能も加えた。
  • どちらに逃げる光に対しても反応可能になった。結果この課題には光センサー二つの方が適していると分かった。

プログラム

試しに、音は出ないけど光を追いかけるプログラムを作った。

製作者 偽プログラマー

task main() 
 {
         SetSensor(SENSOR_2,SENSOR_LIGHT);
         while(true){       
         { OnFwd(OUT_A);//旋回
           OnRev(OUT_C);}
        if(SENSOR_2>50){//センサー2が明度50以上を感知したら
         { OnFwd(OUT_A+OUT_C);//前進
           Wait(100);}//しばらくそのまま
                        }
                        }
 }

 

 

光を見失ったら音を鳴らし旋回するプログラム 

製作者 偽プログラマー

void TRUN_music()
            {PlaySound(SOUND_UP);Wait(100);}//サウンドを定義
     
#define TRUN OnFwd(OUT_C);OnRev(OUT_A);//TRUNを右旋回と定義
#define GO   OnFwd(OUT_A+OUT_C);//GOを直進と定義
task main()
 {       SetPower(OUT_A+OUT_C,1);//モーターの出力設定
         SetSensor(SENSOR_2,SENSOR_LIGHT);
         while(true){{OnFwd(OUT_B);}//プロペラ旋回
                 {OnFwd(OUT_A);
                  OnRev(OUT_C);}{TRUN_music();}//旋回、音が流れる
         if(SENSOR_2>48){{OnRev(OUT_B);}プロペラ逆回転
                       OnFwd(OUT_A+OUT_C);Wait(100);//48以上なら前進
                                    }
                                       }
  }

光が無い時とある時で流れる音が変わるプログラム

制作者 偽プログラマー

void TRUN_music()
              {PlaySound(SOUND_UP);Wait(100);}//旋回時の音を定義
void GO_music()
              {PlaySound(SOUND_FAST_UP);Wait(50);}//直進時の音を定義
     
#define TRUN   OnFwd(OUT_C);OnRev(OUT_A);//旋回を定義
#define GO     OnFwd(OUT_A+OUT_C);//直進を定義

task main()
 {             SetPower(OUT_A+OUT_C,1);//モーター出力設定
               SetSensor(SENSOR_2,SENSOR_LIGHT);
               while(true){{OnFwd(OUT_B);}
                {OnFwd(OUT_A);
                 OnRev(OUT_C);}{TRUN_music();}//旋回、音が流れる。
               if(SENSOR_2>48){{OnRev(OUT_B);}//48以上なら前進
                 OnFwd(OUT_A+OUT_C);Wait(100);
               GO_music();}//前進時に違う音を鳴らす
                          }      
 }

センサー二つのプログラム

制作者 偽プログラマー

task main()
 {            SetPower(OUT_A+OUT_C,2);//ここら辺はいつも通り                                                                         SetSensor(SENSOR_1,SENSOR_LIGHT);
              SetSensor(SENSOR_3,SENSOR_LIGHT);
              while(true){
                         {OnFwd(OUT_A);
                          OnRev(OUT_C);}//旋回し光を探す。
        
               if(SENSOR_1>50)
                         {OnFwd(OUT_C);
                          Off(OUT_A);Wait(150);}//左旋回
                         
               if(SENSOR_3>50)
                         {OnFwd(OUT_A);Off(OUT_C);
                          Wait(150);  }//右旋回
      
               if((SENSOR_1>50)&&(SENSOR_3>50))
                         {OnFwd(OUT_A+OUT_C);
                          Wait(150);}//両方に当たると前進     
                         }                  
 }
   
task music()
 {
                while(true){
                 {PlaySoun (SOUND_FAST_UP);}               
                                       
                if(SENSOR_1>50)
                 {PlaySound(SOUND_LOW_BEEP);Wait(150);}//センサーが明度50以上感知したら、低音を鳴らす
                                   
                 if(SENSOR_3>50)
                  {PlaySound(SOUND_LOW_BEEP);Wait(150);}//センサーが明度50以上感知したら、低音を鳴らす                  

                            }
 }

結果

  • 完成予定日にはセンサー一つのバージョンのみしかできていなかったため、完璧とは言えない状態でした。でもその後も暇を見つけ改造を進めることで良いできになったと思います。若干の感度不足は否めないもののしっかりと光りを追いかけてくれました。流れる音楽は単純な効果音なのですが、あまりにも長時間聞き続け愛着もわきました。多くのミスなどもあり長時間の作成となりましたが、課題3も何とか達成と言う結果に漕ぎ着けることができました。

感想、反省

  • すっげ〜疲れた!!皆頑張った!!あははははははははは!!
  • taskに関数がいくつも入ると読み込みが遅くなること、モーターの出力の変換方法、など、実体験をもって知ることができた。
  • ホームページのレイアウト、各項目の内容の濃さ、などなど色々と学ばなければいけないことが多いなと思った。
  • 先生にアドバイスばかり求めず、できる限り自分たちで考えようと先輩のホームページなども参考にしたり、班員で話し合って作業を進めることができた。少し完成まで遠回りになってしまったが、ロボコンに向け良い練習になった。
  • 関数の複数使用やtask musicの使用法など基本的なミスが多く、進行の妨げになった。見直し、基礎の確認などきちんとやっていきたい。
  • 今回の課題で最も大きなミスはセンサー一つでのプログラムを作った時点で満足してしまったことである。ロボコンではより複雑で、高度な行動をさせなければならない。常に完壁を求めた作業が結果を左右する。その点を忘れないようにしたい。
  • 以上の点など今回学んだことをロボコンに生かして生きたい。

コメント

  • このホームページのどこがいけないのでしょうか? -- うんの? 2006-07-21 (金) 14:53:39
  • もう少しレポートとしての体裁を整えた方がよいと思います。例えば・・・ ソースコード: 読みにくい。インデントや改行を考慮してください。  考察: もっと実のあることを書いてほしい。 -- ゆき(TA)? 2006-07-21 (金) 16:20:08


添付ファイル: file060714_1443~01.jpg 199件 [詳細] file060706_174448_M.jpg 182件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-08-26 (土) 20:07:01 (4746d)