課題2で作成したコースを用いてタイムレースを行う。
<基本ルール>
・紙コップをC地点、D地点にそれぞれ3個(合計6個)置き、C地点に置いた紙コップにはCを、D地点に置いた紙コップにはDを紙コップの底面にマークする
・紙コップは上下どちらにおいてもかまわない
・2台のロボットの場合はA地点とB地点からスタート、一体型の場合はA地点とB地点のいずれかからスタートする
・最終的に黒線で囲まれた輪の中にC地点からの紙コップとD地点からの紙コップを交互に重ねる (下側から数えて奇数番目はC地点からのコップ、偶数番目はD地点からのコップになるようにする)
・紙コップを重ねる場所は、必ずしも目的地点の輪の中でなくてもかまわない
・最終的に紙コップが自力で立っていること、またロボットが紙コップに触れていないこと、ただしスタート時と上下逆になっていてもかまわない
・競技時間はすべてのコップを重ね終わるまで、あるいは審判が続行不能と判断するまで。
・審判の合図の後、5秒以内にロボットをスタートさせ、それ以降はロボットや紙コップに触ってはいけない
・EV3のチームはA,B,Cにそれぞれマークした紙コップをそれぞれ3個置く
・EV3のチームはA,B,C,Dのどこからスタートしてもよいが、別の地点にある合計9個の紙コップを運ぶこと
・紙コップに色を塗ったり文字や絵をかいてもよいが、穴を開けたり故意に変形させてはいけない
・光センサは2セット合わせて2つまで使って良い、その他のセンサや部品はキットに含まれているものだけを使用すること
<基本得点の計算方法>
1段目の紙コップ3点、2段目の紙コップ6点、・・、n段目のコップ3n点、6段目のコップ18点 奇数段目にあるDのコップと偶数段目にあるCのコップは0点 EV3は1段目のAのカップ2点、2段目のBのカップ4点、3段目のCのカップ6点、4段目のAのカップ8点、5段目のBのカップ10点、6段目のCのカップ12点、7段目のAのカップ14点、8段目のBのカップ16点、9段目のCのカップ18点、それ以外は0点
技術点の計算方法以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチームが20点満点で採点し、その平均点を求める。
<得点の目安>
スタートしてから紙コップの地点まで移動する速さ、正確さ (2点) 紙コップをつかむ動作 (3点) 紙コップをゴールまで運ぶ動作の速さ、正確さ (2点) 紙コップを重ねる動作 (3点) 2台のロボットの連携の良さ (3点) 自立型のロボットとしての形や動作の美しさ、斬新さ (3点) ロボコン出場ロボットとしての完成度 (2点) その他 (2点)
これが今回使ったロボットである。
2台のロボットを1台にまとめて、BLUETOOTHで通信している。
我々の班は、アームに力を入れた。 上の写真のように、2個のタイヤを使って、モーターで紙コップを巻き上げる仕組みにした。
もう1つのモーターでアームを上下に可動するようにした。
#define SPEED 50 //スピード50 #define go_forward OnFwd(OUT_BC,SPEED); //前進 #define CONN 1 //スレーブを表している #define SIGNALON 21 //腕を動かすためにマスターがスレーブに送る信号 #define SIGNALOFF 22 //腕を動かし終わったことをスレーブがマスターに送る信号 #define SIGNALON2 31 #define SIGNALOFF2 32 #define turn_leftC OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED); //左旋回 #define turn_rightC OnFwd(OUT_C,SPEED);OnRev(OUT_B,SPEED); //右折 task main() { int msg //MAILBOXに来る信号をmsgと定義する SetSensorLowspeed(S1); //端子1に超音波センサ go_forward; //前進 until(SensorUS(S1) <= 9); //センサの半径9cmに紙コップが入ったら停止 Off(OUT_BC); SendRemoteNumber(CONN,MAILBOX1,SIGNALON ); //信号を送る while (true){ ReceiveRemoteNumber(MAILBOX2,true,msg); //msgを受け取っている間 if (msg == SIGNALOFF ){ //信号を受け取ったら左旋回する turn_leftC; Wait(1600); Off(OUT_BC); go_forward; //前進 Wait(1000); Off(OUT_BC); SendRemoteNumber(CONN,MAILBOX1,SIGNALON2 ); //腕を動かすために信号を送る if (msg == SIGNALOFF2 ){ //信号を受け取ったら左旋回し、停止 turn_leftC; Wait(1000); Off(OUT_BC); }else { //それ以外では停止したまま Off(OUT_BC); } } } }
#define SIGNALON 21 //腕を動かすためにマスターがスレーブに送る信号 #define SIGNALOFF 22 //腕を動かし終わったことをスレーブがマスターに送る信号 #define LIFT_up OnRev(OUT_C,35);Wait(520);Off(OUT_BC); //腕を上げる #define LIFT_down OnFwd(OUT_C,20);Wait(550);Off(OUT_BC); //腕を下ろす #define CATCH OnFwd(OUT_B,60);Wait(2000);Off(OUT_B); //紙コップを持つ #define RELEASE OnFwd(OUT_B,50);Wait(1500);Off(OUT_B); //紙コップを離す #define CONN 0 //マスターとつながっている #define SIGNALON2 31 #define SIGNALOFF2 32 void ude() //サブルーチン { LIFT_down; CATCH; LIFT_up; CATCH; Off(OUT_B); } task main () { int msg; while (true) { ReceiveRemoteNumber(MAILBOX1,true,msg); //msgを受けている間 if (msg == SIGNALON) { //信号を受け取ったら紙コップを持ち上げる ude(); SendResponseNumber(MAILBOX2,SIGNALOFF); //本体に次の行動をするように信号を送る } if (msg == SIGNALON2) { //信号を受け取ったら紙コップを離す RELEASE; SendResponseNumber(MAILBOX2,SIGNALOFF2); //本体に次の行動をするように信号を送る } else { //どちらでもなかったら動かない Off(OUT_BC); } } }
車体の幅が広すぎたこと、重量が重くてタイヤがハの字になりモーターの力がうまく伝達できないことが原因となって、ライントレースをしてもカーブを曲がれないことが発覚した。 改めてロボットを作り直す時間は残されておらず、最後の手段としてスタート地点からまっすぐ紙コップへと向かい、一つだけでもゴールへ運び、紙コップの運搬能力だけでも見てもらうことにした。
結果は失敗となったが、どこが原因の問題かを見つけ出す力が前回よりも備わったと思う。 今回は6人班だったが、テスト週間ということもあり、なかなか全員集まって作業することができなかった。その中で、それぞれ役割分担をして、それをひとつのものにすることの大変さを思い知った。