&size(40){ロボット課題3};
#contents
*設計 [#gbe63518]
**車体 [#p3f5477d]

#ref(CIMG0938.JPG)
   ↑↑全体~
写真中央にあるのが発射台です。~
左上の青いブロックが光センサーで懐中電灯の光を感知します。~
#ref(CIMG0939.JPG)
   ↑↑RCX
-目標を探すための回す部分
-誤差を完全回避ための設計
-発射部分が重くて動きにくいのは欠点
#ref(CIMG0940.JPG)
   ↑↑ギアの取り付け部分(後ろ側より)
#ref(CIMG0941.JPG)
   ↑↑ギアの取り付け部分(前側より)~
#ref(3-1.jpg)
-A(1)->B->C->D->E->F->2順
-一つのモータは二つ違う方向の伝送に責任を負う設計
-発射するため早い初速度が必要ため、1まずブロックを押し、2もだんだん棒を抜き出す
-「あ」は発射台を固定するための棒で、「い」は前進するためのモータとギア
 
#ref(003.jpg)
   ↑↑光センサーです。~
~
中立な稲妻のこだわりでオリジナルにこだわりました。~
結構大きいものになりました。~
見た目で感じてもらえると思います!!~

*プログラム [#qc3c2d87]
**1.懐中電灯に向かって投げる [#ee210217]
 #define TURN_TIME    400               //1周の時間を設定
 #define  throw      OnFwd(OUT_A);Wait(1);Off(OUT_A); //投げるときの定義

 task main ()
 {
 SetSensor(SENSOR_1,SENSOR_LIGHT);  // センサ−1をライトセンサーと設定
 SetPower(OUT_C,2);                 //モーターCの出力を制限
 int light_max=0;                   //光の最大値
 int t_max=0;                       //最大値のときの時間
 ClearTimer(0);                     //タイマーを0にして
 OnFwd(OUT_C);                      //探し始めます

 while(FastTimer(0)<TURN_TIME){   //回っている間
    if(SENSOR_1>light_max)        //最大値の光を見つけたら
    {
     light_max=SENSOR_1;          //最大値の光と設定
      t_max=FastTimer(0);         //タイマーを入れる
    }
                              }
 Off(OUT_C);       
 Wait(50);
 OnFwd(OUT_C);
 Wait(t_max);             //最大値の光までまわる
 Off(OUT_C);
 throw                    //投げる
 }

作成者:竹

比較的うまく探すことができました。

**2.懐中電灯を追っていき投げる[#r1be70c8]
 #define TURN_TIME   400                                                 //  1周の時間を設定
 #define  throw      OnFwd(OUT_A);Wait(1);Off(OUT_A);                    // 投げるときの定義
 #define straight    Off(OUT_C);Wait(10);OnFwd(OUT_C);Wait(20);OnRev(OUT_C);Wait(20);  // 近づくときの定義

 task main ()
 {
 SetSensor(SENSOR_1,SENSOR_LIGHT);  // センサ−1をライトセンサーと設定
 SetPower(OUT_C,2);                 //モーターCの出力を制限
 int light_max=0;                   //光の最大値
 int t_max=0;                       //最大値のときの時間
 ClearTimer(0);                     //タイマーを0にして
 OnFwd(OUT_C);                      //探し始めます

 while(FastTimer(0)<TURN_TIME){       //1周しているとき
   if(SENSOR_1>light_max){           //最大値の光にあったら
    light_max=SENSOR_1;               //最大値の光と設定
    t_max=FastTimer(0);               //最大値の光のところまでの時間をはかる
                        }
                              }   
 Off(OUT_C);
 Wait(50);
 OnFwd(OUT_C);
 Wait(t_max);       //最大値の光まで回って
 Off(OUT_C);
 straight           //近づいて
 throw              //投げる
 }

作成者:中立な稲妻
------


課題を当初勘違いしていました。
イメージしてプログラムを作ったので、こちらで評価していただければと思います。

**訂正 [#c1288d94]
 #define THERSHOLD 50        //光の閾値を設定
 #define throw_light 65    //投げるときの光の強さを設定 
 #define  throw      OnFwd(OUT_A);Wait(1);Off(OUT_A);                    // 投げるときの定義
 #define straight    Off(OUT_C);Wait(10);OnFwd(OUT_C);Wait(20);OnRev(OUT_C);Wait(20);  // 近づくときの定義

 task main()
 {
 SetSensor(SENSOR_1,SENSOR_LIGHT);                   //センサー1を光センサーと設定
 SetPower(OUT_C,1);                 //モーターCの出力を1とする 
 while (true){
 if(SENSOR_1<THERSHOLD){               //光が見つからない時
 OnFwd(OUT_C);                    //ぐるぐるまわって探す
                       }
 if((SENSOR_1>THERSHOLD)&&(SENSOR_1<throw_light)){  //光を見つけた時
 Off(OUT_C); 
 straight                                     //近づく
                                                 }
 if(SENSOR_1>throw_light){                      //懐中電灯が止まり、近づいたら
 throw                                            //投げる
                         }
              }
 } 

閾値と最大値の光は過去のを参考にして設定しました。
2のプログラムはタイマーよりも閾値を試行錯誤しながら探しだしてプログラムに使用する方がいいのではないかと
思いました。

**訂正2 [#s067f3df]

 #define THERSHOLD    50         //光の閾値を設定
 #define throw_light  65       //投げるときの光の強さを設定 
 #define throw        OnFwd(OUT_A);Wait(1);Off(OUT_A);                    // 投げるときの定義
 #define straight     Off(OUT_C);Wait(10);OnFwd(OUT_C);Wait(20);OnRev(OUT_C);Wait(20);  // 近づくときの定義
 #define t_RIGHT      OnRev(OUT_A);          //右に曲がるときの定義
 #define t_LEFT       OnFwd(OUT_A);          //左に曲がるときの定義

 task main()
 {
 SetSensor(SENSOR_1,SENSOR_LIGHT);                   //センサー1を光センサーと設定
 SetSensor(SENSOR_3,SENSOR_LIGHT);                   //センサー3を光センサーと設定
 SetPower(OUT_C,1);

 while (true) {
     if((SENSOR_1>THERSHOLD)&&(SENSOR_3>THERSHOLD)){  //センサ1、3が閾値より大きいとき
     straight                                         //前進する
	                         }
     if ((SENSOR_1>THERSHOLD)&&(SENSOR_3<THERSHOLD)){  //センサ1のみが閾値より大きいとき
     t_RIGHT                                         //右に回る 
 			                   }
     if((SENSOR_1<THERSHOLD)&&(SENSOR_3>THERSHOLD)){  //センサ3が閾値より小さいとき
     t_LEFT                                           //左に回る 
                 		    }
     if((SENSOR_1>throw_light)&&(SENSOR_3>throw_light)){  //センサ1、3が共にthrow_lightより大きいとき
     throw   //ブロックを投げる
     break;     //投げたらbreakしてwhileから抜ける
		                	  		}
	   }
     Off(OUT_A+OUT_C);  //止まる
 }

修正点は光センサーを二つにして、左右に懐中電灯が動いたときにも対応できるようにしたところです。


*感想 [#vf513274]
**竹 [#udfb96b2]
 前回の課題よりは難しくなかったですが、タイマーを使ったプログラムは初めてだったのでちょっと大変でした。
 また移動させるためのモーター一つというのも難しい課題でした。
**中立な稲妻 [#rc28ad64]
 かなり難しい課題ですよね。
 直接投げる方は簡単ですけど、人並みの設計が嫌いですので、独特な面白い(たぶん?)ロボットを作りました。
 輪ゴムを使ったら一番早い初速度を得られるかもしれないですけど、切れたら面倒ですのでその方案を放棄しました。
*コメント [#s84efe2d]
お願いします。
- ロボットの方も工夫しているのは良いと思います。2つ目の課題では懐中電灯は懐中電灯が逃げていくので、それを追っていく課題です。過去のページも参考にしてみてください -- [[FI]] &new{2009-08-05 (水) 08:06:05};
- 2つ目の課題を修正しました。イメージになってしまいましたが、課題点なども書いたので再評価お願いします。 -- [[竹]] &new{2009-08-08 (土) 23:40:34};
- ロボットのこだわりがとてもいいです。プログラムについてもよくできています。中立な稲妻さんの訂正バージョンでは、投げた後にwhile文から抜ける処理がないのだけが気になります。 -- [[こさか]] &new{2009-08-09 (日) 22:23:22};
- 中立な稲妻さんの訂正バージョンでは懐中電灯を見つけるのではなく、光センサーの値が50以上になったら回転をやめ65以上まで近づいたら投げるというものだと思います。 --  &new{2009-08-10 (月) 08:06:01};
- 中立な稲妻さんの訂正バージョンでは懐中電灯を見つけるのではなく、光センサーの値が50以上になったら回転をやめ65以上まで近づいたら投げるというものだと思います。 --  &new{2009-08-10 (月) 08:06:42};
- 中立な稲妻さんの訂正2では、「センサ3のみが閾値より大きいとき」は何もしなくなってしまうような気がします。また、「Off(OUT_A+OUT_C);  //止まる」は、whileの外に書かないと、breakの時点でwhileを抜けてしまいますから、実行されません。 -- [[こさか]] &new{2009-08-10 (月) 21:30:41};
- 指摘された点を修正しました。 --  &new{2009-08-10 (月) 23:09:48};
- 訂正2のプログラムでは両方のセンサが光を認識しないとき(=光を見失ったとき)どうするかを書いた方がよりよいと思います。例えば、1つ目の課題のをマクロにして埋め込んでもよいと思います。 -- [[FI]] &new{2009-08-12 (水) 18:39:30};

#comment



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