目次 #Contents *課題3の内容 [#g40fe707] #ref(2016b/Member/god22ila/Mission3/2016b-mission3.png,50%,コース) 今回の課題は基本ルールに従ってピッチャーロボとバッターロボが通信をして野球をするというものである。 **基本ルール [#z54d30fa] -ピッチャーロボとバッターロボが決められた場所についてピンポン玉を投げて打つ -ピッチャーロボはA地点からM地点まで移動 -バッターロボはC地点からB地点まで移動 -高さの制限はないがスタートの時点で機体が枠内に収まること -M,B地点では接地部分が枠内に収まっていること -ピッチャーロボはスタート時にピンポン玉を5個まで持てる -バッターロボはピンポン玉を3秒以上持っていてはいけない -移動の途中でゴールにぶつかってはいけない **得点の計算方法 [#m8cee12c] -5つあるゴールに書かれている数字を合計するが、同じゴールに2個以上のピンポン玉がはいったら2個目以降の得点は1個目の半分になる -打つことはできたがどのゴールにも入らなかった場合は1点になる **技術点の説明 [#ca104426] 以下の評価ポイントを含めた技術的な工夫や芸術性について他のチームが20点満点で評価し、その平均点を求める **評価ポイント [#c216650b] -スタートから所定の位置まで移動するスピードと正確さ(3点) -ピンポン玉を投げる動作について(3点) -ピンポン玉を打つ動作について(3点) -2台のロボットの連携の良さについて(3点) -自立型ロボットとしての形や動作の美しさ、斬新さについて(3点) -ロボコン出場ロボットとしての完成度(3点) -その他(2点) *本体の説明(バッターロボ) [#qfbc9a2d] #ref(2016b/Member/god22ila/Mission3/IMG_kitai1.JPG,50%,機体裏) 本体は今回もライントレーサーを使うこともあり、課題2で使っていたものをそのまま利用した。 *アームの説明(バッターロボ) [#r24463bf] #ref(2016b/Member/god22ila/Mission3/IMG_kitai3.JPG,50%,機体裏) 斜め上から #ref(2016b/Member/god22ila/Mission3/IMG_kitai4.JPG,50%,アーム上) アームは直接モータにブロックを付けた構造になっているので動きとしては、逆水平チョップを打つような感じになっている。 *本体の説明(ピッチャーロボ) [#fe6d1ad0] #ref(2016b/Member/god22ila/Mission3/IMG_kitai2.JPG,50%,機体裏) バッターロボと同じくライントレーサーを使うので、前回の僕たちの班のロボットの本体と同じ構造になっている。 *アームの説明(ピッチャーロボ) [#mac7a008] #ref(2016b/Member/god22ila/Mission3/IMG_armkeisya.jpg,50%,横) ピンポン玉の収納部の下が傾斜しているのでピンポン玉がそこに落ちると転がってバッターのもとへいくようになっている。 #ref(2016b/Member/god22ila/Mission3/IMG_syuriken.jpg,50%,手裏剣) ピンポン玉がどんどん落ちてこないように手裏剣型のストッパーを用意した。このストッパーは回転するとすぐ下のピンポン玉を押し出し、次のピンポン玉を発射する準備をしその次のピンポン玉を落ちてこないようにする役目を担っている。 *2台を通信するプログラムについて [#cbea9911] バッターロボをマスター、ピッチャーロボをスレーブとし2台で通信する。マスターがスレーブにメッセージを送ると、それを受け取ったスレーブが決まった動作を実行する。バッターロボのほうが直進では早いのでM地点でぶつかることはない。 *バッターロボのプログラム [#kfe49bfb] #define turnright OnFwd(OUT_C,45); #define turnleft OnFwd(OUT_B,45); #define senkairight OnFwdSync(OUT_BC,45,-100); #define senkaileft OnFwdSync(OUT_BC,45,100); #define goforward OnFwdSync(OUT_BC,60,0); #define zokkou Wait(400); #define CONN 1 //スレーブの接続番号 #define SIGNALON 11 //モータを動かすメッセージ #define SIGNALOFF 12 //モータを止めるメッセージ **光センサーを起動 [#xbad0f68] task main() { SetSensorLight(S1); int n=0; //nの値を決める int m=1200; //mの値を決める **ライントレースで目標の場所まで移動 [#x92b7f6c] バッターロボはC地点からB地点までM地点を介して移動する。C〜Bまでで計5回黒い部分を通過するので、C〜Mまでの2回、M〜Bまでの3回でプログラムを分ける。 -C〜Mまで while(n<2){ //nの値が2より小さいとき if(SENSOR_1>40){ //白と認識したとき goforward //直進 } else{ //違ったら goforward //白と認識するまで直進する zokkou Off(OUT_BC); zokkou n++; //nの値を増やす } } -M〜Bまで Off(OUT_BC);//Bのほうへ機体を向ける zokkou senkairight Wait(1300); Off(OUT_BC); nの値が2〜5までの時 while(n<6){ if(SENSOR_1>40){ //白と認識されているとき goforward //前進 } else{ //違ったら goforward //白と認識されるまで前進して zokkou Off(OUT_BC); zokkou n++; //nの値を1増やす } } 微調整をしてBの枠の中に入り、ボールを打てる向きに機体の向きを調節する Off(OUT_BC); //機体の向きを調節するためのプログラム zokkou goforward Wait(600); Off(OUT_BC); zokkou senkaileft Wait(700); Off(OUT_BC); zokkou goforward Wait(1100); Off(OUT_BC); Wait(2000); **通信のプログラム [#f55eba9c] while (m<1450){ //mの値が1450よりも小さいとき SendRemoteNumber(CONN,MAILBOX1,SIGNALON); //スレーブにSIGNALONを送信する -バットで打つプログラム Wait(m); //mの値でピンポン玉を打つタイミングを調節する RotateMotor(OUT_A,75,180); Wait(500); RotateMotor(OUT_A,-20,180); Wait(500); m=m+50; //mの値を増やす } SendRemoteNumber(CONN,MAILBOX1,SIGNALOFF); //スレーブにSIGNALOFFを送信する Off(OUT_A); } スレーブにSIGNALONが送信されるとピンポン玉が発射される。ピンポン玉を打つタイミングは時間によって操作されているので1回打つ毎に打つタイミングがが変化し、すべての場所を狙えるようになっている *ピッチャーロボのプログラム [#cd84a823] #define turnright OnFwd(OUT_C,45); #define turnleft OnFwd(OUT_B,45); #define seikairight OnFwdSync(OUT_BC,45,-100); #define senkaileft OnFwdSync(OUT_BC,45,100); #define goforward OnFwdSync(OUT_BC,45,0); #define zokkou Wait(400); #define SIGNALON 11 //モータを動かすメッセージ #define SIGNALOFF 12 //モータを止めるメッセージ **光センサーを起動 [#k20e6350] task main() { SetSensorLight(S1);//光センサー起動 int n=0;//nの値を決める teisi **ライントレースで目標の場所まで移動 [#u93b11a5] ロボットは枠の中からスタートしMに向かって直進し、Mの枠内で向きを変えてバッターロボットのほうに発射口を向けるという移動の仕方をする。ロボットは黒い線の上を4回通り、もし白と認識したら直進し、黒と認識したら白と認識されるまで直進しnの値を増やし直進するという動きをする。これをnが4になるまで行う while(n<4){ //スタート地点からM地点まで行くプログラム if(SENSOR_1>37){ //白と認識したとき goforward //前進 } else{ //違ったら goforward //白と認識されるまで前進し zokkou Off(OUT_BC); zokkou n++; //nの値を増やす } } nの値が4以上になったら方向転換してバッターロボのほうに発射口を向ける。 Off(OUT_BC);//方向を変えるプログラム goforward zokkou Off(OUT_BC); zokkou turnright Wait(3500); Off(OUT_BC); **通信のプログラム [#m12ccad8] MAILBOXに値を受け取ることにより動作を実行する。受け取った数値により動作が変わる。 int msg; //受け取った値を入れておく変数 while (true) { ReceiveRemoteNumber(MAILBOX1,true,msg);//MAILBOX1の値を受けとってmsgに入れる。trueを指定するとMAILBOXが空になる if (msg == SIGNALON) { //SIGNALONを受け取った場合 RotateMotor(OUT_A,-20, 95);//ピンポン玉を発射するプログラムが起動 } if (msg == SIGNALOFF) { //SIGNALOFFを受け取った場合 Off(OUT_A); //停止 } } } *感想 [#k0a1c7eb] 今回の課題は2台のロボットを用いて野球をするというもので、2台のロボットの動きのタイミングとピンポン玉の転がり方を考慮してプログラムするのが難しかった。ロボットの移動のプログラムは前回のプログラムを用いたのでそこまで難しくなかった。だが、ピッチャー側でよくセンサーの誤認識があったのでセンサーの値や黒色の部分をマジックで塗ったりして問題をクリアするのを頑張った。プログラムを調節したおかげでロボコン本番ではすべての打席でヒットを打つことができたので良かった。ピッチャーロボを作るときにどうすればボールを投げれるのかがなかなか思いつかなかったので苦労した。この授業では何回も様子を見てプログラムや機体を調整することの大切さを学ぶことができた。あと、ほかの人と絶対に連絡できる手段を一つは持っておいたほうがいいということも学んだ。