2005/A1

ロボコンのプログラムその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-13 (月) 23:51:20