2005/A1

ロボコン日誌

2月2日 木曜日(あと5日)

ほぼテストは終わりロボコンに向けて始動する。作戦としては二体のロボットによる役割で行うロボットをまず作ることにした。授業が終了した後にこまくさ寮へ行き食堂で本格的に作り出す。牛乳パックを持つにはアームのようなものが必要となり、さらに持ち上げるのにはエレベータのようなものも必要になる。数時間かけて形にはしたものの構造上の原因でうまく機能はせずにこの日はひとまず終わった・・・。

2月3日 金曜日(あと4日)

10時からロボットを作ろうと予定したがそれぞれに用が出来てしまい、結局コンパス一人でロボットを作ることになった。前日に作ったロボットを改良して実際には試してはいないが持ち上げる機能があるロボットを仕上げて終了した・・・寂しい。

2月4日 土曜日(あと3日)

今日は皆の予定を考えて六時半から作業を始めることにした。相変わらず集合は時間差があったが全員集合できた。始め二体のロボットを作ろうとしていたが、ここで一体に使える配線の数に問題があることからロボットを一体集中型にすることに決めた。そうして、本体どうしを通信させることにより一連の動きを可能にできるだろうとショベルカーのようなロボットの腕の部分だけ作ることが出来た。・・・もう日数が少ないのにプログラムはどうしよう・・・。

2月5日 日曜日(あと2日)

今日は朝から作業を始めることにした。やっぱり集まりは悪いが昼頃には全員集合した。まず、前日に作ったロボットの土台を作り実際に牛乳パックを持ち上げれるか試すことにした。ロボットの仕組みは、アームでパックを抑えて小さいタイヤでパックを巻き上げるというもので、大幅な改造と微調整で牛乳パックをうまく持ち上げることが出来た。さらに、土台となる部分もロボコンに合わせた大きさでかつ安定性と耐久性を兼ねそろえたものを作ることが出来た・・・でも実際にコースで試さないとわからない。同時進行でプログラムも作りだすが、あまり進んでいないようで明日10番教室で取り掛かることに決める。・・・大丈夫かな〜。

2月6日 月曜日(いよいよ明日)

調整中

明日は本番だというのに今からプログラムを作ることに!どうしたらよいかわからず、あっちこっちのプログラムをネットで見ては方針を立てて進めていった。とにかく二つのプログラムが必要なので(コンパス)と(そるとと)がぎりぎりまでねばって十一時までかかりプログラムを完成?することができた。その間にロボットも他のメンバーに改良を加えてもらっていたが、九時には帰らなければならない用があり、ロボットも一緒に持っていってもらったので、プログラムは明日試すことにして撤収することにした。外は大雪で帰り道に死ぬんじゃないかと思った。こんな日にバイクは乗るもんじゃないよ!!!。

2月7日 火曜日(本番当日)

ロボコンの風景

いよいよロボコン本番日。 私たちは八時半から十時くらいまでに集合して前日に作ったプログラムを試すことにした。 しかし、プログラムはうまく動かず、さらにロボット自体にも欠陥があることを発見する。 そこで、ロボットも改良しつつプログラムも改良することになった・・・。 間ばかりが経過していきロボコンが始まってしまった。 然うまくいくはずもなく一回目は失敗。 れでもあきらめずに原因を突き止めようと最後まで成功を信じてやり続けました・・・。 結果は最後から2番目・・・悔しい。

2月8日 水曜日

通常の3倍の速さで片付け中 後片付け

まだ仕上げていない課題を取り組まなくてはいけず、こまくさ寮でして、最後にかたずけの作業をしました・・・ 長かったなー byコンパス。

ロボットについて

初期の構想

二体のロボットを使う。一体はアームで牛乳パックをつかみ持ち上げ、そしてライントレースしてもう一体に何色のパックか?という情報を 送信し、パックをもう一体に乗せる。受信した方はその命令どうりの場所に行き、ベルトコンベアにより箱に入れるというものであった。

最終的に作ったロボットの特徴

その1:

長いアーム

