目次 #contents * 課題3 [#h32869e2] 課題2で作ったコースを使って、野球ロボットを制作する。 球を打って目標に入れることでそれに応じて得点できる。 また、他の班に技術点を評価してもらう。 * ロボットの説明 [#n6798fae] ** バッター [#gffc1ec8] #ref(./5615453055852.jpg,50%,バッターロボット) 前回使用したライントレースロボットにモーターで駆動するバットを取り付けた。 ** ピッチャー [#f339bb8c] #ref(./5615453074102.jpg,50%,ピッチャーロボット全体像) ライントレースロボットに球を入れるかごを取り付けた。 途中で球が詰まらないようにするために垂直ではなく斜めにかごを取り付けている。 #ref(./5615453092830.jpg,50%,給弾機構) 写真の位置に風車上の部品を取り付け、九十五度ずつ回転させて球を送り出している。こうすることで一度に複数の球が出ていくことが殆ど起こらなくなり、また、球が送り出されなくなる事態が防げる。 * プログラム [#c3947ca1] **バッター [#d6926edf] バッターロボットはマウンドに向けて設置し、線を二回またいだ時点でマウンドの手前にいることになる。そこで旋回してバッターボックスに向かい、所定の位置に着いた後球を送り出す命令を送り始める。 #define TR OnFwd(OUT_C,45);//右折 #define TL OnFwd(OUT_B,45);//左折 #define CR OnFwdSync(OUT_BC,45,-100);//右旋回 #define SL OnFwdSync(OUT_BC,45,100);//左旋回 #define GF OnFwdSync(OUT_BC,60,0);//直進 #define MS Wait(400);//動きに誤差が出ないようにするための待ち時間 #define CONN 1 #define SIGNALON 11 #define SIGNALOFF 12 //通信に使用する task main() { SetSensorLight(S1); int n=0; //ラインをまたいだ回数 int m=1200; //最初にボールが打ち出されてからバットを振るまでの時間 while(n<2){ if(SENSOR_1>40){ GF } else{ GF MS Off(OUT_BC); MS n++; } } //線を二回またぐまでのロボットの動き Off(OUT_BC); MS SR Wait(1300); Off(OUT_BC); //バッターボックスの方向を向く while(n<6){ if(SENSOR_1>40){ GF } else{ GF MS Off(OUT_BC); MS n++; } } //バッターボックスの手前まで進む Off(OUT_BC); MS GF Wait(600); Off(OUT_BC); MS SL Wait(700); Off(OUT_BC); MS GF Wait(1100); Off(OUT_BC); //バッターボックスの中に入る Wait(2000); while (m<1450){ SendRemoteNumber(CONN,MAILBOX1,SIGNALON);//ピッチャーに球を投げる命令を送る Wait(m); RotateMotor(OUT_A,75,180); //バットを振る Wait(500); RotateMotor(OUT_A,-20,180);//バットを戻す Wait(500); n++; m=m+50;//打つ方向を変えるためにバットを振るタイミングを遅らせる } Off(OUT_A); } **ピッチャー [#b00c4ce5] ピッチャーロボットもマウンドに向けて設置し、線を四回またいだ時点でマウンドの手前にいる。そこからマウンドに入り、バッターの方向を向いて命令が来たら球を送り出す。 #define TR OnFwd(OUT_C,45);//右折 #define TL OnFwd(OUT_B,45);//左折 #define SR OnFwdSync(OUT_BC,45,-100);//右旋回 #define SL OnFwdSync(OUT_BC,45,100);//左旋回 #define GF OnFwdSync(OUT_BC,45,0);//直進 #define MS Wait(400);//誤差なく動かすための待ち時間 #define SIGNALON 11 #define SIGNALOFF 12//通信に使用 task main() { SetSensorLight(S1); int n=0;//線をまたいだ回数 MS while(n<4){ if(SENSOR_1>37){ GF } else{ GF MS Off(OUT_BC); MS n++; } } //マウンドの手前まで移動する Off(OUT_BC); GF MS Off(OUT_BC); MS TR Wait(3500); Off(OUT_BC); //マウンドに入り、バッターの方向を向く int msg; while (true) { ReceiveRemoteNumber(MAILBOX1,true,msg); if (msg == SIGNALON) { RotateMotor(OUT_A,-20, 95); } //バッター側からSIGNALONのメッセージを受け取ったとき、球を送り出す if (msg == SIGNALOFF) { Off(OUT_A); } //バッター側からSIGNALOFFのメッセージを受け取ったとき、球を送り出すのをやめる。 } } * まとめ [#debef2a1] 今回の機体は、トラブルもあってバッターロボットの作りは非常に簡単になっている。しかし、ピッチャーロボットに関しては決して弾詰まりが起こらず、安定した給弾機構を作ることができた。ただ、何度も閾値の測定を行い、待機時間を入れたにもかかわらずピッチャーロボットが起動時に誤って白い地点を黒い線であると認識してしまうことがあるというバグがあった。プログラムは人が作っているものなので、ロボットには人のプログラムミスがそのまま反映されてしまうことがわかり、ロボットに限らず物を作ることはトライアンドエラーの繰り返しであると感じた講義でした。