懐中電灯に向かってブロックを投げるロボットを作ろう!
チーム名「自由気ままにB級人生(仮) 」
連射をさせるという決まりだったので、弾を撃ったあとリロードさせる必要がありました。撃ったあと、弾が落ちてきて装填される、マガジン方式は他のチームがやっていたので、僕たちはリボルバー方式でつくることにしました。 弾を撃つと、弾を乗せた板が回転し、装填されます。 after
ディファレンシャルギアの角速度をωAとし両側の回転軸の角速度をωB、ωCとすると ωA=(ωB+ωC)/2という関係があります。これを利用してモーターひとつだけで走ることのできるロボットを作りました。それぞれの回転軸をストッパーで留めてひとつの方向にしか回らないようにする。そうするとモーターを回した時、ディファレンシャルギアの回転は片方にしか伝わらず、その留め方をうまくすると、モーターを正回転させると左側だけが回転し、モーターを逆回転させると右側だけが回転する、などひとつのモーターで前進させることができます。その結果下図のようになりました。 真ん中の図より、それぞれの回転軸は矢印の方向にしか回りません。このおかげでモーターを正回転、逆回転させるだけで進むことができます。(ただし、片方ずつしかタイヤを回せないので前進するときはジグザグ走行になります。)
#define THRESHOLD 35 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); while( (SENSOR_1 < THRESHOLD)||(SENSOR_3 < THRESHOLD) ) { OnFwd(OUT_B); Off(OUT_A); } repeat(3) { OnRev(OUT_A); Wait(30); OnFwd(OUT_A); Wait(30); } Off(OUT_A); OnFwd(OUT_B);Wait;(20); Off(OUT_B); OnFwd(OUT_C);Wait(20); Off(OUT_C); }
「7秒以上追尾できたら懐中電灯に向かってブロックを投げる。」を担当
#define hit OnFwd(OUT_A);Wait(38);Off(OUT_A); //ブロックを打つ動作 #define revolver OnFwd(OUT_C);Wait(184);Off(OUT_C);//リボルバーを90度回す #define turn_r OnFwd(OUT_B); //右折 #define turn_l OnRev(OUT_B); //左折 #define shine 60 //光の明るさ #define run_time 700 //光を追う時間 #define keep Off(OUT_B); //停止 task main() { SetSensor(SENSOR_1, SENSOR_LIGHT); //光センサー1を決める SetSensor(SENSOR_3, SENSOR_LIGHT); //光センサー3を決める while(true){ if((SENSOR_1 < shine)&&(SENSOR_3 < shine)){ //両方の光センサーが暗いとき turn_l; //左に回って光を探す until((SENSOR_1 > shine)||(SENSOR_3 > shine)); //どちらかの光センサーが光を見つけるまで keep;Wait(10); //見つけたら停止 } ClearTimer(0); //タイマーをクリア while(((SENSOR_1 > shine)||(SENSOR_3 >shine))&&(FastTimer(0) < 700)){ if((SENSOR_1 > shine)&&(SENSOR_3 < shine)){ //左側に光がある時 turn_l; //左に曲がって光を追う until((SENSOR_1 > shine)&&(SENSOR_3 > shine));//正面に光が来るまで keep;Wait(10); //正面に来たら停止 } if((SENSOR_1 < shine)&&(SENSOR_3 > shine)){ //右側に光がある時 turn_r; //右に曲がって光を追う until((SENSOR_1 > shine)&&(SENSOR_3 > shine));//正面に光が来るまで keep;Wait(10); //正面に来たら停止 } if((SENSOR_1 > shine)&&(SENSOR_3 > shine)){ //正面に光がある時 keep; //停止 } } PlaySound(SOUND_UP); //7秒光を追えたら音を鳴らす revolver;Wait(10); //リボルバーを回転 hit;Wait(10); //ブロックを打つ keep; //停止 } }
なぜか懐中電灯の光を無視してしまうことがあり、7秒間光を追わせることが難しかったです。
#define left(t) OnFwd(OUT_B); Wait(t); #define right(t) OnRev(OUT_B); Wait(t); #define offb Off(OUT_B); #define revolver(t) OnFwd(OUT_C); Wait(t); #define hit(t) OnFwd(OUT_A); Wait(t); task main(){ int hikari_1=60; //hikari_1に60を入れる int hikari_2=65; //hikari_2に65を入れる SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); while((SENSOR_1 <hikari_1)&&(SENSOR_3 <hikari_1)){ /*光が両方のセンサーに入るまで回りつづける*/ left(30); } offb; while((SENSOR_1 <hikari_2)&&(SENSOR_3 <hikari_2)){ right(60); offb; left(70); } /*光が強くなるまで近づく*/ offb;//止まる revolver(175); //リボルバーを回す Off(OUT_C); //止める hit(37); //弾を打つ Off(OUT_A); }
光センサーの精度が高くないので、近づきすぎてしまったりと、調整が難しかったです
コメントをどうぞ。