2005/C1

プログラムその一

 

#define threshold 45
#define turn_left OnRev(OUT_A);OnFwd(OUT_C);
#define turn_right OnFwd(OUT_A);OnRev(OUT_C);
#define stop_turning Off(OUT_A+OUT_C);
#define akarui 40 
int cross ; 
int cro ;         
void go_a(int cro)  
{

 cross = 0 ;   

while(true){
if (SENSOR_1+ SENSOR_2+ SENSOR_3  > akarui) 
{
cross = cross + 1 ;  
}
if (cross == cro) 
{
Off(OUT_A+OUT_C) ;
}
cross = 0 ;    
       
 }
    } 
 
sub li_a()
{ 
SetSensor(SENSOR_1, SENSOR_LIGHT);
setSensor(SENSOR_2, SENSOR_LIGHT);
SetSensor(SENSOR_3, SENSOR_LIGHT);
  
    OnFwd(OUT_A); OnRev(OUT_C); 
     Wait(140);Off(OUT_A+ OUT_C);
    OnFwd(OUT_A+OUT_C);Wait(200);Off(OUT_A+OUT_C);
    OnFwd(OUT_C); OnRev(OUT_A);
     Wait(100);Off(OUT_A+OUT_C);
    OnFwd(OUT_A+OUT_C);Wait(200);
    
    
    while (true)
     { 
        if ((SENSOR_3> akarui )&& (SENSOR_2  <akarui ) 
        && (SENSOR_1> akarui)) 
       {   OnFwd(OUT_A+OUT_C); }
        
        if ((SENSOR_1 < akarui ) && (SENSOR_2 < akarui)
          && (SENSOR_3> akarui))
       {   OnFwd(OUT_A); 
          OnRev(OUT_C); }
       
        if((SENSOR_3< akarui )&& (SENSOR_2  <akarui )
          && ( SENSOR_1 > akarui) ){ 
           OnFwd(OUT_C);        
               OnRev(OUT_A);}
              
                
        if((SENSOR_2 < akarui) && (SENSOR_3< akarui )
          && (SENSOR_1 < akarui )){
          OnFwd(OUT_A+OUT_C);
           }	
               
        
            
            if ((SENSOR_1 < akarui ) && 
(SENSOR_3 < akarui      )
            && (SENSOR_2  > akarui )){
           OnFwd(OUT_C);
           OnRev(OUT_A);
           }
            
          if((SENSOR_1>akarui)&&
(SENSOR_2>akarui)&&(SENSOR_3<akarui)){
          OnFwd(OUT_C);        
               OnRev(OUT_A);}
           
            if ((SENSOR_1 < akarui ) && 
(SENSOR_2 > akarui)
          && (SENSOR_3> akarui))
       {   OnFwd(OUT_A); 
          OnRev(OUT_C); }
           
      }
 } 
     
              
