目次
画用紙の上に置かれているテニスボールをランタンの元へ送る(手段は問わない)
デリケートなやつなんです
・ ボールを打ち出す機能としてはブロックで作った壁(太い棒?)で押しだすことにした。しかし、タッチセンサーや、ランタンを探すための光センサーの邪魔をしないような構造になっている。
アームが上がる前。
アームが上がった後。
この写真は、わかりやすいようにセンサーなどは外してあります。
・ ボールがタッチセンサーにしっかりと当たるように、ボールをセンサーへ誘導するためのサイドアームも、ボールを打ち出したときに連動するようになっている。また、タッチセンサーはより敏感に反応してもらうために、むき出しで使った。
・ 3つのそれぞれのセンサーを一か所にかためることにより、コンパクトなデザインのロボットに仕上がった。これにより、小回りのきくロボットになった。ただ、センサー部分がとても脆いことが最後まで課題だった(よほどの衝撃がなければ大丈夫)。
緑のブロックがセンサー部分に当たることによって、反応するようになっている。
光を集めやすいようにセンサーの回りを囲った。
#define THRESHOLD 45 // 閾値 #define go OnFwd(OUT_A+OUT_C); //前進 #define right OnFwd(OUT_A);Off(OUT_C); //右折 #define left OnFwd(OUT_C);Off(OUT_A); //左折 #define STOP Off(OUT_A+OUT_C); //止まる #define throught OnRev(OUT_B);Wait(100);Off(OUT_B); //ボール投げる int T = 400 ; int lmax = 0 ; int tmax = 0 ;
task main() {repeat(3){ //3回繰り返す while(SENSOR_2 == 0 ) //タッチセンサーが押されている間 { SetSensor(SENSOR_1,SENSOR_LIGHT); // ライントレースのセンサー SetSensor(SENSOR_2,SENSOR_TOUCH); // タッチセンサー SetSensor(SENSOR_3,SENSOR_LIGHT); // ランタンを探すセンサー if(SENSOR_1<45){right;} //こいつらで else{left;} //ライントレース } STOP; //タッチセンサーが押されたらここに進む PlaySound(SOUND_CLICK) ; // ピッっていう ClearTimer(0); //ランタンを探すプログラム while(FastTimer(0)<T) { OnFwd(OUT_A);OnRev(OUT_C); if( SENSOR_3 > lmax ) { lmax=SENSOR_3;tmax = FastTimer(0) ; }} STOP; OnFwd(OUT_C);OnRev(OUT_A);Wait(T - tmax ); STOP; throught; OnFwd(OUT_A);OnRev(OUT_C); Wait(tmax); //ここまで探すプログラム } //はじめに戻る(3回) STOP; //終わり }
プログラムはこの上なくシンプルになったがシンプルすぎて複雑なコースに適応できてない気がする…が、一応一度だけ成功したからこのままで完成とする。せめてライントレース用にもう一つ光センサーがあればなぁ…
#define GO OnFwd(OUT_A+OUT_C); #define BACK OnRev(OUT_A+OUT_C); #define Tright OnFwd(OUT_A);OnRev(OUT_C); #define Tleft OnFwd(OUT_C);OnRev(OUT_A); #define STOP Off(OUT_A+OUT_C); #define XX 60 //目標となるランタンの光の閾値
task main () { SetSensor(SENSOR_2, SENSOR_TOUCH); //タッチセンサー SetSensor(SENSOR_1,SENSOR_LIGHT); //ライントレースする方 SetSensor(SENSOR_3,SENSOR_LIGHT); //目標を探す方 repeat(3){ //ボールの数だけ繰り返す while ( SENSOR_2 == 0 ) //ボールを発見するまで(しない間) { if (SENSOR_1 < 40) //ライントレースをしながら進む {OnFwd(OUT_A);Off(OUT_C);} else {Off(OUT_A);OnFwd(OUT_C);} } STOP; int T = 450 ; //1周する時間 int lmax = 0; //光の最大値の初期値 int tmax = 0; //ランタンの方向を向くまでのまでの時間
ClearTimer(0); while(FastTimer(0)<T) {Tright;if(SENSOR_3>lmax){lmax=SENSOR_3;tmax=FastTimer(0);}} //光の最大値を探す STOP;Tleft;Wait(T-tmax);STOP; //光の方を向く
int time= 0; ClearTimer(0); GO;until(SENSOR_3>XX);time=FastTimer(0);STOP;BACK;Wait(time);STOP; //ランタンまでボールを押して、戻ってくる Tright;Wait(T-tmax);STOP; //向きを元に戻す GO; //再出発 } STOP;}
○プログラミングなどを終えて(感想)
・初めは、ランタンを探す動作とボールを運ぶ動作をそれぞれ定義してプログラムを組もうとしたが個人的に、少し分かりにくかったので、ランタンを探してからボールを運ぶまでの一連の流れをリピートすることにした。
・ロボットがボールを押すとき、ボールが衝撃で綺麗に押せないのでそれを考慮して、ランタンの前ではちょっと早めに引き返すようにした。
・ランタンの前で止まるとき、どうするか迷ったが、閾値を与えることにより、ランタンに近寄ったら止まる方法にした。