[[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]
ピッチャーロボットは、まずAP間の黒い線まで進み、次にSP間の黒い線まで進み、最後にMに向かうという順で移動する。
 #define READY 150                      
 sub stop_line()
 {
 until(SENSOR_2<48){
 OnFwd(OUT_AC);
 }
 PlaySound(SOUND_UP);
 }                     //黒い線まで進み、光センサーが線を感知すると音が出るようにした


 task main()                      
 {
 SetSensor(SENSOR_1,SENSOR_ROTATION);
 SetSensor(SENSOR_2,SENSOR_LIGHT);
 ClearSensor(SENSOR_1);
 until(SENSOR_1>4){
 OnFwd(OUT_C);
 OnRev(OUT_A);}                      
 Off(OUT_AC);    //機体を右に傾ける
 stop_line();        //Aのボックスの黒い線まで進む                  
 ClearSensor(SENSOR_1);
 until(SENSOR_1<-5){
 OnFwd(OUT_AC);}   //黒い線を超える                
 stop_line();        //AP間の黒い線まで進む                
 Off(OUT_AC);
 Wait(50);
 ClearSensor(SENSOR_1); 
 until(SENSOR_1<-4){
 OnFwd(OUT_AC);}                     
 Off(OUT_AC);
 Wait(10);           //黒い線を超える
 stop_line();        //SP間の黒い線まで進む               
 Off(OUT_AC);   
 Wait(40);
 ClearSensor(SENSOR_1);
 until(SENSOR_1>2){
 OnFwd(OUT_C);
 OnRev(OUT_A);}       //機体を少し右に傾ける              
 ClearSensor(SENSOR_1);
 until(SENSOR_1<-7){
 OnFwd(OUT_AC);}                     
 Off(OUT_AC);     //黒い線を超える
 stop_line();                        
 Off(OUT_AC);
 Wait(60);       //Mの円状の黒い線まで進む
 ClearSensor(SENSOR_1);
 until(SENSOR_1<-6){
 OnFwd(OUT_AC);}
 ClearSensor(SENSOR_1);
 until(SENSOR_1<-20){
 OnFwd(OUT_A);
 OnRev(OUT_C);}           
 Off(OUT_AC);     //ピッチャーボックスに入るために、調整する
 ClearMessage();
 until(Message()==READY);
 PlaySound(SOUND_CLICK); 
 while(true){                    
 Wait(500);
 OnRev(OUT_B);
 Wait(35);
 Off(OUT_B);
 }          //バッターからの通信を受け次第、一定の時間間隔を置き、球を発射させる
 }
 

**バッター [#ya58684b]
バッターロボットは、最初にQR間の黒い線に向かって、回転センサーを使って移動して、そこから
ライントレースを始めて、バッターボックスであるBに向かう。~
また、左右につけているモーターが少し違うため、回転センサーを用いても、まっすぐな直進を進むことができなかったために、誤差を修正するためのプログラミングを書いた。

 #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;//しきい値が39以下のところで大きく左に曲がる
 }else if(SENSOR_2<41){
 turn_left1;ClearTimer(0);//しきい値が41以下のところで小さく左に曲がる
 }else if(SENSOR_2<43){
 go_forward;ClearTimer(0);//しきい値が43以下のところで直進する
 }else if(SENSOR_2<50){
 turn_right1;ClearTimer(0);//しきい値が50以下のところで小さく右に曲がる
 }else{
 turn_right2;ClearTimer(0);//しきい値が51以上のところで大きく右に曲がる
 }
 }
 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);
 }                     //6点のゴールの直前まで進む  
 ClearSensor(SENSOR_3);
 until(SENSOR_3<-7){
 OnFwd(OUT_A);OnRev(OUT_C);
 }                    //90度左へ回転する
 until(SENSOR_2<40){
 OnFwd(OUT_AC);
 }Off(OUT_AC);        //ロボットから見て、1回目のQR間の黒い線まで直進し、光センサーで黒い線を感知したら、その場で停止する。
 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);
 }                  //ロボットから見て、2回目のQR間の黒い線まで直進し、光センサーで黒い線を感知したら、その場で停止する。
 ClearSensor(SENSOR_3);
 until (SENSOR_3<-4){
 OnFwd(OUT_AC);
 }                  //黒い線を超えるために、少し直進する
 crossing_stop();   //RのT字路までライントレースをして、Rに差し掛かったら、停止する
 crossing_left();  // T字路を左へ曲がる
 crossing_stop();  //BのT字路までライントレースをして、Bに差し掛かったら、停止する

 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); 
 }                  //Bのボックスに入り、かつ球を打てるように、位置を整える
 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);
 }
 }                //SENSOR1の光センサーの値が、62以上になればバットを振り、次の球に備えてすぐに、バットを戻すというふうにした。
 Off(OUT_ABC);
 }
*まとめ [#w947b3c3]
今回のロボコンは、テスト期間と被ったということもあって、メンバー全員が集まることは難しく、また、一部のメンバーに大きく負担がかかってしまったりしたので、そういうところが残念だった。~
でも、ロボコンで自分たちで作ったロボットが動いてる姿を見て、頑張ったかいがあったと思えた。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS