[[2009a]] *課題3 懐中電灯に向かってブロックを投げるロボット [#tbc17171] メンバー/ ピーチクパーチク~ バビロン~ ライス~ #contents **ロボット [#z5b3b7ea] ***ディファレンシャル・ギア [#ya71b99f] &ref(d_gear01.jpeg);~ この特殊なギアは、内部に含まれるギアを使うことで、一つだけのモーターで左右回転・直進を可能にする優れたものである。~ しかし今回は仕様上、直進機能を除き、ラチェットを使うことで左右回転だけが可能なロボットを作成した。 ***車体 [#fcf519fa] &ref(main01.jpeg); &ref(main02.jpeg); ~ 説明書のトップシークレット、先生に頂いたヒント、先輩の作成したロボットを元に作成。~ モーターからディファレンシャルギアへ力を伝えるためのギアが噛み合わなくて苦労した。~ &ref(main_s01.jpeg); 初期は前輪を装着するつもりだったが、予想外に摩擦力がかかるので、~ タイヤの代わりに支え棒(半球)をふたつ装着。摩擦がほどよく小さくなった。~ タイヤのブレ防止と車軸にかかる力を落とすためにフレームを増強。 ***ブロック投射機 [#l9d331ce] &ref(line01.jpeg);&ref(line02.jpeg); ~ 先輩の作ったレールガンのようなものに惹かれ、ノリで作成。~ 改造点~ ・砲芯の長さを延長~ ・速度上昇のためギア比を変更~ ・撃鉄までの長さを延長~ これらの改造点は、すべてホイールの投射速度と威力を上げるためのものである。~ 強度は弱い。しかしホイールを投げるだけなら十分なのでこれで完成。~ ~ &ref(l_wall00.jpeg); ~ 前方にずれたバランスを整えるため、車体についていた支え棒はこちらに装着。~ また、光センサも内包した投射機となった。 ***調整 [#a2d2bc09] &ref(l_wall02.jpeg);&ref(l_wall01.jpeg); ~ 光センサの感度を左右でおおきく変えるため、光センサの間、投射機にカベのようなものを作成。~ 壁を作ることで、左右どちらのほうが明るいかを比較的正確に判断できるようになる。 ***完成 [#m0ee448d] &ref(comp01.jpeg); ~ まるで戦車砲のようだ。 **プログラム [#n97148c4] ***1・全方向から懐中電灯の方向を探しだし、懐中電灯を狙ってブロックを投げる [#qfda865c] 作成者:バビロン~ ~ しきい値を60としてプログラムを作成した。~ task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); while(true){ if(SENSOR_<60){ //センサーが光を見つけていないとき OnFwd(OUT_B); //その場で回転 } if(SENSOR_1>60){ //センサーが光を見つけたとき Off(OUT_B); //停止 OnRev(OUT_A); //投げる Wait(18); Off(OUT_A); break; //while終了、プログラム停止 } } } ***2・動く懐中電灯に向かって進み、懐中電灯が止まったらブロックを投げる [#ha3e64b6] 作成者:ライス ***3・7秒間懐中電灯を追尾して、最後にブロックを投げるロボット [#x22f2437] 作成者:ピーチクパーチク~ プログラム概要~ 1:一回転して、懐中電灯(光の最大値)の位置を探る~ 2:懐中電灯を追う、見失ったらもう一度位置を探る、近づきすぎたら止まる~ 3:投げる~ int Tmax = 0; //光の最大値を見つけるまでの時間 int Lmax = 0; //光の最大値 sub serch(){ //光の最大値を見つけるプログラム ClearTimer(0); //タイマーセット while ( FastTimer(0) < 300) { SetPower(OUT_B,4); OnFwd(OUT_B); //3秒間回転(一回転) if (SENSOR_3> Tmax){ //回転中常に光の大きさを検索 if (SENSOR_3> Tmax){ //開店中常に光の大きさを検索 Lmax = SENSOR_3; Tmax = FastTimer(0); //光の最大値と、そのときの時間を検索 Tmax = FastTimer(0); // } } SetPower(OUT_B,7); OnRev(OUT_B); //逆回転 Wait(300 - Tmax); //回転時間=3秒-光の最大値を見つけた時間 OnRev(OUT_B); Wait(300 - Tmax); Off(OUT_B); } task main(){ //メインタスク SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_3, SENSOR_LIGHT); serch(); //サブルーチン「光の最大値を見つける」 ClearTimer(1); while (Timer(1) <= 70){ //タイマー(1)が70になるまで=7秒間 SetPower(OUT_B,4); //以下、左右に少しずつ回転することで前に進むプログラム OnFwd(OUT_B); Wait(3); SetPower(OUT_B,7); OnRev(OUT_B); Wait(3); //ここまで if(SENSOR_1 > SENSOR_3){ //左の方が光が強いとき OnRev(OUT_B); Wait(20); //左を向く } if (SENSOR_3 > SENSOR_1){ //右の方が光が強いとき OnFwd(OUT_B); Wait(20); //右を向く } if ((SENSOR_3<40)&&(SENSOR_1<40)){ //光を見失ったとき serch(); //サブルーチン「光の最大値を見つける」実行 }if ((SENSOR_3>80)||(SENSOR_1>80)){ //光に近づきすぎたとき Off(OUT_B); //止まる } } //7秒間、以上の動作を繰り返した後 Off(OUT_B); //止まる SetPower(OUT_A,7); OnRev(OUT_A); Wait(70); //ホイールを投げる Float(OUT_A+OUT_B); //ロボット停止、プログラム終了。 } **あとがき [#vd4ee9a4] **コメント [#u2122315] コメントをどうぞ #comment