◇目次◇

課題2:黒い線に沿って動くロボット

  • 黒い線に沿って動くロボットを作成せよ。
    そして一つの周回コースを2台のロボットが走行すること想定し、以下の2種類のプログラムを作成せよ。
  • 前方のロボットに接触したら反転して進む
  • 前方のロボットに接触したらそのロボットを右側から追い抜いて
    (あるいは避けて通り)、再びライン上に戻って進む
  • *ただし、スピードと確実性をできる限り両立させること。
    自由課題1も参考に。光センサは2つ使用してよい。

完成までの過程

作成者:トシ/イケス/カツヤ/ウメ
作成日時:6/13,14,15

タッチセンサー

タッチセンサーを使ってみる

ライントレース

チャレンジ1回目

34.3KB,ヨ○シー←初めはこれでやってみたものの、90度以上のカーブは難しいため断念。

  • そのときのプログラミング(作成者:トシ/イケス/カツヤ/ウメ)
    #define THRESHOLD 40                         //光センサーを40に設定
    
    task main ()
    {
        SetSensor(SENSOR_1, SENSOR_LIGHT);       //センサー1を光センサーに設定
    
        while (true) {                           //繰り返し
            if (SENSOR_1 < THRESHOLD) {          //黒線上にいるとき
                OnFwd(OUT_A);                    //モーターAを正回転
                Off(OUT_C);                      //モーターCをストップ
            } else {                             //黒線から外れたとき
                Off(OUT_A);                      //モーターAをストップ
                OnFwd(OUT_C);                    //モーターCを正回転
            }
        }
    }
  • 一回目は光センサーを一つ用いたキッドで↑のライントレースを試みた。
    • 光センサー一つより、黒い線を二つの光センサーで読み取る方が、
      ライントレースがスムーズにいくだろうという結論にたどり着いた。
  • 今回のキッド
  • ロボット製作者:トシ/イケス/カツヤ/ウメ

58.3KB,ライントレーサー旧 ←→ 47.1KB,ライントレーサー旧2

  • 光センサーを一つ用いて線をトレースしようとしたが、急カーブに弱い事がわかり断念。
    • やはり、上で述べたように、この問題は光センサーを二つ使う事で解消ができそうだ。
      あとは絵を少しかえてみようと思った。チャレンジ2回目へ。。。

チャレンジ2回目

31.1KB,カ○ビー←難しいカーブを減らした。

  • 今回のプログラミング(作成者:トシ/イケス/カツヤ/ウメ)
    #define THRESHOLD 40                          //光センサーを40に設定
    #define TURN_TIME 200                         //回転時間を2秒に設定
    
    task main()
    {
    SetSensor(SENSOR_1,SENSOR_LIGHT);             //センサー1を光センサーに設定
    SetSensor(SENSOR_3,SENSOR_LIGHT);             //センサー3を光センサーに設定
    SetSensor(SENSOR_2,SENSOR_TOUCH);             //センサー2をタッチセンサーに設定
    
         OnFwd(OUT_A+OUT_C);                      //両方正回転
    
    while(true){
    
                  if(SENSOR_3>THRESHOLD)          //センサー3が線から外れた場合
                  {
                  Off(OUT_A);                     //モーターAをストップ
                  OnFwd(OUT_C);                   //Cを逆回転
                  }
                  if(SENSOR_1>THRESHOLD)          //センサー1が線から外れた場合
                  {
                  Off(OUT_C);                     //モーターCをストップ
                  OnFwd(OUT_A);                   //モーターAを正回転
                   }
                  else(OUT_A+OUT_C);              //それ以外は両方正回転
                  }             
    
    }
  • 光センサーを二つ用いて、線を挟む感じでトレースしていくようにした。
    • また、今回のキッド&プログラミングではチャレンジ一回目の絵でもできることが判明した。
  • 今回のキッド
  • ロボット製作者:トシ/イケス/カツヤ/ウメ

