#contents

*目的 [#t83d66c2]
インストの「top secret」を参考にして、白いホイールを投げるロボットを作成し、~
以下の動きをするようにプログラムを作成せよ。 ~
(重複しないように一人一つ以上のプログラムを作成すること)~

   1. 全方向から懐中電灯の方向を探しだし、懐中電灯の手前50cmまで進んで懐中電灯を狙ってブロックを投げる。懐中電灯は動かさない。
   2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいて懐中電灯を狙ってブロックを投げる。



*マシン [#jcb36dbd]
*前に二つのタイヤ、後ろにキャスターを付け、一つのギアで前進&回転するようにした。~
駆動部分のギアとして、ディファレンシャル・ギアを使った。


全体図:~
全体的にコンピュータ部分くらいの大きさにまとまった。~
前後にセンサとキャスターが出ている。~
&ref(090121_223719.jpg);


ギア部分:~
ディファレンシャル・ギア~
&ref(090121_223904.jpg);


投擲部分:~
これが向かって反時計回りに回転し、その勢いでホイールを投擲する。~
&ref(090121_223802.jpg);


後ろキャスター:~
大事な本体の支え。~
&ref(090121_223840.jpg);


*プログラム [#ld3bf57b]

***明かりに向かってホイールを投げるプログラム [#e551bf2f]
(担当:メガネ3号)

 void go_straight(int t)
 {
 OnFwd(OUT_B);
 Wait(t);
 Off(OUT_B);
 }
 void go_turn(int_t)
 {
 OnRev(OUT_B);
 Wait(t);
 Off(OUT_B);
 }
 #define HIKARI 50   //光がある方向の閾値を50に設定 
 #define ATARI 85   //懐中電灯に到達したときの閾値を85に設定
 task main()
 {
 	SetSensor(SENSOR_1,SENSOR_LIGHT);
 	SetSensor(SENSOR_3,SENSOR_LIGHT);
 	while(SENSOR_1<HIKARI)  //SENSOR_1が懐中電灯を発見するまで回転
 	{
 	go_turn(3);                //モーターを通常通り回すと回転がはやすぎるので     
 	Wait(15);         //回転:無回転=1:5の割合でモーターを回す
 	}	
 	while(SENSOR_1<ATARI)   //センサーが懐中電灯に達したと判断するまで
 	{
 	if(SENSOR_1<SENSOR_3)
 	{
 	go_turn(15);
 	go_straight(40);
 	}
 	else
 	{
 	go_turn(45);
 	go_straight(40);
 	}
 	go_turn(30);		   //後ろを向いて
 	go_straight(100);	   //約50cm進み
 	go_turn(30);		   //更に後ろを向いて	
 	OnFwd(OUT_A);		  //ホイールを投げる
 	Wait(10);
 	Off(OUT_A);
 } 

***動く明かりを追いかけ、停止したら投げるプログラム [#mfd6631e]
(担当:メガネ1)

 #define SHOOT OnFwd(OUT_A);Wait(10);Off(OUT_A); //ホイールを投げる
 #define THRESHOLD 40 //閾値
 int count_up;

 void GO(int t)//前進用
 {
 OnFwd(OUT_B);
 Wait(t);
 Off(OUT_B);
 } 

 void TURN(int t)//回転用
 {
 OnRev(OUT_B);
 Wait(t);
 Off(OUT_B);
 } 


 task main ()
 {
 SetSensor(SENSOR_1,SENSOR_LIGHT);//ライトセンサ:右
 SetSensor(SENSOR_3,SENSOR_LIGHT);//ライトセンサ:左
 SetPower(OUT_A,1);
 count_up = 0;
 
 while(1){
 if ((SENSOR_1 < THRESHOLD)&&(SENSOR_3 < THRESHOLD))//右も左も明かりを関知しない場合
 {
 count_up = 0;
 TURN(5);
 Wait(20);
 }           //前進する
 if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 < THRESHOLD)&&(count_up==0))//明かりを関知し、かつカウントをしていない時
         {
         count_up = count_up + 1;
         Wait(100);
         }//カウントを入れ、明かりが動くか待つ
         if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD)&&(count_up==1))//明かりを関知し、かつカウントが入っているとき
         {
         Off(OUT_B);
         SHOOT
         } //止まって投げる
 }
 }

*感想/反省 [#r7e4579c]

・作業時間があまりとれず、とても難しかった。~
・マシン本体は当初前後に長かったのだが、それをコンパクト化することでバランスをとれるようにした。~
・時折ギアが滑り不安だったが、いくらきちんとはめても改善されないため、もしかしたらわずかに摩耗しているのかもしれないと思う。~
 改善策としてはきっちり適切にはめる以外の方法を模索中。~
・閾値を設定せず、相対的に明るい地点を探し出すようにさせるプログラムがなかなか思いつかず、~
 結局閾値を設定することにしてしまった。~

*コメントをどうぞ [#d12d711f]
- 光源まで進んで50cmまで戻るというのはユニークだと思います。相対的に最も明るい方向を見つけるには1つ光センサを使う場合と2つ使う場合があります。前者の場合一回転する間に変数を使って最大値を記憶し、次に最大値を感じるところまで光センサかタイマーを使って回転します。後者の場合、左の方が光が強ければ左に回転し、右の方に光が強ければ右に回転し、両者とも同じくらいの光になったら、その方向に光源があったと判断できます。 -- [[FI]] &new{2009-02-14 (土) 15:54:16};

#comment

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS