[[2013b/Member]] *ロボコン概要 [#q576baa0] 2台のマインドストームをうまく連携させ、コース中にある計9個の缶をゴールの領域の中により高く積み上げる。 *プラン [#o03cf751] 一方のロボ(以下ロボA)を缶の積み上げ専門に、もう一方(以下ロボB)を缶をかき集める専門にし、通信によりロボAに缶が来たことを知らせて缶を積み重ねさせる、という形式をとった。 はじめはロボAがコースの左側(スタートを画面左下に置いたとき)のR=16のライン上にある缶とR=8の半円の中央にある缶をまず回収し、ゴールへ向かい、ロボBが運んでくる缶を積み上げて置いていく、というプランでロボ本体とプログラムを組み上げていった。 *プログラム [#p919e4fe] **初期型 [#lca7b197] 数値やマクロの定義 #define HP 3 #define LP 0 #define THRESHOLD 36//ライントレース用閾値 #define turn_right1 OnFwd(OUT_A);//右折マクロ #define go_forward OnFwd(OUT_AC);//直進マクロ #define turn_left1 OnFwd(OUT_C);//左折マクロ #define TIME_TRACE1 3//トレースの1回の判断で待つ時間 #define TIME_TRACE2 500//下記「//4.〜5.」で本体を90度回転させる地点を指定する値 #define NB_COUNT 4//交差点識別用の黒の回数を数える値 #define MESSSAGE_CAN 11//缶が運ばれてきたことを判断するため通信で送る値 缶を積むサブルーチン sub stack_can() { OnRev(OUT_B); */このサブルーチンを走らせる前ではアームユニットは上がっているため ユニットを降下させつつアームを開く/* Wait(120); Off(OUT_B); OnFwd(OUT_B);//缶をつかみつつ持ち上げる Wait(120); Off(OUT_B); } プログラム本体 task main() { SetSensor(SENSOR_2,SENSOR_LIGHT); int nbk=0//閾値以下となった回数をカウントする変数 int ncros=0//交差点の回数をカウントする変数 SetPower(OUT_AB,LP); SetPower(OUT_C,HP); //1.黒線に当たるまで前進 OnFwd(OUT_AC); until (SENSOR_2>=THRESHOLD); //2.左折しライントレース turn_left1;OnRev(OUT_A); Wait(80);//90度旋回 ClearTimer(0); while(ncros=0){//交差点を通過するまでライントレース(この時コース上の缶はコの字型のシャーシの中に入る) while(nbk<NB_COUNT){ if(SENSOR_2<THRESHOLD-3){turn_left1;nbk++;} else if(SENSOR_2<THRESHOLD+3){OnFwd(OUT_AC);nbk=0;} else{turn_right1;nbk=0;} Wait(TIME_TRACE1); } Off(OUT_AC); turn_left1; Wait(nbk*TIME_TRACE1); } //3.交差点を通過後缶を掴んで持ち上げる OnFwd(OUT_B); Wait(120); Off(OUT_B); //4.タイマーをリセットし適当な地点につくまでライントレース ClearTimer(0); while(FastTimer(0)<TIME_TRACE2){//1 if(SENSOR_2<THRESHOLD-3){turn_left1;} else if(SENSOR_2<THRESHOLD+3){OnFwd(OUT_AC);} else{turn_right1;} Wait(TIME_TRACE1); }//1 //5.90度右旋回し半円の中央にある缶を回収する turn_right1;Wait(80);//90度右旋回 OnFwd(OUT_AC); repeat(2){ until(SENSOR_2<THRESHOLD); until(SENSOR_2>THRESHOLD); }//ラインを2回またぐ Off(OUT_AC); stackile_can();//缶を積む turn_right1;Wait(90);//90度+a旋回 //6.ゴール直前の交差点までライントレース ncros=0; while(ncros<2){//1 while(nbk<NB_COUNT){//2 if(SENSOR_2<THRESHOLD-3){turn_left1;nbk++;} else if(SENSOR_2<THRESHOLD+3){OnFwd(OUT_AC);} else{turn_right1;} Wait(TIME_TRACE1); }//2 Wait(50); turn_right1;Wait(NB_COUNT*TIME_TRACE1); nbk=0; ncros++;; }//1 //7.ゴール中央へ移動し待機 turn_left1;Wait(NB_COUNT*TIME_TRACE1/2); OnFwd(OUT_C);OnRev(OUT_A);Wait(40);//90度左旋回 go_forward;Wait(60); OnRev(OUT_A);Wait(120);//135度左旋回 //8.通信をして缶を回収し積み上げる動作を繰り返す ClearMessage(); repeat(2){ until(Message()==MESSAGE_CAN); stackile can(); ClearMessage(); } //9.缶を置いてゴールから出る OnRev(OUT_B); Wait(120); Off(OUT_B); OnRev(OUT_AC); Wait(400) Off(OUT_AC); } *ロボット本体 [#y77a11e0] はじめは #ref(P2040005.JPG) のようにデファレンシャルギアを用いて、つかむ動作とアームを持ち上げる動作を一つのモーターで行おうとした。 1.モーターの出力を伝達し缶をつかむアームを閉じる 2.つかんだ1.の経路の抵抗が大きくなるとデファレンシャルギアの力の伝達の向きが変わり、歯車がシャーシに固定されたラックとかみ合いアームのついたユニットを持ち上げる しかしこれではアームとモーターが乗るユニットの左右のバランスをとることが非常に難しく、この案は断念した。