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

**プログラムその二 (対ライントレース)[#ddd444cf]

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

**プログラムその三 [#qdab9974]

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

**アームのプログラムその一 [#y2223ed6]

 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を二つにしてつかむ命令と識別の命令を別々にしてやるとアームは閉じますが識別、通信してくれませんでした。困った物です。

**アームのプログラムその二 [#af7605e3]

 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