長いアームが付いており、開いたり閉じたりする。そして先端にはタイヤが付いていて、コレによりスムーズな箱の持ち運びが可能とる。さらに、地面にある牛乳パックと一段高い所にあるパックの両方を取れるようにタイヤの位置、そして箱に入れる際にアームがぶつからないようにアームの長さを調節してある。

その2:

ぱおーん

箱を上方へ移動させるためにアームとは逆側にモーターにより回転するタイヤを取り付けた。このとき、ギアと滑車を組み合わせて丁度いい速さにしてある。そして、上方にタッチセンサーを付けて牛乳パックを持ち上げたかどうかを判定できるようにした。なので、バランスよい間隔を探すのがポイントとなる。

その3:

落とさないように・・・

土台はコースの障害物に当たらないように、そしてパックを取るのに支障がないように頑丈に出来ている。安定した走行が要求されるので、タイヤは小さいものを使用している。

その4:

よっこらせ

色の識別のために上部に光センサーを付ける。その情報は片方の機械にしか伝わらないので、本体二つを平行に土台に乗せ通信させるように設計した。

プログラム

ロボコンのプログラムその1

 作成者 コンパス

アームを動かして、色を識別するプログラム

#define THRESHOLD  30
  
    up_arm(){OnFwd(OUT_A+OUT_B); Wait(400);} // up_armの設定
    task main (){ 
    SetSensor(SENSOR_1, SENSOR_LIGHT);   //  光センサー
     SetSensor(SENSOR_3, SENSOR_TOUCH);      // タッチセンサー
         while (true) {     
                     
       OnRev(OUT_A);                         //タッチセンサーが反応するまでアームで牛乳パックを抱えてモーターCで上へ巻き上げる
       OnFwd(OUT_C);       
       until (SENSOR_3 == 1) ;     
       Off(OUT_A);
       OnFwd(OUT_C);          //アームは止める
      
          
   if (SENSOR_1 < 33)          //黒色ならメッセージ3を送信
        {
   ClearTimer(0);
   while ( Timer(0) <= 30 ) { SendMessage(3); }PlayTone(220,50) ;
         }
   if (SENSOR_1 > 45 )           //白色ならメッセージ4を送信
    { 
    ClearTimer(0);
     while ( Timer(0) <= 30 ) { SendMessage(4); }PlayTone(220,50) ;
    }   
   else                          //緑色ならメッセージ5を送信
           { 
    ClearTimer(0);
    while ( Timer(0) <= 30 ) { SendMessage(5); }
    PlayTone(220,50) ;
           }
                   
   ClearMessage();                //メッセージ6が受信されたらアームを上げる
   until (Message() != 0);  
   if ( Message() == 6 ) 
   PlayTone(440,50) ;
   up_arm() ;  
    
   ClearMessage();               // メッセージ7が受信されるまで待機         
   until (Message() != 0);        
   if ( Message() == 7 )
   PlayTone(440,50);       
                }
  }

感想(解説)

光センサーによって色の識別をして、その情報をメッセージとしてもう片方の本体に送信するというプログラムです。メッセージを送受信したときには音が鳴るようにすることによりきちんと動いているかどうか確かめました。ちゃんと動いてくれたときはテンション上がったよ!

ロボコンのプログラムその2

作成者 そるとと

メッセージを受信して牛乳パックを箱に入れるプログラム  

#define THRESHOLD 39         //THRESHOLDを39と定義
sub turn_right(){OnRev(OUT_A); OnFwd(OUT_C);Wait(45);Off(OUT_A+OUT_C);}
               //右に曲がるサブルーチン
