ロボット課題3

設計

車体

CIMG0938.JPG

   ↑↑全体
写真中央にあるのが発射台です。
左上の青いブロックが光センサーで懐中電灯の光を感知します。

CIMG0939.JPG

   ↑↑RCX

プログラム

1.懐中電灯に向かって投げる

#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.懐中電灯を追っていき投げる

#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              //投げる
}

作成者:中立な稲妻


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

訂正

#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

#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);  //止まる
}

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

プログラム2

中立な稲妻

 task main()
 {
 SetSensor(SENSOR_1,SENSOR_LIGHT);
 SetSensor(SENSOR_3,SENSOR_LIGHT);
 while(ture)
 {
 if(SENSOR_1!=SENSOR_3)  //二つの光センサーの値が等しくないとき、すなわち、懐中電灯に向かっていない時
 {
 Off(OUT_B);  //前進を停止
 OnFwd(OUT_A);  //探す
 }
 else  //探した時
 {
 Off(OUT_A); //探すことを停止
 OnFwd(OUT_B);  //進む
 }
 until(SENSOR_1>65)  //ある程度の近さ
 Off(OUT_A+OUT_B);
 OnFwd(OUT_C);  //投げる
 }
 }

感想

前回の課題よりは難しくなかったですが、タイマーを使ったプログラムは初めてだったのでちょっと大変でした。
また移動させるためのモーター一つというのも難しい課題でした。

中立な稲妻

かなり難しい課題ですよね。
直接投げる方は簡単ですけど、人並みの設計が嫌いですので、独特な面白い(たぶん?)ロボットを作りました。
輪ゴムを使ったら一番早い初速度を得られるかもしれないですけど、切れたら面倒ですのでその方案を放棄しました。

コメント

お願いします。



添付ファイル: file3-1.jpg 54件 [詳細] file003.jpg 342件 [詳細] file002.jpg 173件 [詳細] file001.jpg 178件 [詳細] fileCIMG0941.JPG 388件 [詳細] fileCIMG0940.JPG 340件 [詳細] fileCIMG0939.JPG 369件 [詳細] fileCIMG0938.JPG 375件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-08-13 (木) 00:43:52