*目次 [#i9cead5e]
#contents
*課題 [#afebc686]
各チームで作成したコースに沿って動くロボットを作成。
~
・速さと正確さを追求すること
~
・交差点で優先側を走っていない場合には、一時停止すること
~
・前方にあるもう一台のロボットに接触した場合には停止して相手のロボットが行き過ぎる、あるいは距離が離れるのを待つこと
~
・コースを3周したら自動的に止まること
*ロボット [#ob1cca6a]
#ref(2008a/A8/課題2右/PA0_0006.JPG,CENTER)
~
CENTER:本体部分は何も変更せず、バンパーの部分に力を入れました。~
光センサー、タッチセンサーをそれぞれ2つずつ付け、より感度を高めました。~
**正面 [#sdb76809]
#ref(2008a/A8/課題2右/PA0_04.JPG,CENTER)
タッチセンサーが2つ付いているバンパーを作り、その上に光センサーのパーツを載っけています。~
タッチセンサーのバンパーは説明書に載っているものをそのまま使っています。~
光センサーが2つのセンサーポートを使ってしまうのでタッチセンサーは1つのポートにコードを2つ重ねて置いてあります。~
**光センサー [#b48d2bf2]
#ref(2008a/A8/課題2右/PA0_00.JPG,CENTER)
1つの光センサーで線の上を追って走るより、2つのセンサーで線の両端に沿って進む方がより安定すると思ったので、上図のように2つの光センサーを持つパーツを作りました。~
実際、なかなか安定していました。~
完全に自分たちで作ったので最初はパーツが壊れやすかったんですが、改良を加えだいぶ頑丈になりました。~
**側面 [#hc31a7f4]
#ref(2008a/A8/課題2右/PA0_002.JPG,CENTER)
前にはタッチセンサーのバンパーがあるので、光センサーのパーツはバンパーと車体の間に付けました。~
初めは光センサーがもっと上の方に付いていましたが、それだと白い部分と線の部分がうまく感知されなかったので、~
センサーがなるべく低い位置にくるようにパーツを作り替えました。~
**上から [#oc85ebaf]
#ref(2008a/A8/課題2右/PA0_001.JPG,CENTER)
初めは2つのセンサーが独立していましたが、それだとグラグラ動いてしまったり、バンパーから取れてしまったりしたので、棒で固定しました。(上図青○)~
ブロックで固定するだけでなく、光センサーの付いた腕の部分をRCXの箱とバンパーの側面に当てて固定することでより強度を高めました。(上図赤○)~
*コース [#qd77b347]
#ref(2008a/A8/課題2右/PA0_0007.JPG,CENTER)
~
CENTER:交差点を4つ作りました。~
CENTER:プログラム上、止まるには光センサーが2つとも線上になければいけないので、交差点には線を引いてあります。~
一応時計回りも反時計回りもできます。
*プログラム [#d75cda7a]
#ref(2008a/A8/課題2右/プログラム概要.jpg)
''①2つの光センサーが線上にあるとき''~
''②    〃    が白紙上にあるとき''~
''③左側の光センサーのみが線上にあるとき''~
''④右側の        〃''~
''⑤タッチセンサーが押されたとき''~
の5つが主な内容です。~
また3周したら止まるように、''交差点で止まる(2つの光センサーが線上にある)回数を数え、12回止まったらロボットが停止する''ようにしてみました。~
 #define THRESHOLD 45  //45以下なら黒、45以上なら白と判断する
 #define Stop 4 * 3    //交差点が4つのコースを3周したら止まる
 
 int iStop = 0;    //iStopという整数型の変数を定義する
 
 task main ()
  {
    SetSensor(SENSOR_1, SENSOR_LIGHT); //センサー1は光センサー
    SetSensor(SENSOR_2, SENSOR_TOUCH); //センサー2はタッチセンサー
    SetSensor(SENSOR_3, SENSOR_LIGHT); //センサー3は光センサー
 
    while (iStop <= Stop) //交差点で止まった回数が12回以下なら続ける
    {
       if(SENSOR_1 < THRESHOLD && SENSOR_3 < THRESHOLD) //もし両側の光センサーが共に線上ならば、後退し、少しの間停止した後、前進する
        {iStop++; //交差点で止まった回数を1回分増やす
         OnRev(OUT_A+OUT_C);
         Wait(50);
         Off(OUT_A+OUT_C);
         Wait(350);
         OnFwd(OUT_A+OUT_C);
         Wait(180);}
 
       if(SENSOR_1 > THRESHOLD && SENSOR_3 > THRESHOLD) //もし両側の光センサーが共に白紙上ならば、前進する
        {OnFwd(OUT_A+OUT_C);}              
 
       if(SENSOR_1 < THRESHOLD) //もし左側の光センサーが線上ならば、左タイヤを停止させ、右タイヤを正回転させる
        {Off(OUT_A);
         OnFwd(OUT_C);}
  
       if(SENSOR_3 < THRESHOLD) //もし右側の光センサーが線上ならば、右タイヤを停止させ、左タイヤを正回転させる
        {Off(OUT_C);
         OnFwd(OUT_A);}
  
       if(SENSOR_2 == 1) //もしタッチセンサーが押されたら、少しの間停止した後、前進する
        {Off(OUT_A+OUT_C);
         Wait(300);
         OnFwd(OUT_A+OUT_C);}
  }
       OnRev(OUT_A+OUT_C); //交差点で12回止まった後、進んだ分だけ後退して、停止する
       Wait(175);
       Off(OUT_A+OUT_C);
 }
(作成者:三澤)
*難しかったところ [#ee8ea815]
''・しっかりと白と黒を判別する光センサーを作ること''~
そもそも2つの光センサーの反応の仕方が若干違っていて、2つとも黒の上にあるのに、 片方は白の上にあると反応したりすることがあって大変でした。また、なるべく地面に近いところに光センサーがないと、うまく反応しないことも分かりました。~
~
''・3周したら止まるようにプログラムすること''~
最初はタイマーを使おうかとも思ったが、ちょうど3周の正確な時間が分からないので
変数を使いました。13回目の交差点を踏んだら止まるんですが、プログラム上少し進んでしまうので、後退してスタート位置に戻るようにしました。~
*コメントをどうぞ [#cdfba498]

#comment
書くべきことをちゃんと書いており、良いレポートだと思います。
課題ができた後にも、汎用性を追求したり、オリジナリティを出していけば良いです。
例えば、より速くするためにはどうすれば良いか、小回りをきかせるにはどうすればよいか、時間を指標に3周するための工夫等、終わってしまった課題なので、せめていろいろ考察してみるとよいと思います。 F.I.

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS