目次
きたざわ&ユウジ&こだま&ふかさわ
課題内容はロボコンのページをご覧ください。
土台ロボットの上に運搬用ロボットを乗せて境目の板の切れ目のところに行き、そこで土台ロボットの板を倒し運搬用ロボットを向こう側に送ります。
ピンポン球を回収し、運搬用ロボットが土台ロボットの上に戻って来たところで土台ロボットをスタート地点に戻します。
図の赤の動きが土台ロボット、青の動きが運搬用ロボットです。また、土台ロボットはライントレースしながら境目の板まで進みます。
完成したロボットがこちら。
競技のスタート時は左の画像の状態です。また、部分ごとに作ったので右の画像のようにうまく分解することができます。
1つのモーターで、斜めに付いているキャタピラと地面に密着しているキャタピラの両方を動かします。ピンポン玉を回収した帰りは土台ロボットの斜めになった板を登ることになります。斜めに付いているキャタピラのおかげで、うまく坂を登り始めることができます。
モーターの部分を上から見た図です。中央のギアは左右別々になっています。ギアの組み方を工夫したことでキャタピラを回す力を大きくしています。
ピンポン玉を集めるときに使う籠です。 できるだけ軽く、尚且つ丈夫になるようにテクニックパーツを多用して作りました。
また、ピンポン玉がうまく嵌まるような間隔で底を作りました。
籠を上げ下げする部分です。ここもギアの付け方を工夫することにより、多少籠が重くても持ち上げることができるようになっています。
板を上げた状態です。チューブのパーツをひっかけてストッパーとして使っています。
板を倒した状態です。右の画像のように板の先端を工夫したことにより、板と地面の間に段差ができないようにしています。
土台ロボットはライントレースをする必要があるため光センサーを付けました。
帰ってきた運搬用ロボを止めるためのストッパーです。運搬用ロボが板を登りきる時間が安定しなかったため付けました。この部分は、運搬用ロボにタッチセンサーを使えばよかったです。
まず木枠の端に籠を降ろし、前進してピンポン玉に紫のチューブを超えさせます。
籠を上げていき、
一番奥にピンポン球を落とします。 この動作を繰り返し、上の画像のようにピンポン玉を詰めていきます。
籠の仕組みにより、一度入ったピンポン玉は奥へは行かず入り口に止まります。 この状態で前進させると、木枠に残ったピンポン玉は籠に入らないので、壁の役割をして籠が壊れてしまいます。 そこで木枠の奥までいっきに進ませるのではなく、少しずつ進ませる距離を長くしながら繰り返しピンポン玉をとる動作をさせることにしました。
#define go OnRev(OUT_A+OUT_C); //前進 #define back OnFwd(OUT_A+OUT_C); //後退 #define down OnFwd(OUT_B);Wait(210);Off(OUT_B); //籠を下げる #define up OnRev(OUT_B);Wait(230);Off(OUT_B); //籠を上げる #define stoping Off(OUT_A+OUT_C); //ロボのタイヤを動かしているモーターを止める task main() { ClearTimer(0); while(true) { if(Timer(0)==150) { //競技をスタートしてから15秒後にタスクをスタートする(この時に下の土台が中央の板に着いているはず) go;Wait(750); //まっすぐ前進して、ピンポン玉の入った木枠まで行く back;Wait(200);stoping; //少し下がり、籠を下ろしたときに丁度木枠の端に籠が当たるようにする repeat(2) { down; //籠を下げる go;Wait(100); //少し進んでピンポン玉を入れる back;Wait(100);stoping; //少し下がり up; //籠を上げ、籠に入ったピンポン玉を籠の奥に入れる } //ここまでの動作を2回繰り返す repeat(2) { //上と同じ動作、少し進む距離を長くする down; go;Wait(150); back;Wait(150);stoping; up; } down; //上と同じ動作、更に進む距離を長くし、木枠の一番奥まで進ませる go;Wait(220); back;Wait(200);stoping; up; OnRev(OUT_B);Wait(100);Off(OUT_B); //籠に入ったピンポン玉の重みで、籠の上げ下げに誤差が生じ、籠が上がりきっていないことが予想されるので、もう一度少し籠を上げる back;Wait(1000);stoping; //バックして土台の上に戻りストップ } } }
#define Turn_R OnFwd(OUT_A); #define Turn_L OnRev(OUT_C); #define back OnRev(OUT_C);OnFwd(OUT_A); //後退 #define Light_R 43 #define Light_L 45 #define Tomare Off(OUT_A+OUT_C); //停止 #define go OnFwd(OUT_C);OnRev(OUT_A); //前進 #define Eye_R SENSOR_1 //右の光センサ #define Eye_L SENSOR_3 //左の光センサ #define RUN_TIME 800 //時間を定義 task main() { SetPriority(1); SetSensor(Eye_R, SENSOR_LIGHT); SetSensor(Eye_L, SENSOR_LIGHT); ClearTimer(0); //タイマーをリセット go;Wait(300);OnRev(OUT_A+OUT_C);Wait(90); start follow_line; //もう一つのtaskを使用 until((Eye_R < Light_R) && (Eye_L < Light_L)); //光センサーが両方反応するまで acquire(ACQUIRE_OUT_A+ACQUIRE_OUT_C){ Tomare;Wait(50); go;Wait(54); OnFwd(OUT_A+OUT_C);Wait(98); go;Wait(75); Tomare; stop follow_line;} //もうひとつのタスクを止める while (true){ acquire(ACQUIRE_OUT_A+ACQUIRE_OUT_C){ if( Timer(0) == RUN_TIME ){ //設定した時間になったら動作を開始する OnRev(OUT_C);OnFwd(OUT_A);Wait(300); go;Wait(100); OnRev(OUT_A+OUT_C);Wait(150); back;Wait(200); OnFwd(OUT_A+OUT_C);Wait(100); back;Wait(200); OnFwd(OUT_A+OUT_C);Wait(500); back;Wait(400); Tomare;} } }} task follow_line() //有線順位の低いtask { SetPriority(2); while (true) { acquire(ACQUIRE_OUT_A+ACQUIRE_OUT_C){ go; if ((Eye_R < Light_R)&&(Eye_L > Light_L)) //右の光センサが反応したら { Turn_R; Wait(15); Tomare; } else if ((Eye_L < Light_L)&&(Eye_R > Light_R)) //左の光センサが反応したら { Turn_L; Wait(15); Tomare; } }}}
このプログラムは複数のtaskを使っており、課題2左のプログラムをベースに作成されてます。
今回はロボットを作るのに時間がかかり、プログラムの方がおろそかになってしまった。運搬用のロボが土台ロボの板を降りるときに、板はできるだけ平らにして段差も少なくしたのだが、どうしても進む方向に誤差が生じ、土台ロボの上に帰還できないことが多かった。運搬用ロボにもライントレースを行わせ、正確に行き帰りをさせたかった。
今回はシンプルなコース設定ではありましたが、クリアすることができず試行錯誤の繰り返しでした。ロボティクスの授業を通して、ロボットは動かすのが大変だとわかりました。この経験は今後に生かせるので、とてもよかったと思います。
他の用事があり、あまりロボットの製作に参加できず、他のメンバーにとても助けられました。
今回、多くの案を出してもうまくいかず、ロボット作りの難しさを実感しました。
今回はほかの用事と重なってしまい、ロボットの原案を考える部分までしか手伝えませんでした。ほかのメンバーには申し訳ないことをしたと思います。コースの設定は非常にシンプルなものでしたが、壁が高く、どのようにして壁を越えるかを考えるのがとても大変でした。
コメントをお願いします。