44.1KB,ライントレーサー ←→ 52.5KB,ライントレーサー2

  • 試行錯誤した結果、ダブルバンパーをもとに、光センサーを二つ付けた。
    • 光センサーを付ける位置を初めRCXの下にしたところ、
      そこが陰になり、うまく光センサーがラインを読み込めず断念。
      そこで、タッチセンサーの下に付ける事により解決!!♪

タッチセンサー&ライントレース

前方のロボットに接触したら反転して進む

  • プログラミング(作成者:トシ/カツヤ)
    #define THRESHOLD 40                           //光センサーを40に設定
    #define TURN_TIME 200                          //回転を2秒に設定
    
    task main()
    {
    SetSensor(SENSOR_1,SENSOR_LIGHT);              //センサー1を光センサーに設定
    SetSensor(SENSOR_3,SENSOR_LIGHT);              //センサー3を光センサーに設定
    SetSensor(SENSOR_2,SENSOR_TOUCH);              //センサー2をタッチセンサーに設定
    
         OnFwd(OUT_A+OUT_C);                       //両方のモーターを正回転
    
    while(true){                                   //下の作業を繰り返し
    
                  if(SENSOR_3>THRESHOLD)           //光センサー3が線からはずれたら
                  {
                  Off(OUT_A);                      //モーターAをストップ
                  OnFwd(OUT_C);                    //モーターCを正回転
                  }
                  if(SENSOR_1>THRESHOLD)           //光センサー1が線からはずれたら
                  {
                  Off(OUT_C);                      //モーターCをストップ
                  OnFwd(OUT_A);                    //モーターAを正回転
                  }
                  else(OUT_A+OUT_C);               //それ意外は両方正回転
                  
                  if(SENSOR_2==1)                  //タッチセンサーがオンになったら
                  {
                  OnRev(OUT_A+OUT_C);              //両方逆回転
                  Wait(80);                        //0.8秒待つ
                  OnFwd(OUT_A);                    //モーターAを正回転
                  OnRev(OUT_C);                    //モーターCを逆回転
                  Wait(210);                       //0.21秒待つ
                  }
                  }
    }
  • プログラミング(作成者:ウメ/イケス)
    #define THRESHOLD 40                           //光センサーを40に設定
    #define TURN_TIME 200                          //回転を2秒に設定
    
    task main()
    {
    SetSensor(SENSOR_1,SENSOR_LIGHT);              //センサー1を光センサーに設定
    SetSensor(SENSOR_3,SENSOR_LIGHT);              //センサー3を光センサーに設定
    SetSensor(SENSOR_2,SENSOR_TOUCH);              //センサー2をタッチセンサーに設定
    
         OnFwd(OUT_A+OUT_C);                       //両方のモーターを正回転
    
    while(true){                                   //下の作業を繰り返し
    
                  if(SENSOR_3>THRESHOLD)           //光センサー3が線からはずれたら
                  {
                  Off(OUT_A);                      //モーターAをストップ
                  OnFwd(OUT_C);                    //モーターCを正回転
                  }
                  if(SENSOR_1>THRESHOLD)           //光センサー1が線からはずれたら
                  {
                  Off(OUT_C);                      //モーターCをストップ
                  OnFwd(OUT_A);                    //モーターAを正回転
                  }
                  else(OUT_A+OUT_C);               //それ意外は両方正回転
                  
                  if(SENSOR_2==1)                  //タッチセンサーがオンになったら
                  {
                  OnRev(OUT_A+OUT_C);              //両方逆回転
                  Wait(80);                        //0.8秒待つ
                  OnFwd(OUT_A);                    //モーターAを正回転
                  OnRev(OUT_C);                    //モーターCを逆回転
                  Wait(210);                       //0.21秒待つ
                  }
                  }
    }

