- 追加された行はこの色です。
- 削除された行はこの色です。
[[2007a/MemberOnly/進行状況A]]
#contents
*今回の課題 [#ba820c16]
黒い線に沿って動くロボットを作成せよ。ただし、
1、速さと正確さを追求すること
2、交差点で優先側を走っていない場合には、一時停止すること
3、前方にあるもう一台のロボットに接触した場合には停止して,
相手のロボットが行き過ぎる、あるいは距離が離れるのを待つこと
*作戦 [#o213de30]
**課題クリアのためには? [#k263fe9d]
今回の課題のメインはライントレースです。しかし、ライントレースより厄介なのは交差点です。交差点を識別し、優先道路なら直進、違うなら一時停止しなければならないからです。この課題は、光センサーの使い方がポイントだと感じました。よって、センサーの付け方からロボットのベースを決めることにしました。
**交差点をどのようにクリアするか? [#nb90b6e9]
***センサーのつけ方 [#p24fcbb0]
ライントレースするためのセンサーの取り付け方は、(僕の思いついた限り)3つあります。それぞれの長所、短所を述べたうえで、僕たちの班が選んだ取り付け方と、それを選んだ理由を説明したいと思います。
ライントレースするための光センサーの取り付け方は、(僕の思いついた限り)3つあります。それぞれの長所、短所を述べたうえで、僕たちの班が選んだ取り付け方と、それを選んだ理由を説明したいと思います。
-------------------------------------------------------
&size(25){※取り付け方1};
光センサー1つを使います。もし、センサーがライン上にあれば片方のモーターを動かし、センサーがラインを出たらそのモーターをとめ、逆のモーターを動かします。
光センサー1つを使います。もし、センサーがライン上にあれば、ロボットがラインから出るようにタイヤを動かし、センサーがラインを出たら、逆のタイヤを動かし、ラインに戻るようにします。
&size(20){☆メリット};
ライントレースにおいてセンサーを1つしか使わないため、プログラムが簡単になります。
急なカーブもクリアすることができます。
&size(20){★デメリット};
交差点が識別できません。
---------------------------------------------------------
&size(25){※取り付け方2};
光センサー2つを使います。光センサーの間隔を2,5cm(ラインの幅)以上広げ、もし、どちらかのセンサーがライン上にきたら、モーターを調整して、もとの状態にもどすプログラムを作る。
&size(20){☆メリット};
たいていのコースをライントレースすることが可能です。コースを脱線する恐れが、ほとんどありません。
&size(20){★デメリット};
交差点の識別が難しい。
--------------------------------------------------------
&size(25){※取り付け方3};
光センサー2つを使います。光センサーの間隔を2,5cm(ラインの幅)以内にして、もし、どちらかのセンサーがライン外にきたら、モーターを調整して、もとの状態にもどすプログラムを作る。
&size(20){☆メリット};
交差点を認識できます。
&size(20){★デメリット};
急なカーブに対応できず、ラインを見失なってしまいます。
--------------------------------------------------------
***交差点の考察・まとめ [#q3ef10b5]
僕たちの班は、光センサーを「取り付け方3」のようにしました。理由はいたって単純。交差点をちゃんと攻略できるのは、「取り付け方3」しかないからです。ライントレースにおける「カーブ」に至っては、「取り付け方1」及び「取り付け方2」に負けています。しかし、今回の課題では、1番上の2に書いたように、交差点で優先道路でない場合、一時停止しなければなりません。「取り付け方2」では、やり方によってはできますが、1番きれいに交差点を攻略できるのは「取り付け方3」です。総合してみると、1番だと思った「取り付け方3」を採用しました。
**急なカーブをどのようにクリアするか? [#zefa6442]
交差点を攻略できても、急なカーブをライントレースできないのでは、意味がありません。そこで、プログラムを工夫して、急なカーブにも対応できるようにしました。下に、元のプログラムと改善後のプログラムを書きます。
元のプログラム(左に曲がりたいとき)
OnFwd(OUT_C); //右のタイヤを回転させます
Off(OUT_A); //左のタイヤを止めます
改善後のプログラム(左に曲がりたいとき)
SetPower(OUT_A,3); //左のタイヤの出力を弱く設定
SetPower(OUT_C,7); //右のタイヤの出力を強く設定
OnFwd(OUT_C); //右のタイヤを回転させます
OnRev(OUT_A); //左のタイヤを反対の方向に回転させます
このように、曲がりたい方向にあるタイヤを進行方向に対して逆の方向に回転させるだけで、かなり曲がりやすくなります。右に曲がりたいときも、同様の方法ですることが可能です。
*完成したロボットの説明 [#p93eba86]
*完成までの道のり [#pb39e867]
**過程1(土台作り) [#r3f2c075]
左右のタイヤにそれぞれモーターを1つずつ使い、土台を支えるために3つのタイヤを使いました。光センサーはロボットの前方に、下に向けて配置しました。また、タッチセンサーも前につける必要があるので、土台は後ろに重心がくるようにしました。
**過程2(タッチセンサー) [#ba910d20]
シンプルでかわいらしいタッチセンサーができました。
**過程3(試験走行) [#z3162a60]
試験走行用のプログラムを作って走らせました。しかし、以下のような問題が発生しました。
1つ目、光センサーが床に近すぎたため、ラインと、そうでない部分を判別できなかった。
2つ目、ロボットの動きが速すぎたためすぐにラインをはずれてしまった。
3つ目、プログラムのミスで、タッチセンサーが当たっても止まらないときがあった。
このような問題が発生したため、ロボットとプログラムを組みなおす必要がありました。
**過程4(組みなおし) [#jb1addc4]
ギアの組み合わせをかえることにより、ロボットの速さを適度にすることに成功しました。また、センサーの地面からの高さと、後輪のタイヤの大きさをかえることにより、ちゃんとラインを区別してくれるようになりました。
*プログラム [#te3dbada]
define LI 43 //光の強さの境界線を定義
int s_p; //変数を用意
sub search_pro(){ //ラインを見失ったとき用のサブルーチン
while ((SENSOR_1 > LI) && (SENSOR_3 > LI)){ //ラインが見つかるまで繰り返す
SetPower(OUT_A+OUT_C,7);
OnRev(OUT_A);OnFwd(OUT_C); 左を探す
Wait(30);
OnRev(OUT_C);OnFwd(OUT_A); 右を探す
Wait(60);
OnRev(OUT_A);OnFwd(OUT_C); ロボットの向きを元にもどす
Wait(30);
OnFwd(OUT_A+OUT_C); 直進する
repeat(7){ //7回繰り返す
Wait(10);
if (SENSOR_2 == 1) //タッチセンサーにあたったら10秒とまる
{
Off(OUT_A+OUT_C);
Wait(100);
}
}
}
}
sub s_touch() //タッチセンサーにあたったとき用の命令文(サブルーチン)
{
SetPower(OUT_A+OUT_C,7);
Off(OUT_A+OUT_C); モーターの出力をとめる
Wait(100); 10秒待つ
}
task main () {
SetSensor(SENSOR_1, SENSOR_LIGHT); //センサー1を光センサーと定義
SetSensor(SENSOR_2, SENSOR_TOUCH); //センサー2をタッチセンサーと定義
SetSensor(SENSOR_3, SENSOR_LIGHT); //センサ−3を光センサーと定義
s_p = 2 ; 変数に2を代入
while (true){
while (SENSOR_2 == 0){ //タッチセンサーが反応するまで繰り返す
while ((SENSOR_1 < LI) && (SENSOR_3 < LI)) //センサー1、3共にライン上のとき
{
SetPower(OUT_A+OUT_C,7);
OnFwd(OUT_A+OUT_C); 直進する
s_p = 1;
if (SENSOR_2 == 1) タッチセンサーが反応したら、ロボットを止める
{
s_touch();
}
}
while ((SENSOR_1 < LI) && (SENSOR_3 > LI)) //センサー1がライン上、センサー3がライン外のとき
{
OnFwd(OUT_C); 左へ曲がる
Off(OUT_A);
SetPower(OUT_A,3); //左のタイヤの出力を弱く設定
SetPower(OUT_C,7); //右のタイヤの出力を強く設定
OnFwd(OUT_C); //右のタイヤを回転させます
OnRev(OUT_A); //左のタイヤを反対の方向に回転させます
s_p = 1;
if (SENSOR_2 == 1) タッチセンサーが反応したら、ロボットを止める
{
s_touch();
}
}
while ((SENSOR_1 > LI) && (SENSOR_3 < LI)) //センサー1がライン外、センサー3がライン上のとき
{
OnFwd(OUT_A); 右へ曲がる
Off(OUT_C);
SetPower(OUT_C,3); //右のタイヤの出力を弱く設定
SetPower(OUT_A,7); //左のタイヤの出力を強く設定
OnFwd(OUT_A); //左のタイヤを回転させます
OnRev(OUT_C); //右のタイヤを反対の方向に回転させます
s_p = 1;
if (SENSOR_2 == 1) タッチセンサーが反応したら、ロボットを止める
{
s_touch();
}
}
if ((SENSOR_1 > LI) && (SENSOR_3 > LI)) センサー1、3共にライン外のとき
{
if (s_p == 1){ //このパターンが交差点です
SetPower(OUT_A+OUT_C,7);
Off(OUT_A+OUT_C); いったん止まる
OnRev(OUT_A+OUT_C);
Wait(10); すこし下がる
Off(OUT_A+OUT_C); 一時停止する
Wait(10);
OnFwd(OUT_A+OUT_C); 交差点を横切る
repeat(9){
Wait(10);
s_p = 2;
if (SENSOR_2 == 1) タッチセンサーが反応したら、ロボットを止める
{
s_touch();
} }
}else{ //コースを見失ったとき
SetPower(OUT_A+OUT_C,7);
search_pro(); サブルーチンのサーチプログラムを作動させる
}
}
}
}
}
今回の課題をこなすにあたって、プログラムは非常に重要な役割を担います。前回の書道ロボットの課題は、与えた命令通りにロボットが動くので、プログラミングは比較的やさしいものでした。しかし、今回の課題では、ロボットがセンサーによる情報を分析して動くので、予想外の動きをすることがあります。あらゆるパターンを考え、プログラミングをすることは結構難しいことでした。
*工夫したところ [#x3d600ce]
*苦労したところ [#w5d32ca7]
*感想(制作を終えて) [#k715fb0d]
*まとめ [#t3710646]
**工夫したところ [#x3d600ce]
プログラムが長くなったので、なるべく{ と } が上下に同じ位置にくるようにして、少しでもプログラムがみえやすくなるように努力した
**苦労したところ [#w5d32ca7]
if文、while文をたくさん使ったため、{}が多くなりプログラムを組むのが難しかった。
**感想(制作を終えて) [#k715fb0d]
*コメントをどうぞ [#yc269d1d]
#comment