*課題2 [#h7345e7c]
**課題内容 [#lab77d98]
次のいずれかの経路を黒い線にそって動くロボットを作成する (他のメンバーとは別の経路になるようにする)。
A地点からB地点へ (P三叉路およびQ交差点はともに直進)
B地点からA地点へ (Q交差点では直進、P三叉路では直進)
C地点からA地点へ (Q交差点では直進、P三叉路では右折)
そして、途中(P地点とQ地点)の間においたボール(ピンポン玉またはNXT付属のボール)を 目的地まで運んで、ゴールに入れる。その途中、三叉路および交差点では2秒間停止すること。
可能であれば、A,B,Cのそれぞれにエリアに入る三叉路付近からボールをシュートする。
今回自分はA地点からB地点への移動を担当した。
**ロボット本体の説明 [#c194596f]
今回のロボット作成においての自分達のコンセプトは"よりコンパクトに"です。
最もコンパクトにするのに苦労した点、かつ成功した点はボールをキャッチ、シュートするための機構です。
ボールをシュートするのはロボット本体の前進による放出を利用し、キャッチするのはアームの上げ下げを利用しました。
これによりキャッチ、シュートは問題ないと思われましたが、キャッチはアームの下がり具合によっては飛び出してしまったり、シュートはただの放出だけではボールがあらぬ方向に飛んでいきとても不安定でした。
そこで、ボールをキャッチする機構のすぐ後ろに光センサーを取り付けることで、ボールをまっすぐと運んでくれるようになり安定しました。
#ref(image5.JPG)
#ref(image6.JPG)
#ref(image7.JPG)
#ref(image4.JPG)
また、光センサーをロボット全面に着けることにより、光センサーの感知具合もよくなり一石二鳥でした。
次にキャッチにおいてのアームの下がり具合の問題ですが、これはギア比によって問題を解決しました。写真の様にギアを四枚使うことにより、アームの下がるスピードを調節することに成功しました。
#ref(image3.JPG)
これらが主に今回のロボット作成において大変だった点、成功した点です。
**プログラミングの説明 [#m841356e]
#define THRESHOLD 43
#define go OnFwd(OUT_AC); //進む
#define turnleft OnFwd(OUT_C);OnRev(OUT_A); //左旋回
#define turnright OnFwd(OUT_A);OnRev(OUT_C); //右旋回
#define STEP 1 // 一回の判断で動作させる時間
#define shoot OnRev(OUT_B);Wait(50);Off(OUT_B); // ボールを打つ動作
task main()
{
SetSensor(SENSOR_2,SENSOR_LIGHT); // 光センサーの場所を設定する。
int black=0; // 続けて黒になった回数 (カウンタ)
SetSensor(SENSOR_2,SENSOR_LIGHT);
ClearTimer(0);
ClearTimer(0);
while (FastTimer(0)<1800){ // 「設定した時間が180秒以内であれば以下の事をしろ」というプログラム
if (SENSOR_2 < THRESHOLD-3) { // 「しきい値よりも値が3低い(すこし黒い)ならば」という判断のためのif文
turnleft // if=true ならば左旋回をしろというプログラム
} else {
if (SENSOR_2 < THRESHOLD+3) { // 「しきい値よりも3高い(すこし白い)ならば」という判断のためのif文
go; // if=true ならば進めというプログラム
} else {
turnright; // if=true ならば右旋回をしろというプログラム
}
}
}
while (black < 10) // 続けて黒を認識した回数が10回以下であった場合のプログラム
{
if (SENSOR_2 < THRESHOLD-5) //「しきい値よりも値が5低い(より黒い)ならば」という判断のためのif文
{
turnright; // if=true ならば右旋回をしろというプログラム
black++; // カウンタを増やす
}
else if (SENSOR_2 < THRESHOLD+5) { //「しきい値よりも5高い(より白い)ならば」という判断のためのif文
go; // if=true ならば進めというプログラム
black=0; }
else {
turnleft;
black=0; // カウンタをリセット
}
}
Off(OUT_AC);Wait(200);
OnFwd(OUT_AC);Wait(20);
ClearTimer(0);
while (FastTimer(0)<500) // 「設定した時間が50秒以内であれば以下の事をしろ」というプログラム
while (FastTimer(0)<500) // 「設定した時間が50秒以内であれば以下の事をしろ」というプログラム
{
if (SENSOR_2 < THRESHOLD-5) // 「しきい値よりも値が5低い(より黒い)ならば」というプログラム
{
turnright;
}
else if (SENSOR_2 < THRESHOLD+5) { // 「しきい値よりも値が5高い(より白い)ならば」というプログラム
go;
black=0; }
else {
turnleft;
}
}
Off(OUT_AC);Wait(100);
shoot;
}
**作成時間 [#w7f3c4f7]
ロボット作成 20時間
プログラミング作成 5時間
Webページの作成 1時間
**まとめ感想 [#q1ee044e]
今回の課題はなかなか問題を解決することができず、解決しても解決しても新たな問題が出てきて本当にしんどい課題でしたが、達成した時の達成感それだけにとても大きなものでした。
本当に仲間の存在と精密なプログラミングの必要性を感じさせられた課題でした。