2009aへ戻る

目次

課題

黒い線上を進むロボットの製作。
詳細は2009a/練習問題、課題2の項を参照。 課題2−1のプログラムをdaikiが担当、課題2−2のプログラムを俺が担当

メンバー

  • daiki

ロボット

外観

全体

全体


腕
  • この鎌のような腕で牛乳パックを捕らえ、引きずっていく
  • 発想はこの班のものを拝借しました
  • 違う点は、右の腕に誤って牛乳パックが触れてしまわないよう、腕をひっこめてある点と、コースの関係上タッチセンサー回りがより簡単な構造になっていることです。
  • このことで、機体の重心が前に傾き過ぎず、滑らかに走ることができます。


タッチセンサー
  • 牛乳パックとの当たり判定をするタッチセンサーは、機体の上の方(赤の丸で囲われている部分)についています。これは腕と連動しています。
  • 牛乳パックが機体の下の方(青い丸で囲われている部分に)や腕に接触すると、タッチセンサーが反応する構造になっています。

コース

概要図

コース
  • 交差点は3つ
  • 3つの交差点をもつものの中では、最も簡単な形
  • 簡単な形ですので、機体の揺れなどは殆どなく、タッチセンサーが誤って反応してしまうようなことはありません。そのため、機体も簡単な構造にすることができました。

プログラム

daikiのプログラム

int SYOU;
#define STOP_TIME 1500;//三周するまでの時間

task main()
{   SetSensor(SENSOR_2,SENSOR_TOUCH);//タッチセンサー2
   SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサー1
   SetSensor(SENSOR_3,SENSOR_LIGHT);//光センサー3
   SYOU = 0;
   ClearTimer(0);
       while (Timer(0)<STOP_TIME){//三周するまで続ける
       if(SENSOR_2==0){
       if(SENSOR_1>40){
       if(SENSOR_3>40){ 
           OnFwd(OUT_A+OUT_C);
       } else{
           OnFwd(OUT_A);
           Off(OUT_C);
       }
       }else{
           OnFwd(OUT_C);
           Off(OUT_A);
       }
       if(SENSOR_1<40){
       if(SENSOR_3<40){ 
           OnFwd(OUT_A+OUT_C);
       } 
       } 
       }//センサー1と3で線を挟んで進むプログラム
       
       
       if(SENSOR_2==1){
         if(SYOU==0){
       
           OnRev(OUT_A+OUT_C);
           Wait(70);//パックから遠ざかる
           OnFwd(OUT_A);
           Wait(70);
           OnFwd(OUT_C);
           Wait(110);//パックを避けるため脱線
           OnRev(OUT_A);
           Wait(70);
           OnFwd(OUT_A);
           Wait(250);
           OnRev(OUT_A);
           Wait(70);
           OnFwd(OUT_A);
           Wait(100);
           OnRev(OUT_C);
           Wait(85);//線路に戻る
           Off(OUT_A+OUT_C);
         }//1回目の衝突
         if(SYOU==1){
           OnRev(OUT_A+OUT_C);
           Wait(65);//パックから遠ざかる
           OnFwd(OUT_A);
           Wait(80);
           OnFwd(OUT_C);
           Wait(110);//パックを避けるため脱線
           OnRev(OUT_A);
           Wait(75);
           OnFwd(OUT_A);
           Wait(250);
           OnRev(OUT_A);
           Wait(80);
           OnFwd(OUT_A);
           Wait(50);
           OnRev(OUT_C);
           Wait(85);//線路に戻る
           Off(OUT_A+OUT_C);
         }//2回目の衝突
         if(SYOU==0){
           SYOU = 1;
         }else{
           SYOU = 0;
         }
           
          }
       }

    Off(OUT_A+OUT_C);//三周したら停止する
       }



俺のプログラム

俺のプログラム(別ページに飛びます)

コメントをどうぞ

  • コースが面白いですね。プログラムは改善の余地ありです。RUN_TIMEはプログラム内で数値が変わるので「変数」である必要がありますが、RUN_TIME_JやRUN_TIME_Fは変わらない数ですから、「定数」(define)の方が適当かと思います。また、ifでセンサーの反応を判別しているところを、センサーが白か黒か(もしくは触っていないか触っているか)について、「無反応なら0を、反応なら1を返す関数」にしてみると、もっとスリム化できるかもしれません。 -- こさか? 2009-07-02 (木) 22:20:37
  • 追記:動画すごくわかりやすいです! -- こさか? 2009-07-02 (木) 22:21:08
  • プログラムにいろいろ工夫しているのがよいと思いますが、まだ改善点があります。何よりも、3周したら止まるようにしましょう。できれば、ロボットの説明も増やしましょう。-- FI? 2009-07-03 (金) 03:05:12
  • 3周したら止まるというのを判断するのに、秒数を使っていると、モーターの具合やパックの摩擦などの条件で微妙に3周にならないことがあるかもしれません。もっと確実に3周を数える方法がないか考えてみてください! -- こさか? 2009-07-10 (金) 12:10:50

ページ一覧


添付ファイル: filerobo03.jpg 257件 [詳細] filerobo02.jpg 253件 [詳細] filerosen.JPG 286件 [詳細] filerobo01.jpg 266件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-07-24 (金) 15:15:59 (3680d)