task main()
{  SetSensor(SENSOR_3, SENSOR_LIGHT);
SetSensor(SENSOR_2, SENSOR_LIGHT);
SetSensor(SENSOR_1, SENSOR_LIGHT);
   OnFwd(OUT_A+OUT_C);Wait(50);Off(OUT_A+OUT_C); Wait          
(300);
  OnRev(OUT_A+OUT_C); Wait(100); Off(OUT_A+OUT_C);
  
    ClearMessage();           
        until (Message() != 0);   

      if ( Message() == 1 ){ 
        PlaySound(SOUND_CLICK);
        li_a();
        
        go_a(4);
                   
        OnFwd(OUT_A);OnRev(OUT_C);Wait(300);
                  
        
        li_a();
        go_a(5);}
        
      if ( Message() == 2 ) {
         PlaySound(SOUND_CLICK);
          li_a();
        
        go_a(3); 
        OnFwd(OUT_A);OnRev(OUT_C);Wait(300);
        
        li_a();
        go_a(4);} 
       
      if ( Message() == 3 ) {  
        PlaySound(SOUND_CLICK);
        li_a();
       
        go_a(2);
        OnFwd(OUT_A);OnRev(OUT_C);Wait(300);
        
        li_a();
        go_a(2);}
        
   OnFwd(OUT_A);
    OnRev(OUT_C);
    Wait(148);
    OnFwd(OUT_A+OUT_C);
Wait(250);     
ClearMessage();           
until (Message() != 0);   
if ( Message() == 1 ) {   
        PlaySound(SOUND_CLICK);
        li_a();
        
        go_a(5);
        OnFwd(OUT_A);OnRev(OUT_C);Wait(300);
        
        li_a();
        go_a(6);} 
      if ( Message() == 2 )  {   
        PlaySound(SOUND_CLICK);
        li_a();
       
        go_a(4);
        OnFwd(OUT_A);OnRev(OUT_C);Wait(300);
       
        li_a();
        go_a(5);}
      if ( Message() == 3 ) {  
        PlaySound(SOUND_CLICK);
        li_a();
        
        go_a(3);
        OnFwd(OUT_A);OnRev(OUT_C);Wait(300);
        
        li_a();
        go_a(4);}
        
      OnFwd(OUT_A);
     OnRev(OUT_C);
     Wait(148);
OnFwd(OUT_A+OUT_C);
Wait(250);             
ClearMessage();         
until (Message() != 0);  
if ( Message() == 1 ){ turn_left;     
li_a();PlaySound(SOUND_CLICK);
        
go_a(6);}
      if ( Message() == 2 )  {turn_right;    
        li_a(); PlaySound(SOUND_CLICK);
        
        go_a(5); }
      if ( Message() == 3 ) { stop_turning; 
li_a();PlaySound(SOUND_CLICK);
   
go_a(4); }

}

エビチリ版プログラムです。やたらめったら長いのが特徴。 我らがマシンはアームと車体で別々のプログラムを組んでいますが、その車体のプログラムです。 関数で十字路の数を数えて、それを目安に止まるようにプログラムしたつもりです。 実際使ったのはこれの改良版でしたが、雛形として役に立ったのなら作ったかいがあるというもの、手前味噌ですが、自慢の一品です。

プログラムその二 (対ライントレース)

 #define akarui 45
task main()            
{ 
      SetSensor(SENSOR_1, SENSOR_LIGHT);
      SetSensor(SENSOR_2, SENSOR_LIGHT);
      SetSensor(SENSOR_3, SENSOR_LIGHT);
  OnFwd(OUT_A+OUT_C);Wait(50);Off(OUT_A+OUT_C);
 Wait  (300);
  OnRev(OUT_A+OUT_C); Wait(100); 
     OnFwd(OUT_A); OnRev(OUT_C); Wait(120);
  Off(OUT_A+OUT_C);
    OnFwd(OUT_A+OUT_C);Wait(150);
  Off(OUT_A+OUT_C);
   OnFwd(OUT_C); OnRev(OUT_A); Wait(80); 
Off(OUT_A+OUT_C);
    OnFwd(OUT_A+OUT_C);Wait(230);Off(OUT_A+OUT_C);
    OnFwd(OUT_A); OnRev(OUT_C); Wait(120);  
OnFwd(OUT_C);    OnRev(OUT_A); 

while (true)
{ 
if ((SENSOR_3> akarui )&& (SENSOR_2  <akarui ) 
        && (SENSOR_1> akarui)) 
  {   OnFwd(OUT_A+OUT_C); }
        
        if ((SENSOR_1 < akarui ) && (SENSOR_2 < akarui)
          && (SENSOR_3> akarui))
       {   OnFwd(OUT_A); 
          OnRev(OUT_C); }
       
        if((SENSOR_3< akarui )&& (SENSOR_2  <akarui )
          && ( SENSOR_1 > akarui) ){ 
           OnFwd(OUT_C);        
               OnRev(OUT_A);}
              
               
        if((SENSOR_2 < akarui) && (SENSOR_3< akarui )
          && (SENSOR_1 < akarui )){
          OnFwd(OUT_A+OUT_C);
           }	
               
        
           
           if ((SENSOR_1 < akarui ) && 
(SENSOR_3 < akarui )
            && (SENSOR_2  > akarui )){
           OnFwd(OUT_C);
           OnRev(OUT_A);
           }
            
         if((SENSOR_1>akarui)&&(SENSOR_2>akarui)
&& (SENSOR_3<akarui)){
          OnFwd(OUT_C);        
               OnRev(OUT_A);}
           
           if ((SENSOR_1 < akarui ) && (SENSOR_2 > akarui)
          && (SENSOR_3> akarui))
       {   OnFwd(OUT_A); 
          OnRev(OUT_C); }
           
     }
      
 }

