[[2012b/Member]] *目次 [#n323254f] #contents *メンバー [#s97f969a] -YOU-クズ -KURO-神。 *課題内容 [#da54bd48] ボールを運びつつ、ライントレースをするロボットを作る。 **ルール [#m6fcd6fd] -画像のコースをスタートからゴールまでボールを持ったままライントレースしながら移動し、最後にゴールにボールをシュートする。~ -メンバー二人で別々の方向からスタートする今回の場合はYouが右から、KuRoが左からスタートする。~ -途中で置いてある障害物には触れてはならない。 #ref(./2012b-mission1.png,100%,コース) **この競技のポイント [#j459b2d7] -コース中2箇所に設けられたダミーの交差点を突破すること。 -ゴールを認識させ、ボールをシュートすること。 -ボールを確実に掴むこと。 *ロボット [#ae184707] **全体像 [#wecd3db5] まず後輪を廃し、後輪の代わりに先端の丸い棒を取り付け、引きずるような形で進む形にしました、これにより小回りの効く走行が可能になります。~ 更に全体的に車高を低くして車体全体に安定感を出させました。~ #ref(./IMG_20121221_031134.jpg,10%,全体図) **アーム [#o98f8512] ボールを運ぶ手段としてアームを採用しました。~ 空いてたモーターBをギア二つを使い90°向きを変えてアームの動力源としました。~ アームの上げ下げによりボールを捕まえ、発射は構造上出来ないのでアームを上げて車体を進めて押し込む形になります。~ #ref(./IMG_20121221_031209.jpg,10%,全体図) *プログラム [#z19a4ece] 僕はコースを右側からスタートするプログラムを作りました。~ #define THRESHOLD 47 #define go OnFwd(OUT_AC); #define back OnRev(OUT_AC); #define off Off(OUT_ABC); #define turn_left1 OnFwd(OUT_C); OnRev(OUT_A); #define turn_left0 OnFwd(OUT_C); Off(OUT_A); #define turn_right0 OnFwd(OUT_A); Off(OUT_C); #define turn_right1 OnFwd(OUT_A); OnRev(OUT_C); #define STEP 1 #define arm_up OnFwd(OUT_B); #define arm_down OnRev(OUT_B); #define shot arm_up;Wait(100);off;go;Wait(100);back;Wait(200);off;arm_down;Wait(100);off; task main(){ int i=0; int count=0; int angle=36; arm_up; Wait(10); turn_left1; Wait(angle); arm_down; Wait(10); turn_right1; Wait(angle); go; Wait(100); SetSensor(SENSOR_2,SENSOR_LIGHT); ここからライントレース開始です turn_right0; SetSensor(SENSOR_2,SENSOR_LIGHT); while (i==3){ if(i==1){ turn_right0; Wait(angle+angle); off; i=0; turn_right0; } if(i==2){ turn_right0; Wait(angle); shot; i=3; } else { if(count<=20){ turn_right0; Wait(angle-count); if(SENSOR_2 < THRESHOLD -3){ i=1; } turn_left0; Wait(angle+angle); if(SENSOR_2 < THRESHOLD -3){ i=2; } } else { if (SENSOR_2 < THRESHOLD -8) { turn_left1; count=0; } else if (SENSOR_2 < THRESHOLD -3) { turn_left0; count=0; } else if (SENSOR_2 < THRESHOLD +3) { go; } else if (SENSOR_2 < THRESHOLD +8) { turn_right0; count++; } else { turn_right1; } Wait(STEP); } } } Wait(STEP); } } } off } off } **ライントレース [#hdbf0f0e] まずライントレース部分ですが、これはほとんどテンプレどうりです。~ センサーが白だったら右回り黒だったら左回りに、中間の灰色くらいなら直進と言ったシンプルなライントレースです。~ **終点の判断 [#t3158188] プログラミングで一番苦労したのが恐らくこの終点の判断です。~ どうやって終点かどうかの判断をするか考えた時にT字路に突き当たる形で入っていくのは終点だけだと気づきました。~ そこで明らかに直角以上の角に差し掛かった時に進行方向の90°ずつ曲がった所が黒なら終点とする判断をするようにしました。~ 具体的にはライントレース中に白をセンサーが認識するとcountの値が1増えます。~ countが20を超えると終点かどうかの判断のためのプログラムに移行します。~ **終点かどうかの判断のためのプログラム [#we87ac10] countが20を超えるとこちらに移行します。 まず右側に旋回しそこが黒かどうかの判断をします *感想 [#yf6a87eb] 情工の授業のプログラムとは違った数字を弄るだけでなく実際にどう動くかを考えなければならないのが難しかったが、そこを考えるのもまた楽しかった。~ #define THRESHOLD 45 #define go OnFwd(OUT_AC); #define back OnRev(OUT_AC); #define off Off(OUT_ABC); #define turn_left1 OnFwd(OUT_C); OnRev(OUT_A); #define turn_right1 OnFwd(OUT_A); OnRev(OUT_C); #define STEP 1 #define arm_up OnRev(OUT_B); #define arm_down OnFwd(OUT_B); #define shot arm_up;Wait(100);off;go;Wait(100);back;Wait(200);off;arm_down;Wait(100);off; task main(){ int i=0; int count=0; int angle=36; SetPower(OUT_ABC,3); arm_up; Wait(10); off; arm_down; Wait(100); SetSensor(SENSOR_1,SENSOR_LIGHT); while (i<=2){ if(i==1){ turn_right0; Wait(angle+angle); off; i=0; } if(i==2){ turn_right0; Wait(angle); shot; i=3; } else { if(count<=20){ turn_right0; Wait(angle-count); if(SENSOR_2 < THRESHOLD -8){ i=1; } turn_left0; Wait(angle+angle); if(SENSOR_2 < THRESHOLD -8){ i=2; } } else { } else if (SENSOR_2 < THRESHOLD -3) { turn_left1; count=0; } else if (SENSOR_2 < THRESHOLD +3) { go; } else if (SENSOR_2 < THRESHOLD +8) { turn_right1; count++; } Wait(STEP); } } } off } #define THRESHOLD 45 #define go OnFwd(OUT_AC); #define back OnRev(OUT_AC); #define off Off(OUT_ABC); #define turn_left1 OnFwd(OUT_C); OnRev(OUT_A); #define turn_left0 OnFwd(OUT_C); Off(OUT_A); #define turn_right0 OnFwd(OUT_A); Off(OUT_C); #define turn_right1 OnFwd(OUT_A); OnRev(OUT_C); #define STEP 1 #define arm_up OnRev(OUT_B); #define arm_down OnFwd(OUT_B); #define shot arm_up;Wait(100);off;go;Wait(100);back;Wait(200);off;arm_down;Wait(100);off; task main(){ int i=0; int count=0; int angle=36; SetPower(OUT_ABC,2); arm_up; Wait(10); off; arm_down; Wait(100); SetSensor(SENSOR_1,SENSOR_LIGHT); while (i<=2){ if(i==1){ turn_right0; Wait(angle+angle); off; i=0; } if(i==2){ turn_right0; Wait(angle); shot; i=3; } else { if(count<=20){ turn_right0; Wait(angle-count); if(SENSOR_2 < THRESHOLD -3){ i=1; } turn_left0; Wait(angle+angle); if(SENSOR_2 < THRESHOLD -3){ i=2; } } else { if (SENSOR_2 < THRESHOLD -8) { turn_left1; count=0; } else if (SENSOR_2 < THRESHOLD -3) { turn_left0; count=0; } else if (SENSOR_2 < THRESHOLD +3) { go; } else if (SENSOR_2 < THRESHOLD +8) { turn_right0; count++; } else { turn_right1; } Wait(STEP); } } } off }