sub line_treace()        //ライントレースするサブルーチン
    {while((SENSOR_1<THRESHOLD ) && (SENSOR_2<THRESHOLD))
            //センサー1・2が共にTHRESHOLD以下になるまで繰り返す
                            
       {
        if (SENSOR_2<THRESHOLD) //センサー2がTHRESHOLD以下になったら        
        {          
        OnFwd(OUT_A);                  
        OnRev(OUT_C);       //右へ曲がる
        }
        if (SENSOR_1<THRESHOLD) //センサー1がTHRESHOLD以下になったら
        {    
        OnFwd(OUT_C);                   
        OnRev(OUT_A);           //左へ曲がる           
        }
        else                            
        {
        OnFwd(OUT_A+OUT_C);     
        Float(OUT_A+OUT_C);     //直進
        }
    }
}
sub line_treaceback()           //帰るときにライントレースするサブルーチン
       {while ((SENSOR_1<THRESHOLD ) &&  (SENSOR_2<THRESHOLD))
      
    {
        if (SENSOR_2<THRESHOLD)         
        {          
        OnFwd(OUT_C);                
        OnRev(OUT_A);
       }
        if (SENSOR_1<THRESHOLD)        
        {    
        OnFwd(OUT_A);                   
        OnRev(OUT_C);                 
       }
        else                            
        {
        OnFwd(OUT_A+OUT_C);Wait(2);
        Float(OUT_A+OUT_C);Wait(5);
        }
    }
}

sub kuro_pakku()          //黒パックをつかんだときに行うサブルーチン
{OnRev(OUT_A); OnFwd(OUT_C);Wait(45);Off(OUT_A+OUT_C); // 右に曲がる
while ((SENSOR_1<THRESHOLD ) && (SENSOR_2<THRESHOLD))
    {
        if (SENSOR_2<THRESHOLD)         
        {          
        OnFwd(OUT_A);                
        OnRev(OUT_C);
       }
        if (SENSOR_1<THRESHOLD)        
        {    
        OnFwd(OUT_C);                   
        OnRev(OUT_A);                 
       }
        else                            
        {
        OnFwd(OUT_A+OUT_C);Wait(2);
        Float(OUT_A+OUT_C);Wait(5);     
        }
    }
        OnRev(OUT_A); OnFwd(OUT_C);Wait(45);Off (OUT_A+OUT_C);
              //右に曲がる
        OnFwd(OUT_C+OUT_A);
        Wait(50);
if (SENSOR_1<THRESHOLD)                            
while ((SENSOR_1<THRESHOLD ) && (SENSOR_2<THRESHOLD))
    {
        if (SENSOR_2<THRESHOLD)         
        {          
        OnFwd(OUT_A);                
        OnRev(OUT_C);
       }
        if (SENSOR_1<THRESHOLD)        
        {    
        OnFwd(OUT_C);                   
        OnRev(OUT_A);                 
       }
        else                            
        {
        OnFwd(OUT_A+OUT_C);Wait(2);
         Float(OUT_A+OUT_C);Wait(5);    
        }
    }
if ((SENSOR_1<THRESHOLD ) && (SENSOR_2<THRESHOLD))
{
ClearTimer(0);
while (Timer(0)<=100)     //1秒間ライントレースする
    {
        if (SENSOR_2<THRESHOLD)         
        {          
        OnFwd(OUT_A);                
        OnRev(OUT_C);
       }
        if (SENSOR_1<THRESHOLD)        
        {    
        OnFwd(OUT_C);                   
        OnRev(OUT_A);                 
       }
        else                            
        {
        OnFwd(OUT_A+OUT_C);Wait(2);
        Float(OUT_A+OUT_C);Wait(5);    
        }
    }
Off(OUT_A+OUT_C);
    ClearTimer(0);
    while ( Timer(0) <= 10 ) { SendMessage(6); }PlayTone(220,50) ;
        //箱を入れられる位置についたことを知らせるために6を送る
        //それと同時に音を出す 
while((SENSOR_1<THRESHOLD ) && (SENSOR_2<THRESHOLD)) //帰る↓↓
    {
        if (SENSOR_2<THRESHOLD)         
        {          
        OnFwd(OUT_C);                
        OnRev(OUT_A);
       }
        if (SENSOR_1<THRESHOLD)        
        {    
        OnFwd(OUT_A);                   
        OnRev(OUT_C);                 
       }
        else                            
        {
        OnFwd(OUT_A+OUT_C);Wait(2);
        Float(OUT_A+OUT_C);Wait(5);         
        }
    }
OnRev(OUT_A); OnFwd(OUT_C);Wait(45);Off(OUT_A+OUT_C);
Wait(50);
if (SENSOR_1<THRESHOLD)                            
OnRev(OUT_A); OnFwd(OUT_C);Wait(45);Off(OUT_A+OUT_C);}
}
 
