課題2で作成したコース上にランダムに置いたテニスボール(3個)をロータリーの中央部分に置いたランタンに向かって
1.転がす 2.最短距離で運ぶ
ロボットを作成せよ。ただし、1の場合はテニスボールの置いてある場所から直接転がし、2の場合はその場所から最短距離で運ぶこと。ボールを探す際にはラインに沿っても沿らなくてもよい。
今回の課題で用いたセンサは光センサ2つ、タッチセンサ1つです。各センサの役割は次の通り↓
センサ1:光センサ・・・ライントレース用の光センサ
センサ2:光センサ・・・ランタンの光を検出するためのセンサ
センサ3:タッチセンサ・・・ボールやランタンに触れた際に機能するセンサ
となっています。
まずはセンサ1の光センサを
のように、少し顔を出すよな感じでセット!
そして車体前方に光センサとタッチセンサをつけた
この課題の運ぶ側の人はテニスボールをランタンまで持っていくまでにボールをキープしていなければならない。そのために車体後方にアームを取り付けてみた。このアームは自由に上げ下げ可能だ。
まずは、上げた状態
↓そしてこれを下げると・・・!?
↑こんな感じに
そしてできあがった今回のロボットがこちら
また、課題2と同様にこちらのコースを用います。
#define THRESHOLD 30 //閾値 #define go_straight OnFwd(OUT_A+OUT_C); //前進 #define back OnRev(OUT_A+OUT_C);Wait(80);Off(OUT_A+OUT_C); //0.8秒間後退 int T=460; //関数をそれぞれ定義 int lmax=0; int tmax=0; sub search_max() { while(FastTimer(0)<T) //Tより小さいとき右にTだけ旋回 { OnFwd(OUT_A); OnRev(OUT_C); Wait(T); if(SENSOR_2>lmax) //lmaxより大きい光を検知したらその値を新たなlmaxに { lmax=SENSOR_1; //lmaxまでの時間をtmaxとする tmax=FastTimer(0); } } OnRev(OUT_A); //先ほどとは逆に左にT-tmaxだけ旋回 OnFwd(OUT_C); Wait(T-tmax); Off(OUT_A+OUT_C); } sub ball_catch() { OnRev(OUT_A+OUT_C); //0.3秒間後退 Wait(30); OnFwd(OUT_A); //180°回転 OnRev(OUT_C); Wait(230); OnRev(OUT_A+OUT_C); //0.3秒間後退 Wait(30); OnRev(OUT_B); //アームを下げる Wait(15); } sub ball_release() { OnRev(OUT_A+OUT_C); //0.3秒間後退 Wait(30); OnFwd(OUT_A); //180°回転 OnRev(OUT_C); Wait(230); OnRev(OUT_A+OUT_C); //0.3秒間後退 Wait(30); OnFwd(OUT_B); //アームを上げる Wait(200); Off(OUT_A+OUT_C); PlaySound(SOUND_CLICK); } //テニスボールを運んだら音を鳴らす sub search_line() { while (true){ if (SENSOR_1 < THRESHOLD) //センサ1が黒を検知したら左に修正 { OnFwd(OUT_C); Off(OUT_A); } else //センサ1が白を検知したら右に修正 { OnFwd(OUT_A); Off(OUT_C); } } } task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ1は光センサ SetSensor(SENSOR_2,SENSOR_LIGHT); //センサ2は光センサ SetSensor(SENSOR_3,SENSOR_TOUCH); //センサ3はタッチセンサ repeat(3){ //カッコ内を3回繰り返し go_straight; //センサ1が黒になるまで前進 until(SENSOR_1<THRESHOLD); search_line(); //センサ3が押される(ボールを見つける)までライントレース until(SENSOR_3 == 1); ball_catch(); //ボールをキャッチ search_max(); //ランタンの方向を探す go_straight; //センサ3が押される(ランタンに触れる)まで前進 until(SENSOR_3 == 1); ball_release(); //ボールをリリース back; //後退 } Off(OUT_A+OUT_C); PlaySound(SOUND_DOUBLE_BEEP); //終わったら音を鳴らす }
#define go(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //直進 #define back(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //後退 #define turn_r(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C); //右旋回 #define turn_l(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_A+OUT_C); //左旋回 #define arm_down OnRev(OUT_B);Wait(20);Off(OUT_B); //アームを下げる #define arm_up OnFwd(OUT_B);Wait(20);Off(OUT_B); //アームを上げる #define THRESHOLD 30 //閾値 int T=460; int lmax=0; int tmax=0; task main() { repeat(3) //以下の動作を3回繰り返す { SetSensor(SENSOR_1,SENSOR_LIGHT); //ライントレースのセンサー SetSensor(SENSOR_2,SENSOR_LIGHT); //ランタンを探すセンサー SetSensor(SENSOR_3,SENSOR_TOUCH); //タッチセンサー until(SENSOR_3==1); { OnFwd(OUT_A+OUT_C); //前進 if(SENSOR_1>THRESHOLD) { turn_r(10); //センサー1がラインからはずれたら0.1秒右旋回 if(SENSOR_1>THRESHOLD) { turn_l(20); //それでもラインからはずれていたら0.2秒左旋回 } } } back(30); turn_r(230); back(100); arm_down; OnFwd(OUT_A);OnRev(OUT_C);Wait(460); //タッチセンサーが反応したら180度ターンし、アームを下げてボールを確保 while(FastTimer(0)<T) { turn_r(T); if(SENSOR_2>lmax) { lmax=SENSOR_2; //センサー2がlmaxよりも大きい値になったらlmaxにセンサー2の値を代入 tmax=FastTimer(0); } } turn_l(T-tmax); //最も明るい方向(ランタンのある方向)まで逆回りで戻る Wait(100); arm_up; go(50); back(100); Wait(100); go(50); //アームを上げてボールをケツで蹴り出す until(SENSOR_1<THRESHOLD) { OnFwd(OUT_C);OnRev(OUT_A); } Off(OUT_A+OUT_C); } }
今回の課題はロボット本体の作成が難しかった。組み立てにおいて工夫したところはランタンを見つける光センサの両側に壁を作ってより正確な値を検知することができた、前にタッチセンサと光センサを取り付け、後ろにアームをつけて前後で役割を分担したなどです。
また、一番苦労したのは運ぶ側において「どこでテニスボールを止めるか」でした。この問題が浮上してアームを後ろにして前にタッチセンサをつけ替えました。さらに、ランタンを見つける光センサの高さにも苦労しました。普通につけると高くて正確な値が検知できませんした。なので下の方に設置しました。最終的にできた本体はバランスもよく、良い仕上がりだと思いました。
反省点は、ロボットの作成に時間をとられ過ぎてプログラミングに時間を割けなかったことです。今回は問題が出る度にロボットを作り替えていたのでプログラムに時間をかけられませんでした。また、走らせるときの場所や明るさなどの条件によって成功したりしなかったりという問題がありました。どんな条件でも成功できるようなプログラムを組むようにしていきたいです。
次回はいよいよロボコンです。2つのロボットを駆使することが予想されるのでロボットの組み立てはより複雑化されるはずです。なので今回の反省を生かし、あらかじめ起きそうな問題を把握してロボットの作成に励み、適切なプログラムを書いてロボコンに臨みたいと思います。
Today:1
Yesterday:0
All:&counter([total|today|yesterday]);