*目次 [#edaaf49e]

#contents

*課題2 黒い線に沿って動くロボット [#iff70e19]

黒い線に沿って動くロボットを作成する。ただし以下の点に注意すること。

-速さと正確さを追求すること
-交差点で優先側を走っていない場合には、一時停止すること
-前方にあるもう一台のロボットに接触した場合には停止して相手のロボットが行き過ぎる、あるいは距離が離れるのを待つこと
-コースを3周したら自動的に止まること

**ロボット設計・コース作成 [#h46cb510]

始めは光センサーを一つだけ取り付けたロボットを作成した。早速走るかどうか実験してみたところ、普通に走ることは走るのだが、光センサー一つでは
-交差点にはいる
-衝突する

ということをロボットが認識できないことがわかった。~
そこで、タッチセンサーと光センサーを一つ増やし、タッチセンサーで衝突を、光センサー2個で交差点を認識させることにした。以下が完成したロボットの写真である。
そこで、タッチセンサーと光センサーを一つ増やし、タッチセンサーで衝突を、光センサー2個で交差点を認識させることにした。その後、2台同時に走らせるとタッチセンサーの反応範囲が狭いためにぶつかってもプログラム通りの動作をしなかった。タッチセンサーを二つ使うことで改良に成功した。以下がタッチセンサー改良前と改良後のロボットの写真である。

(ロボットの全体を撮った写真)~
(ななめ前からのセンサー部をアップにした写真)~
#ref(2008a/A1/課題2右/全体.jpg,150%,全体);
改良前のロボットの全体を撮った写真~
#ref(2008a/A1/課題2右/11.jpg,50%,全体);
改良後の全体写真~
#ref(2008a/A1/課題2右/前.jpg,150%,センサー1);
改良前のななめ前からセンサー部をアップにした写真~
#ref(2008a/A1/課題2右/100.jpg,50%,センサー2);
改良後のななめ前からセンサー部をアップにした写真~
#ref(2008a/A1/課題2右/200a.jpg,50%,センサー3);
改良後の下から見た写真~
#ref(2008a/A1/課題2右/前2.jpg,150%,前2);
改良前の正面を撮った写真~
#ref(2008a/A1/課題2右/12a.jpg,50%,正面);
改良後の正面写真~

ロボットが完成したので次にどんなコースにしようか考えたところ、シンプルでわかりやすいコースにしようということに決定した。

(コースの写真)
#ref(2008a/A1/課題2右/コース.jpg,150%,コース);
コースの写真~

このコースを走らせることを目標にプログラムを作成した。

**プログラム作成 [#je38350b]

光センサー2つで黒い線をはさむ形でコースを走行する。~
光センサー1つでは地面が黒か白かを判別するだけなので、黒の場合と白の場合の2通りの動きしかできないが、2つにすることで左、右のセンサーが(白、白)、(黒、白)、(白、黒)、(黒、黒)となる場合があるので4パターンの動きをすることができる。これでラインに沿う動きのほかに交差点を区別して一時停止することができる。~
また、3週して自動的に止まらなければならないので、「タイマー」機能を使った。ストップウォッチを使い、3週する時間を測りその時間をプログラムに取り入れた。
また、3周して自動的に止まらなければならないので、「タイマー」機能を使った。ストップウォッチを使い、3周する時間を測りその時間をプログラムに取り入れた。
 define LINE 42                                         
 define TIMER 1000                  //3週走る秒数
 define TIMER 1000                  //3周走る秒数
 
 
 task main(){
  SetSensor(SENSOR_1, SENSOR_LIGHT);
  SetSensor(SENSOR_2, SENSOR_TOUCH);
  SetSensor(SENSOR_3, SENSOR_LIGHT);
   ClearTimer(0);
 
   while( Timer(0) <= TIMER ){                   //3週する時間まで走り続ける
   while( Timer(0) <= TIMER ){                   //3周する時間まで走り続ける
    
      
        if((SENSOR_1 > LINE) && (SENSOR_3 > LINE)){
        OnFwd(OUT_A+OUT_C);                                   //白・白だったら前進
      
        }
        else if((SENSOR_1 <= LINE) && (SENSOR_3  > LINE)){
        Off(OUT_A);                      
        OnFwd(OUT_C);                    //黒・白だったら左折してコースから右にずれた分を修正
      
        }
        else if((SENSOR_1 > LINE) &&(SENSOR_3  <= LINE)){
        
        Off(OUT_C);
        OnFwd(OUT_A);                    //白・黒だったら右折してコースから左にずれた分を修正
        
        
        }
        else if((SENSOR_1 <= LINE) &&(SENSOR_3  <= LINE)){
        
        Off(OUT_A+OUT_C);
        Wait(50);                      //黒・黒だったら一時停止
        }
               if(SENSOR_2 == 1){
      
               OnRev(OUT_A+OUT_C);
               Wait(30);
               Off(OUT_A+OUT_C);
               Wait(100);                  //衝突したら後進して一時停止
               }
   }
  Off(OUT_A+OUT_C);                     //3週する時間がきたら停止
  Off(OUT_A+OUT_C);                     //3周する時間がきたら停止
 }

(作成者 スギウラ)

**問題点 [#w5201b4b]
***交差点で2回一時停止をしてしまう[#sf6dd70c]
道路を停止線と勘違いして、停止線と道路との2つで一時停止をしてしまう。このままでも課題はこなせそうだが、衝突する確率が高くなってしまうので直すことにした。~
この問題は一時停止後センサーとは関係なく道路をこえるまで前進するようにすることで解決した。

 define LINE 42                                         
 define TIMER 1000                  //3週走る秒数
 define TIMER 1000                  //3周走る秒数
 
 
 task main(){
  SetSensor(SENSOR_1, SENSOR_LIGHT);
  SetSensor(SENSOR_2, SENSOR_TOUCH);
  SetSensor(SENSOR_3, SENSOR_LIGHT);
   ClearTimer(0);
 
   while( Timer(0) <= TIMER ){                   //3週する時間まで走り続ける
   while( Timer(0) <= TIMER ){                   //3周する時間まで走り続ける
    
      
        if((SENSOR_1 > LINE) && (SENSOR_3 > LINE)){
        OnFwd(OUT_A+OUT_C);                                   //白・白だったら前進
      
        }
        else if((SENSOR_1 <= LINE) && (SENSOR_3  > LINE)){
        Off(OUT_A);                      
        OnFwd(OUT_C);                    //黒・白だったら左折してコースから右にずれた分を修正
      
        }
        else if((SENSOR_1 > LINE) &&(SENSOR_3  <= LINE)){
        
        Off(OUT_C);
        OnFwd(OUT_A);                    //白・黒だったら右折してコースから左にずれた分を修正
        
        
        }
        else if((SENSOR_1 <= LINE) &&(SENSOR_3  <= LINE)){
        
        Off(OUT_A+OUT_C);
        Wait(50);
''OnFwd(OUT_A+OUT_C);''~
''Wait(100);''                 ''//黒・黒だったら一時停止後、前進''    
        
        }
        
               if(SENSOR_2 == 1){
      
               OnRev(OUT_A+OUT_C);
               Wait(30);
               Off(OUT_A+OUT_C);
               Wait(100);                  //衝突したら後進して一時停止
               }
   }
  Off(OUT_A+OUT_C);                     //3週する時間がきたら停止
  Off(OUT_A+OUT_C);                     //3周する時間がきたら停止
 }
***ぴったり3週しない [#pd1a27ba]
3週する時間を測ったが、衝突すると衝突した後の後進と一時停止の動きの分、3週する時間が足りなくなってしまう。そこで「変数」を使い後進と一時停止した分、走る時間を足すことにした。具体的なプログラムは以下である。

(作成者 ツチヤ)
***ぴったり3周しない [#pd1a27ba]
3周する時間を測ったが、衝突すると衝突した後の後進と一時停止の動きの分、3周する時間が足りなくなってしまう。そこで「変数」を使い後進と一時停止した分、走る時間を足すことにした。具体的なプログラムは以下である。


 define LINE 42                                         
 define TIMER 1000                  //3週走る秒数
 define TIMER 1000                  //3周走る秒数
 
 
 task main(){
  SetSensor(SENSOR_1, SENSOR_LIGHT);
  SetSensor(SENSOR_2, SENSOR_TOUCH);
  SetSensor(SENSOR_3, SENSOR_LIGHT);
   ClearTimer(0);

''int t;''~
''t = TIMER'';                        ''//tにTIMERの値を代入''~
while( Timer(0) <= ''t'' ){                   //3週する時間まで走り続ける
while( Timer(0) <= ''t'' ){                   //3周する時間まで走り続ける
    
      
        if((SENSOR_1 > LINE) && (SENSOR_3 > LINE)){
        OnFwd(OUT_A+OUT_C);                                   //白・白だったら前進
      
        }
        else if((SENSOR_1 <= LINE) && (SENSOR_3  > LINE)){
        Off(OUT_A);                      
        OnFwd(OUT_C);                    //黒・白だったら左折してコースから右にずれた分を修正
      
        }
        else if((SENSOR_1 > LINE) &&(SENSOR_3  <= LINE)){
        
        Off(OUT_C);
        OnFwd(OUT_A);                    //白・黒だったら右折してコースから左にずれた分を修正
        
        
        }
        else if((SENSOR_1 <= LINE) &&(SENSOR_3  <= LINE)){
        
        Off(OUT_A+OUT_C);
        Wait(50);
        OnFwd(OUT_A+OUT_C);
        Wait(100);                      //黒・黒だったら一時停止後、前進
        
        
        }
        
               if(SENSOR_2 == 1){
      
               OnRev(OUT_A+OUT_C);
               Wait(30);
               Off(OUT_A+OUT_C);
               Wait(100);                  //衝突したら後進して一時停止

''t = t + 160'';                      '' //衝突した後の動き分の時間を加算''
   
               
               }
  
   }
  Off(OUT_A+OUT_C);                     //3週する時間がきたら停止
  Off(OUT_A+OUT_C);                     //3周する時間がきたら停止
 }



(作成者 ツチヤ)
**苦労・工夫した点 [#u6bc68b2]
***工夫した点 [#fe57ab7b]
・前方に光センサーを取り付けた ⇒ ・交差点で停止線の前で止まることができ、他のロボットの通行の邪魔をしない。~
                        ・コースを見失ったときに早くコースを見つけることができる。~
前方に光センサーを取り付けた~
⇒ &#65533;交差点で停止線の前で止まることができ、他のロボットの通行の邪魔をしない。~
  &#65533;コースを見失ったときに早くコースを見つけることができる。~

***苦労した点 [#pc8d578e]
・ブロックをはめ込む凸の位置が一定間隔に決まっているので、光センサーの間隔を微調整できずコースからはずれないように走らせることに苦労した。
-ブロックをはめ込む凸の位置が一定間隔に決まっているので、光センサーの間隔を微調整できずコースからはずれないように走らせることに苦労した。
**感想 [#wef9c992]
・ロボットを作成するのが2回目ということもあり、前回よりもスムーズにできた。6時以降コンピューター室を出ると入れなくなるのを学んだ。(スギウラ)
-ロボットを作成するのが2回目ということもあり、前回よりもスムーズにできた。6時以降コンピューター室を出ると入れなくなるのを学んだ。(スギウラ)
-二人で役割分担をして製作できた。二人のアイディアが合わさって、なかなか良いロボットができたと思う。(ツチヤ)

***コメントをお願いします [#ie9d111b]
- 10番,32番教室については、1年生ならば21時まで入室することができます。 -- [[松本]] &new{2008-06-16 (月) 11:48:23};

良かった点~
+どのように3周するか等、プログラムを工夫しています。~
++書くべきことを書けています。

改善できる点~
+ロボットの機構を説明してはいますが、もっと細かく説明できると思います。例えば、バンパーの機構等です。~
++ロボットにもっと工夫ができたと思います。例えば、3輪と4輪どちらが良いかや車体の幅等です。

#comment


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS