1全方向から光を探して、光の方向へブロックを投げるロボットを作れ。光を探したら、懐中電灯の30cm以内に近づかない範囲でブロックを投げる。
2懐中電灯をゆっくり動かしたとき光に向かって進み、一定の距離まで近づいて懐中電灯を狙ってブロックを投げるロボットを作れ。
「スガ」と「かおりん」の二人
右側と左側のギアの数を、奇数と偶数にする作業が大変でした。 両側のギアの数を揃えてしまうと、下の写真のディファレンシャルギアをつけたロボットでは両輪が一緒に前進したり、後進する動きしかできなくなるため、回転できなくなってしまうからです。 奇数偶数にすることによって回転できるし、前進もOnFwdとOnRevを繰り返すことで可能になります。
円滑に回転をするように前輪を一つにして三輪型ロボットにしました。 その際に、前輪を高くしすぎるとモーターの重さでうまく動くことが できなくなってしまうので、微妙に調節をしてちょうどよい高さに したことも工夫の一つです。
電池を代えたばかりで、ギアを止めるためのストッパーが抑えきれなくなることがたびたびあったので、あまり動くことのないように隙間を狭くしました。
光センサーは右側と左側の間にブロックをつけることで表面から浴びる光のみ反応するようにしました。
#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 ホイールを投げる }
#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); } } }
Off(OUT_A); //センサーが一定の距離に近づいたら止まる throw //ブロックを投げる }
今回はロボットの製作に時間がかかり大変でした。特にギアを付けるところはなかなかギア同士がかみ合わなくて何度も作りなおしました。「ロボットの工夫」のところにも書きましたが、前輪を付けるにあたっても回転の円滑さを優先したかったので、そこも苦労しました。ロボット製作の担当が僕かおりんで、プログラムを主にスガが担当していたので、効率よく動けていたと思います。あまり得意でなかったロボット製作やプログラミング作りに一生懸命取り組むことができたのでよかったです。「かおりん」
モーターが一つしかなく前進させるためのプログラムが大変でした。なかなか真っ直ぐに進むことができずに何度も試しました。光センサーの値を二つ定めたらプログラムを簡単にすることができました。 「スガ」
コメントをお願いします。