***[[学習ノート Hypodytes rubripinnis>2005/A5/学習ノート Hypodytes rubripinnis]] [#a6156c61]
***課題3:光を追いかけるプログラム[[課題4右>2005/A5/課題4右]] [#k8e692f9]

''アクセス数:今日&counter(today); 総数&counter(all);''
''アクセス数:今日&counter(today); 総数&counter(all);   最終更新日:&lastmod;''

*光を追いかけるプログラム『センサー1個ver.』                  &size(30){&color(red){'''movie'''''↓''};}; [#u005afe1]

 作成者:Hypodytes rubripinnis

 #define go_straight OnFwd(OUT_A+OUT_C);       //直進
 #define turn_right OnFwd(OUT_A);OnRev(OUT_C); //右旋回
 #define turn_left OnFwd(OUT_C);OnRev(OUT_A);  //左旋回
 #define minus 15                              //マイナス
 
 int max;   //maxを定義
 int time;  //timeを定義
 
 task main()
 {
     SetSensor(SENSOR_2,SENSOR_LIGHT);   //センサー2:光センサー   
     SetSensor(SENSOR_2,SENSOR_LIGHT);   //センサー2:光センサー
 
     max=SENSOR_2;                       //センサー2をmaxに指定
 
     time=Timer(0);                      //timeをタイマー0に指定
     ClearTimer(0);                      //タイマー0をリセット
     while(Timer(0)<=14)                 //タイマー0が14以下の時
     {
         turn_right                      //右旋回
         if(SENSOR_2>max)                //センサー2が最大値以上なら
           {
            ClearTimer(1);               //タイマー1をリセット
            max=SENSOR_2 ;               //センサー2を最大値に指定
           }
         else                            //そうでなければ
           {
            max=max;                     //maxをそのまま
            time=Timer(1);               //timeをタイマー1に指定
           }
    }
 
    ClearTimer(1);                       //タイマー1をリセット
    while(Timer(1)<=time)                //timeがタイマー以下の時
    {turn_left}                          //左旋回
 
    while(true)
    {
         if(SENSOR_2>=max-minus)         //センサー2が最大値-minus以上の時
         if(SENSOR_2>=max-minus)         //センサー2が最大値−マイナス以上の時
           {go_straight}                 //直進
         if(SENSOR_2<max-minus)          //センサー2が最大値-minus未満の時
         if(SENSOR_2<max-minus)          //センサー2が最大値−マイナス未満の時
           {
            turn_right                   //右旋回
            ClearTimer(2);               //タイマー2をリセット
            until((SENSOR_2>=max-minus)||(Timer(2)==5));  //センサー2が最大値-minus以上、またはタイマー2が5まで
            until((SENSOR_2>=max-minus)||(Timer(2)==5));  //センサー2が最大値−マイナス以上、またはタイマー2が5まで
           }
         if(SENSOR_2<max-minus)          //まだセンサー2が最大値-minus未満の時
         if(SENSOR_2<max-minus)          //まだセンサー2が最大値−マイナス未満の時
           {
            turn_left                    //左旋回
            until(SENSOR_2>=max-minus);  //センサー2が最大値-minus以上まで
            until(SENSOR_2>=max-minus);  //センサー2が最大値−マイナス以上まで
           }
    }
 }

''仕組み&工夫したところ''
-まず本体については、センサーの角度を斜めにして感度を良くしたところです(赤矢印)。
-プログラムでこだわったのは、決められた値以上の光に向かって行くのではなく、最大値を探し出し、その光源に向かって行くようにしたところです。
-難しかったところは、1周して光の最大値を見つけ出すところでした。最終的には簡単でシンプルなプログラムでスムーズに見つけ出すことが出来るようになりました。
-光の方向に向かって軌道修正する時は、きっちり最大値を入力してしまうとうまく動かないので、minusを引くことで、数値に幅を持たせました。
-光源の方向に旋回する時は、右に少し旋回して、その後左に旋回するようにすると効率よく光源を見つけることが出来ました。

&size(30){☆[['''movie1''':http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=robo5.wmv&refer=2005%2FA5%2F%B3%D8%BD%AC%A5%CE%A1%BC%A5%C8%20Hypodytes%20rubripinnis%2F%B8%F7%A4%F2%C4%C9%A4%A4%A4%AB%A4%B1%A4%EB%A5%ED%A5%DC%A5%C3%A5%C8%A1%D8%A5%BB%A5%F3%A5%B5%A1%BC%A3%B1%B8%C4ver.%A1%D9]]};

&size(30){☆[['''movie2''':http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=robo5-2.wmv&refer=2005%2FA5%2F%B3%D8%BD%AC%A5%CE%A1%BC%A5%C8%20Hypodytes%20rubripinnis%2F%B8%F7%A4%F2%C4%C9%A4%A4%A4%AB%A4%B1%A4%EB%A5%ED%A5%DC%A5%C3%A5%C8%A1%D8%A5%BB%A5%F3%A5%B5%A1%BC%A3%B1%B8%C4ver.%A1%D9]]};

&ref(2005/A5/学習ノート Hypodytes rubripinnis/光を追いかけるロボット『センサー1個ver.』/robo5-2.JPG,30%);
&ref(2005/A5/学習ノート Hypodytes rubripinnis/光を追いかけるロボット『センサー1個ver.』/robo5.JPG,30%);

#comment


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