- 追加された行はこの色です。
- 削除された行はこの色です。
*課題3:ランタンに向かってテニスボールを転がす(または運ぶ)ロボット [#kb53e5b8]
#contents
課題2で作成したコース上にランダムに置いたテニスボール(3個)をロータリーの中央部分に置いたランタンに向かって
1.転がす
2.最短距離で運ぶ
ロボットを作成せよ。ただし、1の場合はテニスボールの置いてある場所から直接転がし、2の場合はその場所から最短距離で運ぶこと。ボールを探す際にはラインに沿っても沿らなくてもよい。
*メンバー [#efe17d04]
-ばば(運ぶ)
-イシイ(転がす)
*製作過程 [#z2f47f34]
今回の課題で用いたセンサは光センサ2つ、タッチセンサ1つです。各センサの役割は次の通り↓~
センサ1:光センサ・・・ライントレース用の光センサ~
センサ2:光センサ・・・ランタンの光を検出するためのセンサ~
センサ3:タッチセンサ・・・ボールやランタンに触れた際に機能するセンサ~
となっています。~
まずはセンサ1の光センサを
#ref(光センサ.png)
のように、少し顔を出すよな感じでセット!~
そして車体前方に光センサとタッチセンサをつけた
#ref(センサ.png)
この課題の運ぶ側の人はテニスボールをランタンまで持っていくまでにボールをキープしていなければならない。そのために車体後方にアームを取り付けてみた。このアームは自由に上げ下げ可能だ。~
まずは、上げた状態
#ref(閉じた状態.png)
↓そしてこれを下げると・・・!?~
#ref(開いた状態.png)
↑こんな感じに
そしてできあがった今回のロボットがこちら~
#ref(全体図.png)
*プログラム [#l646cafc]
**ばば(運ぶ) [#oc3fcd3b]
#define THRESHOLD 40 //閾値
#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); //終わったら音を鳴らす
}
**イシイ(蹴る) [#m9a04a0f]
*評価 [#w0a7bb16]
**感想 [#m847af24]
今回の課題はロボット本体の作成が難しかった。組み立てにおいて工夫したところはランタンを見つける光センサの両側に壁を作ってより正確な値を検知することができた、前にタッチセンサと光センサを取り付け、後ろにアームをつけて前後で役割を分担したなどです。~
また、一番苦労したのは運ぶ側において「どこでテニスボールを止めるか」でした。この問題が浮上してアームを後ろにして前にタッチセンサをつけ替えました。さらに、ランタンを見つける光センサの高さにも苦労しました。普通につけると高くて正確な値が検知できませんした。なので下の方に設置しました。最終的にできた本体はバランスもよく、良い仕上がりだと思いました。
**反省 [#m3569c8e]
反省点は、ロボットの作成に時間をとられ過ぎてプログラミングに時間を割けなかったことです。今回は問題が出る度にロボットを作り替えていたのでプログラムに時間をかけられませんでした。~
次回はいよいよロボコンです。2つのロボットを駆使することが予想されるのでロボットの組み立てはより複雑化されるはずです。なので今回の反省を生かし、あらかじめ起きそうな問題を把握してロボットの作成に励み、適切なプログラムを書いてロボコンに臨みたいと思います。
*コメント [#se5247bb]
- あとはイシイのプログラムとその説明で終了!! -- [[ばば]] &new{2011-07-12 (火) 14:40:36};
#comment
----
Today:&counter(today);
Yesterday:&counter(yesterday);
All:&counter(all);