[[2016b/Member]] *目次 [#vf4810fd] #contents *課題 [#i7d8c7e2] 球技ロボット **コース [#p23abc87] #ref(2016b/Member/GORI/Mission3/2016b-mission3.png,100,全体部分) **ルール [#g864a6ed] ・ピッチャーロボットとバッターロボットが所定の位置まで移動してピンポン球を投げて打つ~ ・ピッチャーロボットはA地点をスタートしM地点まで移動する~ ・バッターロボットはC地点をスタートしB地点まで移動する~ ・スタート時はそれぞれA地点B地点の枠内に収まること(高さの制限はなし)~ ・M地点、B地点では接地している部分が枠内に入っていること~ ・ピッチャーロボットはスタート時にピンポン球を5個まで保持できる~ ・ピッチャーロボットが投げたピンポン球をバッターロボットは3秒以上保持してはならない~ ・移動の途中で目標に接触してはならない~ *ロボット本体の説明 [#n200cb36] **ピッチャー [#a8e16546] ピッチャーロボットは、前についている二つのタイヤを回転させて、それによってボールを打ち 出す仕組みです。~ また、RIS本体の下にピンポン球を収納する空間をつくって、最大でボールを5個収納できるようにした。~ さらに、タイヤにゴムをつけているのは、ロボットが移動中に、ピンポン玉がタイヤの間から出てくるのを、防ぐためにつけた。~ また、移動方法は回転センサーと光センサーの二つを使うことによって移動する。 #ref(2016b/Member/GORI/Mission3/securedownload10.jpg,50,全体部分) **バッター [#f7ed59d1] バッターロボットのコンセプトは、実際のバッターと同様に、ボールを見て打つです。~ そのため、ボールの判断をするために、ボールを打つところの上に、光センサーを二つ~ つけて、その光センサーがボールを感知すれば、ロボットがバットを振るというふうに~ つくりました。 #ref(2016b/Member/GORI/Mission3/securedownload2.jpg,50,全体部分) また、ロボットがバットを振る仕組みは、上の写真のように、ギアをかました二つの黄色いレゴが~ 同時に、180度ずつ外にいくように回って、バットを振るという仕組みです。また、光センサーが~ 左右についていることと、二つのバットがそれぞれ、180度ずつまわることで、ロボットのミート~ 力がすごく高くなりました。 #ref(2016b/Member/GORI/Mission3/securedownload3.jpg,50,全体部分) また、ロボットの移動方法は、ロボットの後ろにつけた光センサーによるライントレースと、右側~ のタイヤにつけた回転センサーによる移動です。~ また、左右につけた二つのタイヤと、ロボットの中心部にあるキャスターとで、動くようにしました。 #ref(2016b/Member/GORI/Mission3/securedownload5.jpg,50,全体部分) *ライントレースの仕組み [#b1e75285] 光センサーで線上にいるかどうかを判別して、線上にいるならロボットを左に動かして、~ 線上にいないなら、右に動かして、境界線上をじぐざくしながら、進んでいく。~ また、交差点は何秒間まがっているかで、交差点かどうかを判断する。 *プログラミング説明 [#f568aefe] **ピッチャー [#la78b6a5] **バッター [#ya58684b] #define go_forward OnFwd(OUT_AC);//前に進む #define turn_left1 Off(OUT_C);OnFwd(OUT_A);//小さく左に曲がる #define turn_left2 OnRev(OUT_C);OnFwd(OUT_A);//大きく左に曲がる #define turn_right1 Off(OUT_A);OnFwd(OUT_C);//小さく右に曲がる #define turn_right2 OnRev(OUT_A);OnFwd(OUT_C);//大きく右に曲がる #define MAX_TIME 20 sub crossing_stop() //交差点に入って止まる { ClearTimer(0); while(FastTimer(0)<MAX_TIME){//タイマーが基準値以下のときに実行される if(SENSOR_2<39){ turn_left2;//しきい値が35以下のところで大きく左に曲がる }else if(SENSOR_2<41){ turn_left1;ClearTimer(0);//しきい値が40以下のところで小さく左に曲がる }else if(SENSOR_2<43){ go_forward;ClearTimer(0);//しきい値が43以下のところで直進する }else if(SENSOR_2<50){ turn_right1;ClearTimer(0);//しきい値が47以下のところで小さく右に曲がる }else{ turn_right2;ClearTimer(0);//しきい値が48以上のところで大きく右に曲がる } } Off(OUT_AC);Wait(100); OnRev(OUT_AC);Wait(20);//タイマーが基準値を上回ったとき、一時停止して、後退する } sub crossing_left()//T字路で止まってから、左に曲がる { turn_left1; Wait(80); } task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_ROTATION); ClearSensor(SENSOR_3); until (SENSOR_3<-18){ OnFwd(OUT_AC); } ClearSensor(SENSOR_3); until(SENSOR_3<-7){ OnFwd(OUT_A);OnRev(OUT_C); } until(SENSOR_2<40){ OnFwd(OUT_AC); }Off(OUT_AC); ClearSensor(SENSOR_3); until (SENSOR_3>1){ OnRev(OUT_A);Off(OUT_C); } ClearSensor(SENSOR_3); until (SENSOR_3<-4){ OnFwd(OUT_AC); } until(SENSOR_2<40){ OnFwd(OUT_AC); } ClearSensor(SENSOR_3); until (SENSOR_3<-4){ OnFwd(OUT_AC); } crossing_stop(); crossing_left(); crossing_stop(); ClearSensor(SENSOR_3); until (SENSOR_3>6){ OnRev(OUT_A);Off(OUT_C); } ClearSensor(SENSOR_3); until (SENSOR_3<-24){ OnFwd(OUT_AC); } ClearSensor(SENSOR_3); until (SENSOR_3>9){ OnRev(OUT_A);Off(OUT_C); } Off(OUT_AC);Wait(30); ClearSensor(SENSOR_3); until (SENSOR_3>16){ OnRev(OUT_AC); } Off(OUT_AC); SendMessage(150); Wait(100); ClearSensor(SENSOR_3); until (SENSOR_3<-16){ OnFwd(OUT_AC); } Off(OUT_AC); while(true){ if(SENSOR_1>61){ OnRev(OUT_B); Wait(10); Off(OUT_B);Wait(50); OnFwd(OUT_B); Wait(10); Off(OUT_B); } } Off(OUT_ABC); } *まとめ [#w947b3c3]