前方のロボットに接触したらそのロボットを右側から追い抜いて (あるいは避けて通り)、再びライン上に戻って進む

  • プログラミング(作成者:トシ/カツヤ)
    #define THRESHOLD 40                            //光センサーを40に設定
    #define TURN_TIME 200                           //回転時間を2秒に設定
    
    task main()
    {
    SetSensor(SENSOR_1,SENSOR_LIGHT);               //センサー1を光センサーに設定
    SetSensor(SENSOR_3,SENSOR_LIGHT);               //センサー3を光センサーに設定
    SetSensor(SENSOR_2,SENSOR_TOUCH);               //センサー2をタッチセンサーに設定
    
         OnFwd(OUT_A+OUT_C);                        //両方正回転
    
    while(true){                                    //繰り返し
    
                  if(SENSOR_3>THRESHOLD)            //センサー3が線からはずれたら
                  {
                  Off(OUT_A);                       //モーターAをストップ
                  OnFwd(OUT_C);                     //モーターCを正回転
                  }
                  if(SENSOR_1>THRESHOLD)            //センサー1が線からはずれたら
                  {
                  Off(OUT_C);                       //モーターCをストップ
                  OnFwd(OUT_A);                     //モーターAを正回転
                  }
                  else(OUT_A+OUT_C);                //それ意外は両方正回転
                  
                  if(SENSOR_2==1)                   //タッチセンサーがオンになったら
                  {
                  OnRev(OUT_A+OUT_C);               //両方逆回転
                  Wait(80);                         //0.8秒待つ
                  OnFwd(OUT_A);                     //モーターAを正回転
                  OnRev(OUT_C);                     //モーターCを逆回転
                  Wait(210);                        //0.21秒待つ
                  }
                  }
    }
  • プログラミング(作成者:ウメ/イケス)
    #define THRESHOLD 40                            //光センサーを40に設定
    #define TURN_TIME 200                           //回転時間を2秒に設定
    
    task main()
    {
    SetSensor(SENSOR_1,SENSOR_LIGHT);               //センサー1を光センサーに設定
    SetSensor(SENSOR_3,SENSOR_LIGHT);               //センサー3を光センサーに設定
    SetSensor(SENSOR_2,SENSOR_TOUCH);               //センサー2をタッチセンサーに設定
    
         OnFwd(OUT_A+OUT_C);                        //両方正回転
    
    while(true){                                    //繰り返し
    
                  if(SENSOR_3>THRESHOLD)            //センサー3が線からはずれたら
                  {
                  Off(OUT_A);                       //モーターAをストップ
                  OnFwd(OUT_C);                     //モーターCを正回転
                  }
                  if(SENSOR_1>THRESHOLD)            //センサー1が線からはずれたら
                  {
                  Off(OUT_C);                       //モーターCをストップ
                  OnFwd(OUT_A);                     //モーターAを正回転
                  }
                  else(OUT_A+OUT_C);                //それ意外は両方正回転
                  
                  if(SENSOR_2==1)                   //タッチセンサーがオンになったら
                  {
                  OnRev(OUT_A+OUT_C);               //両方逆回転
                  Wait(80);                         //0.8秒待つ
                  OnFwd(OUT_A);                     //モーターAを正回転
                  OnRev(OUT_C);                     //モーターCを逆回転
                  Wait(210);                        //0.21秒待つ
                  }
                  }
    }

完成したキッド

  • ロボット製作者:トシ/イケス/カツヤ/ウメ

54.5KB,ヘラクレス ←→ 51.9KB,ヘラクレスさん

おまけ♪

苦労した点

  • バランス感覚
    • バランスがとれてないと、まっすぐにすすまないし、光センサーでうまく線をトレースできなく、苦戦。
      しかし、前方にタッチセンサーを付ける事により、バランス感覚についての問題は解消できた。
  • タッチセンサーの位置
    • 光センサーを二つつけると、タッチセンサーを付けるのに苦労した。
      しかし、上の写真のように付ける事によりこの問題は解消。
  • Waitの時間
    • ロボットが障害物をよけて進むためにどのくらい回転させて進めばよいか試行錯誤だった。
  • また、反転の時も同様で、回転の時間が難しい…。
    実際「絵」の場所によってはうまくいく場所とうまくいかない場所が存在する。。
  • プログラム全般
    • 今回からプログラムが一気に難しくなり、苦労した…。
      プログラムに長けた人がいるわけでなく、
      一からやったため若干プログラム自体に問題があるかもしれない。
      しかし、一朝一夕で所得で切れば楽なものである、
      失敗、学んだ事、これらをこれからのロボティクスに生かして行きたいと思う。
  • 人生失敗がつきもの。
    • 人生ではないですが、やはりロボティクスをやっていると
      一回でできるなんて期待してはいけないと思いました。
      今回はチャレンジ二回目でできたのですが、三回四回とかかる可能性もあったわけで、
      先の見えない戦いというものに苦しめられました。。。

