#contents *課題の内容 [#je676f8e] 課題2で作成したコース上にランダムに置いたテニスボール(3個)をロータリーの中央部分に置いたランタンに向かって 1. 転がす 2. 最短距離で運ぶ ロボットを作成せよ。ただし、1の場合はテニスボールの置いてある場所から直接転がし、 2の場合はその場所から最短距離で運ぶこと。ボールを探す際にはラインに沿っても沿わなくてもよい。 *メンバー [#g1943431] **くまちゃん [#i1d1c60d] 夜に集まるとすぐ寝ちゃいます。 **show [#b4f42659] 夜に集まるとずっとテレビ見ちゃいます。 *マシン紹介 [#i31a91ff] **光センサー [#a69e993e] ラインに沿って走るときにずれないように中心部に設置! **タッチセンサー [#i691ab8c] ボールとの触れる面積を増やすために広めのレゴを装着。 授業で習ったようにてこの原理を利用したかったが上に方にタッチを設置しずらかったためレゴをつけることにより反応を高めた。 **アーム [#jece0f54] 初めはゴムなどを利用し一つのモーターで二つのアームを動かす作りにした。 しかしこれは幅をとる上にあまり掴みがよくなかった。 それで考えたのは一つのアームだけでボールを掴む方法である。 しかもこれでボールを蹴り出す時もまっすぐ出来る。 **全体像 [#c9366d7d] あまり見た目はよくないかもしれないが時間をかけていろいろ試した結果、一番よかった! *プログラミング [#k20cf2cc] **くまちゃん [#v6af54fb] #define THERESHOLD 40 task kuma(){ while(true){ if (SENSOR_3 > THERESHOLD){ OnFwd(OUT_A); Off(OUT_C); } else{ OnFwd(OUT_C); Off(OUT_A); } } } task main() { int lmax = 0; int tmax = 0; SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_2, SENSOR_TOUCH); SetSensor(SENSOR_3, SENSOR_LIGHT); repeat(4){ start kuma; until (SENSOR_2 == 1); stop kuma; Off(OUT_A+OUT_C); OnRev(OUT_B); Wait(15); Off(OUT_B); ClearTimer(0); while(FastTimer(0) < 500){ Off(OUT_A+OUT_C); OnFwd(OUT_A); OnRev(OUT_C); if(SENSOR_1 > lmax){ lmax = SENSOR_1; tmax = FastTimer(0); } } OnFwd(OUT_C); OnRev(OUT_A); Wait(500-tmax); OnFwd(OUT_A+OUT_C); until(SENSOR_1 > 45){ Off(OUT_A+OUT_C); OnFwd(OUT_B); OnRev(OUT_A+OUT_C); Wait(10); OnRev(OUT_A); OnFwd(OUT_C); Wait(lmax); Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C); Wait(30); Off(OUT_A+OUT_C); } } } **show [#w0a66ddd] #define SHINE 35 //ライントレースの敷値 task usually() //基本のライントレース。ギザギザに動く { while(true) { if (SENSOR_3 < SHINE) { OnFwd(OUT_A); Off(OUT_C); } else { OnFwd(OUT_C); Off(OUT_A); } } } int L_MAX = 0; //光センサーが受けた最大値 int T_MAX = 0; //光センサーが受けた最大値までの時間 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_3,SENSOR_LIGHT); repeat(3) //次のプログラムを3回繰り返す { start usually; //ライントレース開始 until(SENSOR_2 == 1); //タッチセンサー反応 stop usually; //ライントレース終了 Off(OUT_A+OUT_C); OnRev(OUT_B); //アームを閉じる Wait(25); Off(OUT_B); ClearTimer(0); while(FastTimer(0) < 500) //回転しながら光の最大値を探す { OnFwd(OUT_A); OnRev(OUT_C); if(SENSOR_1 > L_MAX){ L_MAX = SENSOR_1; //光センサーがL_MAXを越えたときSENSOR_1がL_MAX T_MAX = FastTimer(0);} //回転した時間-T_MAX分、逆回転する } OnFwd(OUT_C); OnRev(OUT_A); Wait(500-T_MAX); Off(OUT_A+OUT_C); OnFwd(OUT_B); //アームを開く Wait(15); Off(OUT_B); OnRev(OUT_A+OUT_C); //後ろに下がる Wait(70); Off(OUT_A+OUT_C); OnRev(OUT_B); //アームを閉じる Wait(15); Float(OUT_B); //フロートによって蹴り出す位置までアームを閉じる(上の写真) OnFwd(OUT_A+OUT_C); //前に進みボールを押す Wait(100); Off(OUT_A+OUT_C); OnFwd(OUT_B); //アームを開く Wait(30); Off(OUT_B); OnRev(OUT_A+OUT_C); //ボールを押し出すために前に出た距離戻る(ラインへ) Wait(30); Off(OUT_A+OUT_C); } } *重要視したところ [#x58d6c1e] 重要視したところはタッチ面を広くしてきちんと反応させることである。 初めアームから作っていてアームが完成(初めの一つのモーターで二つアームを動かしていたやつ)したが タッチセンサーをつける場所を作れずタッチ面が非常に小さくなりボールに当たってもまったく反応しなかった。 だからまずタッチセンサーを作りタッチ面を広くした。 そしてアームを一つでボールを掴む方法を考えた。 これが一番上手くいった。 *反省 [#l2fd1a92] **くまちゃん [#u91a16fa] ギリギリ頑張ったが、結局ライトレースをして明るさの最大値を探し出してはうまくいったが、それをライトの位置まで持っていくときに上手く動かなかった。 マシンの反省点については、両側面についている車輪と車輪が離れすぎてて、動作が大きくてスムーズに回らなかったりした。 また、初めはゴムで動くようにしたアームを取り付けていたが,モーターの力をゴムを使って三段階を経て伝達したのでアームを閉めたときに固く閉まらず緩まり、全然ボールがつかめなかった。 また、改良後のアームでも歯車部分が不安定で壊れやすかったので、そこはもっと改良すべきだとも思った。 よかった点はライトレース用のセンサーがマシンの中心にあり進行に対してずれなくて、ボールを捕らえやすかった点です。 あと、ボール用のタッチセンサーは先生が授業中におっしゃってた、大きめの板に出っ張りを付けてクリアしました。 **show [#wfbe1d8d] *感想 [#racb7fc0] **くまちゃん [#cfe9358b] 今回はプログラムを今までで一番考えた。 プログラムばっかりしていてマシンの方にあまり気が回らなかったのが少し残念だった。 今回はマシン作りを相方がだいぶ頑張ってくれたので助かりました。 次のロボコンでは絶対に動かして成功させたいと思います。 **show [#mc213d01] *コメント [#d760dd32] コメントお願いします。 #comment 今日: &counter(today); 昨日: &counter(yesterday); 総合: &counter(all); オンライン: &online;