目次
ボールを探し、ライトがあるところまで持っていくロボット。
周回コース(黒い線)上にあるボールを探し、運んでいく(又は飛ばす)ロボットを作成せよ。
周回コース(どのように進んでも良い)
<ロボット概要>
ライントレースをせず、紙の上を自由に動き回ってボールを探す。
ボールを見つけたらその場でライトを探し、持っていく(又は投げる)。
<センサー>
<車輪>
<上部>
<アーム部分>
<ギア>
<ボールを蹴る>
#define GO(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); #define BACK(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); #define turn_L(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C); #define turn_R(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_A+OUT_C); #define HOLD OnFwd(OUT_B); Wait(35); //ボールを掴む #define RELEASE OnFwd(OUT_B); Wait(35);Off(OUT_B); //ボールを離す
task SEARCH() //ボールを探すプログラム { while(true) { GO(200);turn_L(50); } } task MISSION() //ランタンにボール持っていくプログラム { int lmax=0; //光の変数 int tmax=0; //時間の変数 HOLD; ClearTimer(0); //タイマーをリセット while(FastTimer(0)<=400) { OnFwd(OUT_A); OnRev(OUT_C); if(SENSOR_1>lmax) { lmax=SENSOR_1;tmax=FastTimer(0); //lmax、tmaxを随時更新 } } turn_R(400-tmax); //ランタンがある方向に向く Wait(20); RELEASE; BACK(50); HOLD; GO(70); } task main() { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_2, SENSOR_TOUCH); while(true) { start SEARCH; //サーチプログラム始動 until(SENSOR_2 == 1); stop SEARCH; //サーチプログラム終了 start MISSION; //ミッションスタート Wait(1000); stop MISSION; //ミッションコンプリート } }
<ボールを掴んで持っていく>
#define MOVE(t) OnFwd(OUT_A+OUT_C); Wait(t); //直進 (関数を使う) #define BACK OnRev(OUT_A+OUT_B); Wait(200); //2秒間後退 #define TURN(t) OnFwd(OUT_C);OnRev(OUT_A); Wait(t); //右折 #define move(t) OnFwd(OUT_A+OUT_C); Wait(t); //直進 #define turn_R(t) OnFwd(OUT_C); OnRev(OUT_A); Wait(t); //右折 #define turn_L(t) OnFwd(OUT_A); OnRev(OUT_C); Wait(t); //左折 #define tomaru Off(OUT_A+OUT_C); //停止 #define tukamu OnFwd(OUT_B); Wait(50); //ボールをホールド #define throw OnRev(OUT_B); Wait(50); //ボールを離す
task SEARCH() { while (SENSOR_2==0){ MOVE(200); //タッチセンサーが押されてない間、自由に動き回ってボールを探す TURN(200); move(100); turn_R(100); MOVE(200); turn_L(100); move(100); TURN(200); } } task MISSION() { tukamu; //ボールをつかむ tomaru; Off(OUT_B); Wait(300); int lmax = 0; //光の変数 int tmax = 0; //時間の変数 ClearTimer(0); while(FastTimer(0)<800){ //一周回り一番光の強い値を測定する(8秒間続ける) OnFwd(OUT_C);OnRev(OUT_A); //ランタンを見つける if(SENSOR_1>lmax){ lmax = SENSOR_1; tmax = FastTimer(0); } } OnFwd(OUT_A); OnRev(OUT_C); //一番光の強い位置(ランタン)へ行く Wait(800-tmax); PlaySound(SOUND_UP) ; Wait(20); MOVE(200); //ランタンへ向かう throw; //ボールを離す BACK; } task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1に光、2にタッチセンサーをセット SetSensor(SENSOR_2,SENSOR_TOUCH); while(true){ start SEARCH; //サーチタスクを開始 until(SENSOR_2 == 1); //タッチセンサが押されたら開始 stop SEARCH; //サーチタスクを終了 start MISSION; //ミッションタスクを開始 Wait(1000); stop MISSION; //ミッションタスクを終了 } }
今回の課題をやっていて気づいた問題は タッチセンサーが上手く働かない アームの動きを止めてしまうと、ボールを掴みきれない の二点だった。
タッチセンサーの件は軽いタッチでも反応する様に、 かませる板とタッチセンサーの位置を工夫して解決。 アームの件はボールを掴んでいる間、常にモーター を動かしつづける事で解決した。 今回は自分でも上手く出来たと思う。ロボット作りから プログラムまでいろいろ大変だったけど、最終的にはス ムーズに動いてくれて良かった。次はロボコン。頑張ります。