工夫した点

  • カ○ビーの絵
    • ヨ○シーだと、難しいコーナーが多くて、挫折したけど、
      カ○ビーにし、黒の線を太くする事により、うまく問題解消。
      (実は最終的にはヨ○シーでもできた事が判明したがケドネ…。)
  • 光センサーの位置
    • 光センサーの位置は、タイヤから、遠すぎると小回りが利かず、
      近すぎると、小回りが利きすぎて、試行錯誤の結果今の写真の位置になりました。
    • 光センサーの間隔が狭すぎるor遠すぎるとうまくトレースしなく、現在の位置になりました。
  • タッチセンサーなどキッドの強度
    • バランスを良くするために少しパーツを減らして全体の強度が落ちたため、
      ブロックをうまく使ってタッチセンサーなどもきちんと衝撃に耐えれるようにした。

完成後記

  • 重量のバランス
    • これは本当に難しかった。
      前にタッチセンサー、光センサーを付けると、
      前のめりのキッドになるという難問があったが、
      RCXのおく位置をうまくし、調整!!
  • 完成したぜぃ!!!
    • 今回は課題1よりも時間はかからなかったものの、やはり苦労したことには変わらず、
      完成したときの喜びは計り知れない♪
  • 徹夜×睡眠不足×白熱ダブルダッシュ
    • なかなかみんなの予定が合わなく徹夜の作業だった。
      日程があったのが深夜という(^^;、でも楽しかったです☆
  • 若干の成果
    • このHPを見てわかると思うけど、そんな大したことは言えないが、
      若干このロボティクスに慣れてきた感があり、初期より大分楽になってきた。
      それにメンバー内での交流もうまくいっており、連携が取れる理想の形になりつつある。
      だが、やっぱり勉強不足であるプログラミングをもっと学びたいと思います…。

掲示板

コメントやアドバイスお願いします(^0^)




else のあと

松本(教員)? (2006-07-11 (火) 10:05:33)

if(SENSOR_1>THRESHOLD)            //センサー1が線からはずれたら
{
Off(OUT_C);                       //モーターCをストップ
OnFwd(OUT_A);                     //モーターAを正回転
}
else(OUT_A+OUT_C);                //それ意外は両方正回転

の中の else 以下は、きっと

else { OnFwd(OUT_A+OUT_C); }

の間違いですね。


無題

いまい(TA)? (2006-06-16 (金) 13:39:40)

誰がプログラム作成者かの記述と、
プログラムを2人一組で2つ作ってみてください。


もう少し

A6Lメンバー? (2006-06-15 (木) 22:12:10)

もう少しレポを改良する予定です。


今何時だろぅ?

あるA6Lメンバー? (2006-06-14 (水) 03:23:49)

現時刻3時12分。
眠いっしょ。。。
今日はこの辺でミッション終了。。。 また明日会おう!!



添付ファイル: fileDSC04207_1.JPG 209件 [詳細] fileDSC04206.JPG 201件 [詳細] fileDSC04204_1.JPG 172件 [詳細] fileDSC04203.JPG 171件 [詳細] fileDSC04199.JPG 177件 [詳細] fileDSC04201.JPG 196件 [詳細] fileDSC04194_1.JPG 204件 [詳細] fileDSC04190_1_1.JPG 213件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-07-11 (火) 10:05:33 (4791d)