[[2012b]] *ロボット [#xd9344e7] **紹介・特徴 [#n6d53054] 分解し組み直すことでできなかったため、初期を基本に組み上げた。 #ref(robo01.jpg);ロボットを正面から見た写真 このようにベースが最初のロボットである。 #ref(robo02.jpg); . . #ref(robo03.jpg); アーム部分はボールが零れないようにレゴを使い固定した。 また、ボールを押し出す際に押し出せるようにアーム内部にレゴを組み込んだ。(写真はうまく撮ることができなかった)この部分を用いることでボールを押し出し、ゴールを決めることに成功した。 そして、側面はこのようになっている。 #ref(robo04.jpg); . . #ref(robo05.jpg); 全体として、小型化に失敗してしまったが、初期のものより多少は小さくなっていると思う。 ***反省 [#oaa82d02] -初期の形を崩すことができず、初期の型から少しだけ小さくなっているだけになった。 -アームを追加することでボールを運ぶことには成功したが、ポールのことを忘れていてぶつかってしまった。 -周りの人のロボットの多くは動力を縦にして組むことでサイズを小さくしていたので次回はその発想を生かしたい。 ***次回のために [#ob59e0ab] -課題をよく読み、ロボットの知識を持った人にロボットの改造の仕方を学んでおく。 -記憶に残るもので、なおかつイメージ通りに動かせるようなものを作る。 -前もってイメージを作り、周りにも意見をもらうことでより質の高いロボットを作る。 *課題内容 [#abc4073f] ※先生のページのコピーです。 図のようなコースを各自で作成した上で、次のような動作をするロボットを作成せよ。 -1人目 ++スタート地点から出発し、スタート地点外のすぐ近くに置かれたピンポン玉をつかむ。 ++ピンポン玉をつかんだら速やかにスタート地点の境界の黒線に戻り、そこから黒線に沿って動いてゴール地点を目指す。ただしT字路では、直進、右折、左折を正しく判断させること。また、曲線部中央の障害物に接触しないようにすること。 ++ゴール地点に到達したら、ゴールエリア外からピンポン玉をゴールにシュートする。 ただし、どうしてもエリア外からのシュートが難しい場合は、エリア内からシュートした後、エリアから出てもよい。 -2人目 ++上の動作でスタートとゴールを逆にして同様の動きをするプログラムを作成せよ。ロボット本体は共通のものを使うとする。 #ref(2012b/Mission/2012b-mission1.png,100%,課題1のコース) **課題達成のために [#z32adad4] 交差点の数を数え、ある回数でシュートするプログラム。 そして交差点を通過するためのプログラムを作るべきと感じたが、作成することができなかった。そのため時間指定により動くロボットを作った。 黒い線の右を通るか、左を通るかを切り替えることで交差点に悩まないようにした。 *プログラム [#id8269ae] **プログラム内容 [#x9b22d78] 上に書いたようなプログラムを作ろうとしたが失敗したため、時間指定により動くプログラムを作った。 ++黒い線上の場合は右に曲がり、白い線上の場合は左に曲がるプログラム。 ++黒い線上の場合は左に曲がり、黒い線上の場合は右に曲がるプログラム。 このふたつを時間によって使い分けゴールまでライントレースを行った。 これにより、交差点等で悩むことがない。 #ref(robo06.jpg); ***プログラムのイメージ画像[#r47803dc] &ref(robot.1.jpg); この図のようなやり方でライントレースを行う。 &ref(robot3.jpg); 動かした例としてはこのようになる。 そして、ゴール前まで運ぶと #ref(robot2.jpg); という動きに切り替わる。 この動きを説明すると +まず、(1)のような動きでゴールの方向を向く。 +向いたらロボットを停止させ、ボールを落ち着ける。 +アームをあげて、押し出す姿勢を作る。 +そして、(2)のように動く。この動きは100%で行い、ボールを強く押し出す。 +最後に枠外へ出るためにバックする。 ***作成したプログラム [#d7898fd3] #define right01 OnFwd(OUT_C,40);OnRev(OUT_B,20); #define left01 OnFwd(OUT_B,40);OnRev(OUT_C,20); #define THRESHOLD 45 #define STEP 10 #define left00 OnFwd(OUT_B,30);OnFwd(OUT_C,-30);Wait(1200); #define mae00 OnFwd(OUT_BC,20);Wait(600); #define right00 OnFwd(OUT_C,30);OnFwd(OUT_B,-30);Wait(400); #define short_break00 Off(OUT_BC); Wait(1000); #define mae01 OnFwd(OUT_BC,20);Wait(400); #define short_break01 Off(OUT_BC); Wait(500); task main() { /*ボールを回収するプログラム*/ left00; mae00; short_break00; OnFwd(OUT_A,20);Wait(300);Off(OUT_A); mae01; right00; SetSensorLight(S3);//光センサーを起動 short_break01 /*タイマーをセットし起動*/ long time1,timeA; time1 = CurrentTick(); /*指定時間の間黒線上なら左、白線上なら右へ曲がるプログラムで移動*/ while(5000 >= timeA) { //5秒間繰り返す timeA = CurrentTick()-time1; if(SENSOR_3 < THRESHOLD) { left01; }else { right01; } Wait(STEP); } /*ここで黒線上なら右、白線上なら左へ曲がるプログラムに切り替える*/ short_break01 OnFwd(OUT_C,30);Wait(300);//切り替えが失敗しないようにプログラムの切り替え前に右側に振り切る long time2,timeB; //二つ目のタイマーを作成 time2 = CurrentTick(); //タイマーを起動 while(9000 >= timeB) { //9秒間繰り返す timeB = CurrentTick()-time2; if(SENSOR_3 < THRESHOLD) { right01; }else { left01; } Wait(STEP); } /*ここで再び最初のプログラムに切り替える*/ short_break01; OnFwd(OUT_B,30);Wait(300); //切り替えが失敗しないように左に振り切る long time3,timeC; //三つ目のタイマーを作成 time3 = CurrentTick(); //タイマーを起動 while(26000 >= timeC) { //26秒間繰り返す timeC = CurrentTick()-time3; if(SENSOR_3 < THRESHOLD) { left01; }else { right01; } Wait(STEP); } /*ゴールをするためのプログラム*/ short_break01; right00; Off(OUT_BC);Wait(600);//ここでボールのゆれをとめる OnFwd(OUT_A,-30);Wait(500);Off(OUT_A); OnFwd(OUT_BC,100);Wait(300);Off(OUT_BC); OnFwd(OUT_BC,-100);Wait(400);Off(OUT_BC); } **反省 [#f85ab0ac] ++交差点を通るプログラムを書くことができなかった。交差点を判断、通過する動作をカウントで数え、ゴールを決めたかったが、イメージだけで、動かすことができなかったのがとてももどかしかった。 ++時間を指定するやり方もこのやり方では電池によってずれてしまうだろうと感じた。 そのため、ゴールの斜めから右を向かせるようにして、多少のズレならゴールするようには意識したが、解決はしていないと思う。 ++時間指定によるプログラムのため、応用が利かず、電池の消耗により、失敗することがでてきてしまう。つまり、安定性にかけている。 **今後のために [#k9c3c363] 課題のページをみんなが作ると思うので、それをよく見て、理解することで次回につなげることができると思っている。また、交差点のプログラムの授業を振り返り、課題としてやっていこうと考えている。 *全体をとおして [#r8742b22] ***反省・感想 [#g0705045] ロボットに関する知識も、プログラムに関する知識も足りないと痛感した。 期末までにはこの2つの知識をなんとしても得ることで、満足のいくものを創りあげたい。 また、自分の動かしたいもの、作りたいもの、イメージしていたものとの違いをとても感じている。この違いをなくせるようにしていきたいと思う。