課題2で作成したコース上にランダムに置いたテニスボール(3個)をロータリーの中央部分に置いたランタンに向かって
1. 転がす 2. 最短距離で運ぶ
ロボットを作成せよ。ただし、1の場合はテニスボールの置いてある場所から直接転がし、 2の場合はその場所から最短距離で運ぶこと。ボールを探す際にはラインに沿っても沿わなくてもよい。
夜に集まるとすぐ寝ちゃいます。
夜に集まるとずっとテレビ見ちゃいます。
ラインに沿って走るときにずれないように中心部に設置!
ボールとの触れる面積を増やすために広めのレゴを装着。
授業で習ったようにてこの原理を利用したかったが上に方にタッチを設置しずらかったためレゴをつけることにより反応を高めた。
初めはゴムなどを利用し一つのモーターで二つのアームを動かす作りにした。
しかしこれは幅をとる上にあまり掴みがよくなかった。 それで考えたのは一つのアームだけでボールを掴む方法である。
しかもこれでボールを蹴り出す時もまっすぐ出来る。
あまり見た目はよくないかもしれないが時間をかけていろいろ試した結果、一番よかった!
#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); //光の最大値に達した場所までの時間をtmaxとする } } 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); } } }
#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); } }
重要視したところはタッチ面を広くしてきちんと反応させることである。
初めアームから作っていてアームが完成(初めの一つのモーターで二つアームを動かしていたやつ)したが
タッチセンサーをつける場所を作れずタッチ面が非常に小さくなりボールに当たってもまったく反応しなかった。
だからまずタッチセンサーを作りタッチ面を広くした。
そしてアームを一つでボールを掴む方法を考えた。
これが一番上手くいった。
ギリギリ頑張ったが、結局ライトレースをして明るさの最大値を探し出してはうまくいったが、
それをライトの位置まで持っていくときに上手く動かなかった。
マシンの反省点については、両側面についている車輪と車輪が離れすぎてて、
動作が大きくてスムーズに回らなかったりした。
また、初めはゴムで動くようにしたアームを取り付けていたが,
モーターの力をゴムを使って三段階を経て伝達したのでアームを閉めたときに固く閉まらず緩まり、
全然ボールがつかめなかった。
また、改良後のアームでも歯車部分が不安定で壊れやすかったので、
そこはもっと改良すべきだとも思った。
よかった点はライトレース用のセンサーがマシンの中心にあり進行に対してずれなくて、ボールを捕らえやすかった点です。
あと、ボール用のタッチセンサーは先生が授業中におっしゃってた、
大きめの板に出っ張りを付けてクリアしました。
今回マシンを作るのに非常に時間を使ってしまった。
はじめはゴムを使って一つのモータでふたつのアームを動かすことに
こだわってしまったからだと思います。
しかしタッチ面を大きくしてそこに一つレゴをつけることにより
反応性を上げたのは自分でも考えたと思います。
プログラムはそれほど時間はかけなかったが最後なかなかうまくいかなかった。
自分で試したときは上手くいったので先生にみてもらったが
その時はボールをつかみランタンの方向に向くまでは上手くいったが
ボールを蹴ったとき紙のしわによってうまく転がらなかった。
その後、押す時間を増やすとその状態でも上手くいった。
今回はプログラムを今までで一番考えた。
プログラムばっかりしていてマシンの方にあまり気が回らなかったのが少し残念だった。
今回はマシン作りを相方がだいぶ頑張ってくれたので助かりました。
次のロボコンでは絶対に動かして成功させたいと思います。
今回ほんまに時間がかかってしんどかった。
その上、自分の都合でなかなか集まる機会をとれず相方に迷惑をかけてしまった。
毎回の課題で最後の最後で思い通りにいかなかったので
最後のロボコンではきっちと思い通りに動かしたいと思います。
コメントお願いします。
今日: 1
昨日: 0
総合: &counter([total|today|yesterday]);
オンライン: 1