2回目のチャレンジのために作った車体プログラムです。 チームの頑張りにより、ライントレース性能はその一よりも遥かに向上したため、チームも驚天動地の大健闘を見せてくれました。 ただアームとの連携がうまくいかず、判断、分別という行動にしばしば失敗してしまいます。残念無念。

プログラムその三

#define akarui 45
task main()
{ SetSensor(SENSOR_1, SENSOR_LIGHT);
SetSensor(SENSOR_2, SENSOR_LIGHT);
SetSensor(SENSOR_3, SENSOR_LIGHT);
start A;
start B;}

task A()
{
stop B;    
OnFwd(OUT_A+OUT_C);Wait(50);
Off(OUT_A+OUT_C); Wait (300);
OnRev(OUT_A+OUT_C); Wait(100); 
OnFwd(OUT_A); OnRev(OUT_C); Wait(120);
Off(OUT_A+OUT_C);
OnFwd(OUT_A+OUT_C);Wait(150);Off(OUT_A+OUT_C);
OnFwd(OUT_C); OnRev(OUT_A); Wait(80);
Off(OUT_A+OUT_C);
OnFwd(OUT_A+OUT_C);Wait(230);Off(OUT_A+OUT_C);
OnFwd(OUT_A); OnRev(OUT_C); Wait(120);  
OnFwd(OUT_C); OnRev(OUT_A);                  //箱を取ったら曲線のところまで移動  

while (true)    //曲線に入ったらライントレース
{ 
if ((SENSOR_3> akarui )&& (SENSOR_2  <akarui ) 
&& (SENSOR_1> akarui)) 
{   OnFwd(OUT_A+OUT_C); }
if ((SENSOR_1 < akarui ) && (SENSOR_2 < akarui)
&& (SENSOR_3> akarui))
{   OnFwd(OUT_A); 
OnRev(OUT_C); }
if((SENSOR_3< akarui )&& (SENSOR_2  <akarui )
&& ( SENSOR_1 > akarui) ){ 
OnFwd(OUT_C);        
OnRev(OUT_A);}
if((SENSOR_2 < akarui) && (SENSOR_3< akarui )
&& (SENSOR_1 < akarui )){
start B;         //全部黒いとき(交差点で)taskBに変わる。
}	
if ((SENSOR_1 < akarui ) && 
(SENSOR_3 < akarui )
&& (SENSOR_2  > akarui )){
OnFwd(OUT_C);
OnRev(OUT_A);
}
if((SENSOR_1>akarui)&&(SENSOR_2>akarui)
&& (SENSOR_3<akarui)){
OnFwd(OUT_C);        
OnRev(OUT_A);}
if ((SENSOR_1 < akarui ) &&
(SENSOR_2 > akarui)
&& (SENSOR_3> akarui))
{   OnFwd(OUT_A); 
OnRev(OUT_C); }
}
}
task B()
if((SENSOR_2 < akarui) && (SENSOR_3< akarui )
&& (SENSOR_1 < akarui ))
{stop A;Off(OUT_A+OUT_C);SendMessage(5);
Wait (50);}                        //交差点に入ってtaskBに変わった瞬間にtaskA停止。アームに交差点に到着したメッセージを送る           
ClearMessage();           
until (Message() != 0);
if ( Message() == 1 ) {OnFwd(OUT_A+OUT_C);
Wait (500);OnRev(OUT_A);Wait(150);
Off(OUT_A+ OUT_C);SendMessage(4);Wait(50);}   
if ( Message() == 2 ) {OnFwd(OUT_A+OUT_C);
Wait (250);OnRev(OUT_A);Wait(150);      //色によって1〜3のメッセージが来る。それに従って前進時間が変わる。
Off(OUT_A+ OUT_C);SendMessage(4);Wait(50);}   
if ( Message() == 3 ) {OnFwd(OUT_A+OUT_C);
Wait (150);OnRev(OUT_A);Wait(150);
Off(OUT_A+ OUT_C);SendMessage(4);Wait(50);}  

}