sub midori_pakku()     //緑パックをつかんだときに行うサブルーチン
{OnRev(OUT_A); OnFwd(OUT_C);Wait(45);Off(OUT_A+OUT_C);
while((SENSOR_1<THRESHOLD ) && (SENSOR_2<THRESHOLD))
     {
        if (SENSOR_2<THRESHOLD)         
        {          
        OnFwd(OUT_A);                
        OnRev(OUT_C);
       }
        if (SENSOR_1<THRESHOLD)        
        {    
        OnFwd(OUT_C);                   
        OnRev(OUT_A);                 
       }
        else                            
        {
        OnFwd(OUT_A+OUT_C);Wait(2);
        Float(OUT_A+OUT_C);Wait(5);         
        }
    }
OnRev(OUT_A); OnFwd(OUT_C);Wait(45);Off(OUT_A+OUT_C);
        OnFwd(OUT_C+OUT_A);
        Wait(50);
if (SENSOR_1<THRESHOLD)                            
until ((SENSOR_1<THRESHOLD ) && (SENSOR_2<THRESHOLD)); 
    {
        if (SENSOR_2<THRESHOLD)         
        {          
        OnFwd(OUT_A);                
        OnRev(OUT_C);
       }
        if (SENSOR_1<THRESHOLD)        
        {    
        OnFwd(OUT_C);                   
        OnRev(OUT_A);                 
       }
        else                            
        {
        OnFwd(OUT_A+OUT_C);Wait(2);
        Float(OUT_A+OUT_C);Wait(5);         
        }
    }
if ((SENSOR_1<THRESHOLD ) && (SENSOR_2<THRESHOLD))
{
ClearTimer(0);
while (Timer(0)<=200) 
    {
        if (SENSOR_2<THRESHOLD)         
        {          
        OnFwd(OUT_A);                
        OnRev(OUT_C);
        }
        if (SENSOR_1<THRESHOLD)        
        {    
        OnFwd(OUT_C);                   
        OnRev(OUT_A);                 
        }
        else                            
        {
        OnFwd(OUT_A+OUT_C);Wait(2);
        Float(OUT_A+OUT_C);Wait(5);         
        }
    }
Off(OUT_A+OUT_C);
    ClearTimer(0);
    while ( Timer(0) <= 10 ) { SendMessage(6); }PlayTone(220,50) ; 
ClearTimer(0);
while (Timer(0)<=200) 
    {
        if (SENSOR_2<THRESHOLD)         
        {          
        OnFwd(OUT_C);                
        OnRev(OUT_A);
        }
        if (SENSOR_1<THRESHOLD)        
        {    
        OnFwd(OUT_C);                   
        OnRev(OUT_A);                 
       }
        else                            
        {
        OnFwd(OUT_A+OUT_C);Wait(2);
        Float(OUT_A+OUT_C);Wait(5);         
        }
    } 

OnRev(OUT_A); OnFwd(OUT_C);Wait(45);OnFwd(OUT_A+OUT_C);
Wait(100);
if (SENSOR_1<THRESHOLD)                            
OnRev(OUT_A); OnFwd(OUT_C);Wait(45);}
} 

