[[2009a]] *目次 [#k94cf6e3] #contents *課題3 [#fa3afe77] 1全方向から光を探して、光の方向へブロックを投げるロボットを作れ。光を探したら、懐中電灯の30cm以内に近づかない範囲でブロックを投げる。 2懐中電灯をゆっくり動かしたとき光に向かって進み、一定の距離まで近づいて懐中電灯を狙ってブロックを投げるロボットを作れ。 **メンバー [#u6cd602b] 「スガ」と「かおりん」の二人 **ロボットの工夫 [#z5348fb4] 右側と左側のギアの数を、奇数と偶数にする作業が大変でした。 両側のギアの数を揃えてしまうと、下の写真のディファレンシャルギアをつけたロボットでは両輪が一緒に前進したり、後進する動きしかできなくなるため、回転できなくなってしまうからです。 奇数偶数にすることによって回転できるし、前進もOnFwdとOnRevを繰り返すことで可能になります。 #ref(2009a/A9/課題3右/200907171658000.jpg) #ref(2009a/A9/課題3右/200907101818000.jpg) 円滑に回転をするように前輪を一つにして三輪型ロボットにしました。 その際に、前輪を高くしすぎるとモーターの重さでうまく動くことが できなくなってしまうので、微妙に調節をしてちょうどよい高さに したことも工夫の一つです。 #ref(2009a/A9/課題3右/200907101816000.jpg) 電池を代えたばかりで、ギアを止めるためのストッパーが抑えきれなくなることがたびたびあったので、あまり動くことのないように隙間を狭くしました。 光センサーは右側と左側の間にブロックをつけることで表面から浴びる光のみ反応するようにしました。 **プログラム [#e7d1e500] ***全方向から光を探しブロックを投げるプログラム(かおりん) [#ue39b323] #dehine TURN_TIME 350 一周を3.5秒と定義する #define throw OnFwd(OUT_B);Wait(40);Off(OUT_B); ホイールを投げる動作を定義する task main () { int hikari_max=0; 光の最も大きな場所を探すため、最大値を定義する int t_max=0; SetSensor(SENSOR_1,SENSOR_LIGHT); 光センサーは左右の一つ使用する ClearTimer(0); OnFwd(OUT_A); 回転する while(FastTimer(0)<TURN_TIME ) { if(SENSOR_1>hikari_max); 正面の光センサーが最も大きな光を感知した場合 { hikari_max=SENSOR_1 その光の大きさを決定する t_max=FastTimer(0); } OnRev(OUT_A); Wait(TURN_TIME-t_max); 先ほど感知した光のもとへ戻る Off(OUT_A); } throw ホイールを投げる } ***光を探し追いかけてブロックを投げるプログラム(スガ) [#r74216af] #define THRESHOLD 40 //周囲から光を探す値を40に定義 #define shoot 60 //ブロックを投げる位置までの値を60に定義 #define throw OnFwd(OUT_B);Wait(40);Off(OUT_B); //ブロックを投げるプログラム task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーにセット SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3を光センサーにセット while((SENSOR_1=shoot)||(SENSOR_3=shoot)) //投げる値になるまで繰り返す { if(SENSOR_1>THRESHOLD) { if(SENSOR_3>THRESHOLD) //センサー1が明るく、センサー3も明るい時、光の方向に進む { OnFwd(OUT_A); Wait(20); Float(OUT_A); OnRev(OUT_A); Wait(20); Float(OUT_A); } else //回転して光を探す { OnRev(OUT_A); } } else { if(SENSOR_3>THRESHOLD) //回転して光を探す { OnFwd(OUT_A); } else { OnRev(OUT_A); } } while(true) { if((SENSOR_1=shoot)||(SENSOR_3=shoot)); //センサーが一定の距離に近づいたら止まる Off(OUT_A); throw //ブロックを投げる } } } Off(OUT_A); //センサーが一定の距離に近づいたら止まる throw //ブロックを投げる } **感想 [#u907f50a] 今回はロボットの製作に時間がかかり大変でした。特にギアを付けるところはなかなかギア同士がかみ合わなくて何度も作りなおしました。「ロボットの工夫」のところにも書きましたが、前輪を付けるにあたっても回転の円滑さを優先したかったので、そこも苦労しました。ロボット製作の担当が僕かおりんで、プログラムを主にスガが担当していたので、効率よく動けていたと思います。あまり得意でなかったロボット製作やプログラミング作りに一生懸命取り組むことができたのでよかったです。「かおりん」 モーターが一つしかなく前進させるためのプログラムが大変でした。なかなか真っ直ぐに進むことができずに何度も試しました。光センサーの値を二つ定めたらプログラムを簡単にすることができました。 「スガ」 **コメント [#z7baef69] - コメントよろしくお願いします。 -- [[かおりん]] &new{2009-07-14 (火) 22:26:54}; - かおりんさんのプログラム、インデントをいれて見やすくしていただきたいです。また、ロボットについて、「ギアの数を、奇数と偶数にする作業が大変でした」とのことですが、なぜ奇数と偶数にしたのか、またそうするとどのように動くのかの説明が欲しいです。 -- [[こさか]] &new{2009-07-17 (金) 04:30:13}; - ディファレンシャルギアを装備したために、ギアの数をずらしました。再度見てください -- [[かおりん]] &new{2009-07-17 (金) 17:31:36}; - 松本先生曰く、今回の課題は絶対的に明るい方向を探すのではなく、変数を用いて相対的に最も明るい方向を探す課題だそうです。つまり、一つ目のプログラムだと、懐中電灯に近い方向にも投げてしまう恐れがあります。 -- [[FI]] &new{2009-08-05 (水) 13:26:38}; - 更新しました。評価をよろしくお願いします。 -- [[かおりん]] &new{2009-08-06 (木) 00:02:47}; - ディファレンシャルギアの説明が丁寧になっていて良いです。かおりんさんのプログラムについて、光の最大値を求めるあたりが少し怪しいです。例えば、一度「右25、左25」という光を察知したとき、hikari_max=SENSOR_1+SENSOR_3でhikari_maxは50になってしまいますので、その後「右30、左30」の光を察知しても、より強い光だと認識できません。スガさんのプログラムは、内側のwhile(true)のループから抜け出す条件がないので、無限ループになってしまっているのではないでしょうか?ちゃんと動くのか不安です。 -- [[こさか]] &new{2009-08-09 (日) 23:23:21}; - 松本先生がおっしゃってた、シンプルなプログラムを元に、光センサーを正面につけました。 -- [[かおりん]] &new{2009-08-11 (火) 07:19:02}; - 更新しました。whileのところに条件をつけました。 -- [[スガ]] &new{2009-08-11 (火) 10:44:09}; - 一つ目のwhileを抜け出した時点で、(SENSOR_1=shoot)||(SENSOR_3=shoot)となっているので、その時に投げたいならifも2つめのwhileもいらず、throwとすればよいです。ifの命令がありませんし、whileからやっぱり抜け出せていません -- [[FI]] &new{2009-08-12 (水) 19:11:30}; #comment コメントをお願いします。