目次 #contents *1、レポートの概要 [#n41e83f1] 今回の課題で、私はバッターのロボットを担当した。このレポートでは、ピッチャーロボットとの連携やバッターロボットの構造、バッターロボットのプログラムについて説明する。 #ref(2016b/Member/ats/Mission3/view.gif,50%,バッターロボットの全体像) *2、 ロボットの構造[#q795a61a] バッターロボットは、上の写真を見てもわかるように台車の上に制御装置を置き、その上にバットとそれを振るモーターがつくという構造になっている。バッターロボットはバットを振るだけでいいので、このような単純な構造にした。また、こうすることで最初の移動の時に正確な移動ができるようになった。 **⑴台車 [#lcfe2938] #ref(2016b/Member/ats/Mission3/sensor.gif,50%,台車) ロボットの動作には光センサーを使用したため、正確な動作のために台車は小回りが利くように作る必要があった。そのため、車輪は2つ設置し、上の写真を見てもわかるように車輪の近くに光センサーを設置した。また、今回の課題では回転センサーを使用したが、上の写真のように設置してある。 **⑵バット [#r61423de] #ref(2016b/Member/ats/Mission3/batto.jpg,50%,バット) バットは、ボールに当てる確率を上げるために長くした。また、スイングスピードを上げるためにモーターの軸に直接取り付けてた。スイングスピードを速くしたのは、打球のスピードを上げて10点のゴールも狙えるようにするためだ。長いバットを高速で振るため、バットとバットを動かすモーターを支える部分には大きな力が加わる。そのため、上の写真のように強力な補強を施した。下の写真は構えた時のバットの位置(水色の部分)で、その右側の図はボールを打つ過程である。 &ref(2016b/Member/ats/Mission3/batto1.jpg,40%,バットの位置); &ref(2016b/Member/ats/Mission3/batting.gif,50%,過程); このロボットは光センサーがある方を進行方向として動いて、車輪も進行方向側に寄っている。そのため、バットを進行方向前側に設置すると車輪と接触する可能性があった。そこで車輪のない進行方向後ろ側にバットを設置することでこの問題を解決した。また、それに伴って機器同士の通信をする送受信部分も進行方向後ろ側に向いている。 *2、プログラム [#y28a6f33] 今回は、移動のプログラムを私が書き、通信及びバッティングのプログラムをバッターロボットの相方が書き、それを合わせて一つのプログラムとした。そのため、マクロやプログラムの書き方に違いが出ている。 **⑴移動のプログラム [#c4884574] 移動のプログラムは私が担当した。プログラムの書き方としては3つのサブルーチンに分割して、task main()はセンサーの設定と3つのサブルーチンを書くのみとした。3つのサブルーチンの分け方は以下のとおりである。 #ref(2016b/Member/ats/Mission3/map.jpg,50%,青線→赤線→緑線) 位置的には直進できるが、そうすると4点のゴールにぶつかってしまうため、このようなルートとなった。 ***P1(青線) [#le2dd0a7] #define BLANK Off(OUT_ABC);Wait(30); //動作の安定のために一時停止するマクロ #define WHITE 47 //白の光センサーの下限値 #define BLACK 40 //黒の光センサーの上限値 #define FIRST_COUNT 21 //スタートの黒枠を出てから45度回転するまでの回転センサーの値 #define TURN_L45 ClearSensor(SENSOR_3);OnFwd(OUT_A);OnRev(OUT_C);until(SENSOR_3 == -6);Off(OUT_AC); //左に45度回転するときのマクロ #define TURN_R45 ClearSensor(SENSOR_3);OnFwd(OUT_C);OnRev(OUT_A);until(SENSOR_3 == 6);Off(OUT_AC); //右に45度回転するときのマクロ #define FORWARD_W_B OnFwd(OUT_AC);until(SENSOR_2 < BLACK);Off(OUT_AC); //白いところから黒いところに入るまで直進するマクロ #define FORWARD1(X) ClearSensor(SENSOR_3);OnFwd(OUT_AC);until(SENSOR_3 == X);Off(OUT_AC); //回転センサーがxの値になるまで直進するマクロ sub P1() { TURN_R45; BLANK; FORWARD_W_B; FORWARD1(FIRST_COUNT); BLANK; TURN_L45; BLANK; } プログラムの流れとしては「B枠の方向を向いたロボットを右斜めに回転する→黒線を感知するまで直進する→そこから設定した回転センサーの値まで直進する→左斜めに回転して元の向きに戻す」という流れになっている。光センサーを使用することで、最初の位置取りによる誤差がなるべくなくなるようにした。また、回転センサーを使用することにより、正確な移動ができるようにした。 ***P2(赤線) [#o4c6a80b] #define WHITE 47 //白の光センサーの下限値 #define BLACK 40 //黒の光センサーの上限値 #define FORWARD_W_B OnFwd(OUT_AC);until(SENSOR_2 < BLACK);Off(OUT_AC); //白いところから黒いところに入るまで直進するマクロ #define FORWARD_B_W OnFwd(OUT_AC);until(SENSOR_2 > WHITE);Off(OUT_AC); //黒いところから白いところに入るまで直進するマクロ sub P2() { repeat(3) { FORWARD_W_B; FORWARD_B_W; } } 先ほどの移動ルートの図を見てもわかるように、P2(赤線)のルートは3本の黒線を横断するルートとなっている。そこで「白いエリアを進む→黒いエリアを進む」という流れを3回繰り返すことで、ちょうど左側にB枠が来るようにした。また、光センサーのみを使用することでP1(青線)で生じた誤差を修正することができる。下の図はこのプログラムを図解したものである。 #ref(2016b/Member/ats/Mission3/p2.jpg,70%,P2) ***P3(緑線) [#f1c1cd07] #define BLANK Off(OUT_ABC);Wait(30); //動作の安定のために一時停止するマクロ #define WHITE 47 //白の光センサーの下限値 #define BLACK 40 //黒の光センサーの上限値 #define B_COUNT 17 //バッターボックスに入ったあとに進む距離の回転センサーの値 #define TURN_COUNT 10 //90度回転するときの回転センサーの値 #define TURN_L ClearSensor(SENSOR_3);OnFwd(OUT_A);OnRev(OUT_C);until(SENSOR_3 == -TURN_COUNT);Off(OUT_AC); //左に90度回転するときのマクロ #define FORWARD_W_B OnFwd(OUT_AC);until(SENSOR_2 < BLACK);Off(OUT_AC); //白いところから黒いところに入るまで直進するマクロ #define FORWARD1(X) ClearSensor(SENSOR_3);OnFwd(OUT_AC);until(SENSOR_3 == X);Off(OUT_AC); //回転センサーがxの値になるまで直進するマクロ #define turnr(b) ClearSensor(SENSOR_3);OnFwd(OUT_C);OnRev(OUT_A);until(SENSOR_3>=b);Off(OUT_AC);ClearSensor(SENSOR_3); //右旋回 sub P3() { OnFwd(OUT_AC); Wait(30); BLANK; //少し直進 TURN_L; BLANK; FORWARD_W_B; FORWARD1(B_COUNT); BLANK; turnr(5); }