課題2のコース上にランダムに置かれたテニスボールをロータリーのランプに一人は蹴って、もう一方は本体ごと運ぶ
Ku☆ra 様&mika
コースについては課題2の際に使用したものなので
そちらを参考にしてください。
名前:HD650
実際にテニスボールが当たるところよりも結構上方に設置。
テニスボールとタッチセンサーの間には仲介として可動式の
板をはさんだ。てこの原理もあって軽く触れただけで
センサーが反応するようになっている。
本体推進部よりもやや前方、アームに近い位置に設置。
今回の光センサーの目的はライントレースではなく
テニスボールを見つけることなのでできるだけ
アームがライン上にあるようにとこの位置にした。
シンプルに本体に設置。先生の助言通り
センサーの周りを覆って余計な光を遮断するようにした。
遮断するしないの違いは思ってたよりも大きかった。
タイヤの大きさが前後で違うがこれはこれは
アームを本体側に傾けるためである。
アームが可動式でありその影響と電池の重さで本体が
後方に倒れることがあったので後輪の後ろに
さらに補助輪を二つ追加した。
アームは本体と分かれておりアーム部全体が
動く仕組みになっている(ちなみにタッチセンサーも)。
本体内部に設置したモーターで前後に可動するようになっている。
後ろに引いた時に本体にぶつかりアームが閉じボールをつか無
前に出した時も同様にぶつかって放す仕組みになっている。
しかしながら、完璧にはアームは開かない。
タイヤによる本体の傾きは完璧に開かせるためである
またこのアームはアームが開いてボールを放す位置よりも
前にアーム部を押し出せるようになっている。
これはボールをける際に本体の動作だけでは力が不十分で
それを補うためのシリンダーの役割も担っているためである。
#define THRESHOLD 40 int L_MAX = 0; // ランプ用の光センサーの最高値 int T_MAX = 0; // 計測時間
task main() { SetSensor(SENSOR_1, SENSOR_TOUCH); SetSensor(SENSOR_2, SENSOR_LIGHT); SetSensor(SENSOR_3, SENSOR_LIGHT); repeat(3){ //繰り返し3個分 while(SENSOR_1 == 0) //テニスボールを発見するまで { if (SENSOR_3 > THRESHOLD) {OnFwd(OUT_C);Off(OUT_A);} else if (SENSOR_3 < THRESHOLD) {OnFwd(OUT_A);Off(OUT_C);} } Off(OUT_A+OUT_C); //発見 OnRev(OUT_B);Wait(60); //つかむ Off(OUT_B); ClearTimer(0); // ランプ検索開始 while(FastTimer(0) < 450) //360°回転する { OnRev(OUT_A);OnFwd(OUT_C); if(SENSOR_2 > L_MAX) {L_MAX = SENSOR_2;T_MAX = FastTimer(0);} //最大値を探す } OnFwd(OUT_A);OnRev(OUT_C);Wait(450-T_MAX); // ランプの方に向ける Off(OUT_A+OUT_C); OnFwd(OUT_B);Wait(60); // ボールを放す Off(OUT_B); OnRev(OUT_A+OUT_C);Wait(60); // バックして助走 Off(OUT_A+OUT_C); OnRev(OUT_B);Wait(20); // アームを引っ込める Off(OUT_B); OnFwd(OUT_A+OUT_C);Wait(90); // 前進突撃 OnFwd(OUT_B);Wait(40); // アームでどつく Off(OUT_A+OUT_B+OUT_C); OnRev(OUT_A+OUT_C);Wait(130); Off(OUT_A+OUT_C); OnRev(OUT_B);Wait(20);// アームを戻す Off(OUT_B); } Off(OUT_A+OUT_C); //三回終了後停止 }
#define THRESHOLD 40 // 閾値 int T=490; //回転時間 int lmax=0; //光センサーの最高値 int tmax=0; //計測時間
task main() { SetSensor(SENSOR_1,SENSOR_TOUCH);//センサー1はタッチセンサーである SetSensor(SENSOR_2,SENSOR_LIGHT);//センサー2は光センサーである SetSensor(SENSOR_3,SENSOR_LIGHT);//センサー3は光センサーである repeat(6){ while(SENSOR_1 == 0) {if (SENSOR_3 > THRESHOLD) {OnFwd(OUT_C);Off(OUT_A);} else if (SENSOR_3 < THRESHOLD) {OnFwd(OUT_A);Off(OUT_C);} } Off(OUT_A+OUT_C); // テニスボール見っけ!! OnRev(OUT_B);Wait(60); Off(OUT_B); ClearTimer(0); // ランプ見つけるの始める。 while(FastTimer(0) < 490) //360°回転 { OnRev(OUT_A);OnFwd(OUT_C); if(SENSOR_2 >lmax) {lmax = SENSOR_2;tmax = FastTimer(0);} } OnFwd(OUT_A);OnRev(OUT_C);Wait(490-tmax); // ランプの方に向く OnFwd(OUT_C+OUT_A); // 前進 until (SENSOR_2 > 50); Off(OUT_A+OUT_C); OnFwd(OUT_B);Wait(60);//ボールを放す Off(OUT_B); OnRev(OUT_A+OUT_C);//バックする(黒い線から脱出) until (SENSOR_3 < THRESHOLD );//元のボールのあった線に到着 Wait(20);//誤差を修正する Off(OUT_A+OUT_C); } Off(OUT_A+OUT_C); }
本体設計に関しては使えるモーターの数が限られているなどあってかなり思案した。 本体の推進力として最低二つ。よって残り一個のモーターで 「ボールをつかむ」「ボールを蹴る」の二つの動作をしなければならない。 いくつか候補はあったが結局今回のモデルを採用した。 プログラミングに関しては、初めはどういうプログラミングにすればよいか分からず非常に困惑した。考え方は非常に納得のいくものなのだが、それを行うにはどうやって プログラミングを書けばよいのかまったく分からなかった。過去の授業や先生の助言などを参考にして完成させた。出来上がったプログラムを見ると案外簡単で少々がっかりした。
パートナーにリピートを使うといいよと教えてもらって、やってみるとプログラムの量がめっちゃ小さくなってびっくりした。でもすっきりした感じになったのはとてもよかった。私はテニスボールをつかんでもっていく方だったけど、ロータリーまではこんで、ロータリーとどう感知するか、ロータリーの真ん中においたあとロボットがどう離れていくかのプログラミングがむずかしかった。リピート機能の大切さと一つ一つ動作設定していくことの大切さがわかった。