対三回目のチャレンジ用の車体プログラムです。 中川殿のタスクを分けようという新発想、1つ入れることに集中するため、大幅にその二を改良、これによって分別が可能になったのです。 しかし本番では車体が引っかかってしまい、痛恨のリタイヤ。ままならないものです、ああ世知辛い。

中川:2度目も失敗、三度目まであとわずか、最早賭けに出るしかない。もう1個でも入ればいい。とにかく箱をケースまで持って行ければいい。今の状況で、まともにできる方法はこれしかない。そんな思考の基に作りました。結果は見るに耐えませんでしたが。調整不足でした・・・。

アームのプログラムその一

task main()
{ 

          SetSensor(SENSOR_2,SENSOR_TOUCH);
          SetSensor(SENSOR_3, SENSOR_LIGHT);
          ClearMessage();
         
       
         while(SENSOR_2 == 1){
         
         OnRev(OUT_C);Wait(300);
         ClearMessage();           
            until (Message() != 0);  
        if(SENSOR_3< 40){
         
        ClearTimer(0);
            while ( Timer(0) <= 50 ) { SendMessage(1); }
                                    }
      
         
        if(45>SENSOR_3> 40){
         ClearTimer(0);
            while ( Timer(0) <= 50 ) {SendMessage(3); }
                                              }
         if(45<= SENSOR_3){
        
            ClearTimer(0);
            while ( Timer(0) <= 50 ) {SendMessage(2); }}
                                                
          if( Message() == 4) 
          { 
          OnFwd(OUT_C); Wait(300);Off(OUT_C);
          }
          
          if( Message() == 7) { 
          OnFwd(OUT_A); Wait(300);Off(OUT_A);
          }
         repeat(3){
      OnRev(OUT_C); Wait(200);Off(OUT_C);Wait(200);
      }
         
         }        

}
}

アームの試作プログラムです。 アームの下についているタッチセンサに牛乳パックの台があたるとアームが閉じ、色を識別しその旨を通信、車体がかごの前にくるとアームを開く、、予定でした(笑) このプログラムではなぜかアームが開いてくれないのです。摩訶不思議。 whileを二つにしてつかむ命令と識別の命令を別々にしてやるとアームは閉じますが識別、通信してくれませんでした。困った物です。

アームのプログラムその二

task main()
{

         SetSensor(SENSOR_2,SENSOR_TOUCH);
         SetSensor(SENSOR_3, SENSOR_LIGHT);    
            OnRev(OUT_C);Wait(300);Off(OUT_C);  //つかむ

          ClearMessage();           
           until (Message() !=  0);   

     if ( Message() == 4 ) {PlaySound(SOUND_UP) ;  
          
         OnFwd(OUT_C); }             //メッセージが来たら放す。
          
            
           
      if(Message() == 5){
          if(SENSOR_3< 40){
         
        ClearTimer(0);
            while ( Timer(0) <= 50 ) { SendMessage(1); }
                                    }
      
         
        if(45>SENSOR_3> 40){
         ClearTimer(0);
            while ( Timer(0) <= 50 ) {SendMessage(3); } //色に従って送るメッセージが変わる。
                                              }
         if(45<= SENSOR_3){
        
            ClearTimer(0);
            while ( Timer(0) <= 50 ) {SendMessage(2); 
            PlaySound(SOUND_UP) ;}

} }}

対一個用車体プログラムその三のために作られた、立ち位置が自由なのを利用して開始と同時にアームを閉じ、識別するプログラムです。 その一と違ってアームはちゃんとしまります。ただアクションが早いせいか、審判の開始の合図よりも速く動いてしまいました。せっかちですね。 急ごしらえの割にはなかなか実践的なプログラムでした。うむ、秀逸。


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