sub shiro_pakku()    //白パックをつかんだときに行うサ ブルーチン↓
{OnRev(OUT_A); OnFwd(OUT_C);Wait(45);Off(OUT_A+OUT_C);
until ((SENSOR_1<THRESHOLD ) && (SENSOR_2<THRESHOLD)); 
    {
        if (SENSOR_2<THRESHOLD)         
        {          
        OnFwd(OUT_A);                
        OnRev(OUT_C);
       }
        if (SENSOR_1<THRESHOLD)        
       {     
        OnFwd(OUT_C);                   
        OnRev(OUT_A);                 
       }
        else                            
        {
        OnFwd(OUT_A+OUT_C);Wait(2);
        Float(OUT_A+OUT_C);Wait(5);         
        }
    }
OnRev(OUT_A); OnFwd(OUT_C);Wait(45);Off(OUT_A+OUT_C);
        OnFwd(OUT_C+OUT_A);
        Wait(50);
if (SENSOR_1<THRESHOLD)                            
until ((SENSOR_1<THRESHOLD ) && (SENSOR_2<THRESHOLD)); 
    {
        if (SENSOR_2<THRESHOLD)         
        {          
        OnFwd(OUT_A);                
        OnRev(OUT_C);
       }
        if (SENSOR_1<THRESHOLD)        
        {    
        OnFwd(OUT_C);                   
        OnRev(OUT_A);                 
        }
        else                            
        { 
        OnFwd(OUT_A+OUT_C);Wait(2);
        Float(OUT_A+OUT_C);Wait(5);         
        }
    }
if ((SENSOR_1<THRESHOLD ) && (SENSOR_2<THRESHOLD))
{
ClearTimer(0);
while (Timer(0)<=300) 
    {
        if (SENSOR_2<THRESHOLD)         
        {          
        OnFwd(OUT_A);                
        OnRev(OUT_C);
       }
        if (SENSOR_1<THRESHOLD)        
        {    
        OnFwd(OUT_C);                   
        OnRev(OUT_A);                 
       }
        else                            
        {
        OnFwd(OUT_A+OUT_C);Wait(2);
        Float(OUT_A+OUT_C);Wait(5);         
         }
     }
Off(OUT_A+OUT_C);
     ClearTimer(0);
    while ( Timer(0) <= 10 ) { SendMessage(6); }PlayTone(220,50) ; 
ClearTimer(0);
while (Timer(0)<=300) 
    {
        if (SENSOR_2<THRESHOLD)         
        {          
        OnFwd(OUT_C);                
        OnRev(OUT_A);
       }
        if (SENSOR_1<THRESHOLD)        
        {    
        OnFwd(OUT_C);                   
        OnRev(OUT_A);                 
       }
        else                            
        {
        OnFwd(OUT_A+OUT_C);Wait (2);
        Float(OUT_A+OUT_C);Wait(5);         
        }
    } 

OnRev(OUT_A); OnFwd(OUT_C);Wait(45);OnFwd(OUT_A+OUT_C);
Wait(100);
if (SENSOR_1<THRESHOLD)                            
OnRev(OUT_A); OnFwd(OUT_C);Wait(45);
}
}

task main ()      //実際に動くためのプログラム
{
    SetSensor(SENSOR_1, SENSOR_LIGHT)
    SetSensor(SENSOR_2, SENSOR_LIGHT);
    while(true)
    {
        ClearMessage(); 
        until (Message() != 0); //カゴまで行く↓      
      if ( Message() == 3)PlayTone(440,50) ;
      line_treace();
      kuro_pakku();      
      if ( Message() == 4)PlayTone(440,50) ;
      line_treace();
      shiro_pakku();
      if ( Message() == 5)PlayTone(440,50) ;
      line_treace();
      midori_pakku();
line_treaceback();               //カゴから帰る↓
if ((SENSOR_1<THRESHOLD ) && (SENSOR_2<THRESHOLD))       
     Off(OUT_A+OUT_C);
     ClearTimer(0);
    while ( Timer(0) <= 10 ) { SendMessage(7); }PlayTone(220,50) ;
       //帰ってきたことを知られるために7を送る    
    }
} 

感想 苦労の数々 (あと言い訳) 

とりあえず3個は運ぼうと思って作ったプログラムです。まずライントレースからしてうまくできなかった・・・。なんでだろうと思いプログラムを何度も何度も書き直した、が、直らず・・・。結局すべての時間をライントレースに使う羽目に(涙)。 発表一回目。結局ライントレースもできず、プログラムも一回も試せないまま本番を向かえ案の定失敗。 何度も試したが結局できず・・。しかし最後のチャレンジの寸前、とうとう欠陥を発見!!なんとマシーンに欠陥が。。が、とき既に遅し。まにあいませんでした・・・(;_;) 最後に。僕は頑張ったと思う!こんな長いプログラムしたこと無かったし、わずか1日足らずで書いたのだから。でも結局力不足でした。チームの皆さんごめんなさいm(__)mm(__)mm(__)m

ご意見ご感想をどうぞ



トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-02-16 (木) 13:40:03