上のコースの上に置かれたピンポン玉を掴んでコースの左側のトレーの中に入れるロボットを作る.
競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。 図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。 開始の合図から5秒以内にスタートボタンを押す作業を完了すること。 競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。 途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。 競技終了後、ロボットが、ゴールのプラ容器に触れていてはいけない。 競技終了後、もともと玉が入っていたプラ容器が、ゴールのプラ容器に触れていてはいけない。
プラ容器内の玉を1個運べば8点。二つとも運べば20点。 L地点とL'地点の玉をどちらか1個運べば4点、2個とも運べば12点。 競技終了後、ゴールのプラ容器が完全に円から出しまった場合、もとの基本点の1/4を減点。 競技終了後、ゴールのプラ容器の半分以上が円から出ていれば、もとの基本点の3/4を減点。 競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれば、もとの基本点の1/2を減点。 競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれば、もとの基本点の1/2を減点。 競技終了後、ゴールのプラ容器にロボットが触れていれば、もとの基本点の1/4を減点。
今回は2つのNQCを使えるため,1体型にして,トレーごと掴む部分と車体を動かす部分に仕事を分けている. このロボットはトレーの中の玉を運ぶだけのロボットのため,ここからはそれを考慮に入れて見てほしい.
上はロボットの全体の写真.前のアームでトレーを掴んで運び,ゴールにバックして近づいて,トレーからボールが出るまで持ち上げて後ろのレールに転がしてゴールに入れる.アームは,最初は邪魔にならないように上げておき,トレーに近づいたら下す.
ロボットの前の部分に2つの光センサーを付けている.前の2輪のタイヤを2つのモーターで動かし,後ろには小さなタイヤをつけてバランスをとっている.
ボールがうまくレールに乗るように,漏斗のような形にしている.また,途中でレールから外れないように壁を作っている.
2つのNQCを向かい合わせに配置して,通信ができるようにしている.
車体部分で使うマクロである.
#define Line 43 //ライントレースの黒の値 #define UP 13 //アームを上げさせるときに送信する信号 #define DOWN 12 //アームを下げさせるときに送信する信号 #define STOP 11 //アームの動きを止めるための信号
ライントレースのサブルーチン
sub follow_line() { SetSensor(SENSOR_2,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); int t; t=FastTimer(0); while(FastTimer(0)<250) //2.5秒間この動きを繰り返す { if(SENSOR_2>43 && SENSOR_3>43){OnFwd(OUT_BC); //センサーが両方白の間前進 }else if(SENSOR_2<Line && SENSOR_3>Line){OnFwd(OUT_C);Off(OUT_B); //右センサーが黒,左が白の間左折 }else if(SENSOR_2>Line && SENSOR_3<Line){OnFwd(OUT_B);Off(OUT_C); //右が白,左が黒の間右折 }else {Off(OUT_BC);} //そうでないとき停止 } PlaySound(SOUND_UP); //ループを抜けたら音で合図 Off(OUT_BC); }
sub turn_left() //左折のサブルーチン { OnFwd(OUT_B); Off(OUT_C); Wait(50); Off(OUT_B); }
車体部分のメインのプログラム
task main() { ClearTimer(0); //タイマーをリセット follow_line(); //C地点まで移動 Wait(20); OnFwd(OUT_BC); //トレーを掴めるように位置を調整 Wait(95); Off(OUT_BC); OnFwd(OUT_C); //車体をトレーに向かせる OnRev(OUT_B); Wait(100); Off(OUT_BC); OnRev(OUT_BC); //後退して,アームを下げたときにトレーに当たらないようにする Wait(230); Off(OUT_BC); Wait(40); SendMessage(DOWN); //アームを下げるための信号を送信 Wait(1); SendMessage(STOP); //アームの動きを終了させる信号を送信 OnFwd(OUT_BC); //アームの間にトレーを入れる Wait(300); Off(OUT_BC); OnFwd(OUT_B); //ロボットを左側のコースのほうに向かせる OnRev(OUT_C); Wait(220); Off(OUT_BC); Wait(20); OnFwd(OUT_BC); //左側のコースに移動 Wait(400); Off(OUT_BC); OnFwd(OUT_C); //ゴールに背を向ける OnRev(OUT_B); Wait(120); Off(OUT_BC); OnRev(OUT_BC); //ゴールに近づきながらアームを持ち上げ,ボールをレールの上に転がす SendMessage(UP); Wait(200); SendMessage(STOP); //アームの上昇を止める Off(OUT_BC); }
アーム部分のマクロ.アームの動きが早すぎるとアームが壊れてしまうため,SetPowerを使って下げる時は速度を遅くし,上げる時は,パワーが必要なので,速度を早くしてしている.
#define arm_up SetPower(OUT_AC,6);OnFwd(OUT_AC); Wait(30); Off(OUT_AC); //アームを上げる #define arm_down SetPower(OUT_AC,1);OnRev(OUT_AC); Wait(50); Off(OUT_AC); //アームを下げる #define UP 13 //アームを上げる時の信号 #define DOWN 12 //アームを下げる時の信号 #define STOP 11 //アームの動きを終了するときの信号
メインのプログラム
task main() { ClearMessage(); //信号を一度リセットする while(true) { if(Message() == STOP) { //STOPという信号を受信したときアームの動きを終了 Off(OUT_AC); } else if (Message() == DOWN) { arm_down; //DOWNという信号を受信したときアームを下ろす } else if(Message() == UP) { arm_up; //UPという信号を受信したときアームを上げる } } }
私たちの作ったロボットは本番では1つも玉をとることができなかった.その原因は,下したアームが2枚のコースの間を固定したセロハンテープの段差に引っかかってしまったという残念なものだった.前日にやっていた時はそのようなことは起こらなかったので対策ができていなかった.アームの接地面に丸みのあるパーツをつけることで対策できたと思う.車体がかなり大きくなってしまったことも反省しなければならないと思った.他のグループの中にはかなりコンパクトなものもあったので,構造を工夫することでより動きやすくできたはずだと思った.