2019a/Member
課題3

目次

ルート

私たちは、
A→M→K→L→K→J→…
というルートでプログラムを書きました。

ルート.png

ロボットについて

ロボットはRIS本体を縦に2つ繋げて、それを水平に対して直角に立てました。
RIS本体を縦に2つ繋げた理由は、通信がうまくできるからです。
それを水平に対して直角に立てた理由は、横にするとロボットが
大きくなってしまうからです。
アームに関しても、アームを回転させることで持ち上げるようにしたのは、
アームをできるだけ小さいスペースで取り付けたかったからです。
なので、完成したロボットは縦には長いが、横はコンパクトです。

全体像.JPG

ロボットの説明

ピンポン玉を掴むパーツ

ピンポン玉をつかむ仕組みは、ピンポン玉をゴムの力を利用して、
アームと一体化させるようにしました。
また、アームが無理やり開こうとするのを制御するため、
白い歯車を使用しました。

ピンポン玉を掴むパーツ2.JPG

ピンポン玉を持ち上げるパーツ

ピンポン玉を持ち上げるパーツは、モーターを2つ使いました。
始めは1つにしていたのですが、力が足りなかったので増やしました。

アームを上げるパーツ.JPG

後輪

後輪は、アームを上げるときの反動で、一時的に後ろに力が加わるので、
それを支えるために取り付けました。
動いているときに摩擦がおきくくなるように、360度回転できるようにしました。

後輪.JPG

プログラムの説明

送信側のプログラム

準備のプログラム

#define OPEN 13       //アームを開くメッセージの番号
#define UP 14         //アームを上げるメッセージの番号
#define FREEZE 15     //何もせず止まるようにするメッセージの番号

#define black 37

//ラインの右側をトレースするサブルーチン
sub intersection_stop_rightside(){  
   ClearTimer(0);                       //最初にタイマーをリセットしておく

   while(FastTimer(0)<30){
      if(SENSOR_2 > black){             //白のラインをトレースしている時
         OnFwd(OUT_C);Off(OUT_A);ClearTimer(0); 
      }else if(SENSOR_2 < black){       //黒のラインをトレースしている時
         OnFwd(OUT_A);Off(OUT_C); 
      }    
   }
   Off(OUT_AC);                         //最後はロボットを停止させて終了する
}

//ラインの左側をトレースするサブルーチン
sub intersection_stop_leftside(){    
   ClearTimer(0);                       //最初にタイマーをリセットしておく
                                                
   while(FastTimer(0)<30){
      if(SENSOR_2 > black){             //白のラインをトレースしている時
         OnFwd(OUT_A);Off(OUT_C);ClearTimer(0);
      }else if(SENSOR_2 < black){       //黒のラインをトレースしている時
         OnFwd(OUT_C);Off(OUT_A); 
      }      
   }
   Off(OUT_AC);                         //最後はロボットを停止させて終了する
}

//交差点で止まるサブルーチン
sub corner_stop(){ 
   ClearTimer(0);                       //最初にタイマーをリセットしておく

   while(FastTimer(0) < 63){
      if(SENSOR_2 < black){             //白のラインをトレースしている時
         OnFwd(OUT_C);Off(OUT_A);ClearTimer(0); 
      }else if(SENSOR_2 > black){       //黒のラインをトレースしている時
         OnFwd(OUT_A);Off(OUT_C);
      }         
   }
   Off(OUT_AC);

   while(SENSOR_2 > black){             //黒のラインをトレースしている時
      OnFwd(OUT_A);OnRev(OUT_C); 
   }
   Off(OUT_AC);                         //最後はロボットを停止させて終了する
}

プログラムの中身

task main()
{
   SetSensor(SENSOR_2,SENSOR_LIGHT);
   ClearTimer(0);
   FastTimer(0);
   ClearMessage();
  
   intersection_stop_rightside();        //ヘアピンカーブで停止する
   corner_stop();                 

   OnFwd(OUT_A);OnRev(OUT_C);Wait(180);  //反転する

   SendMessage(OPEN);                    //アームを開けるメッセージを送信する

   OnFwd(OUT_AC);Wait(100);              //ピンポンボールまで進む  

   ClearMessage();                       //アームを閉じる   

   OnFwd(OUT_C);OnRev(OUT_A);Wait(130);  //箱の正面まで回転 
   Off(OUT_AC); 

   SendMessage(UP);                      //アームを上げるメッセージを送信する

   OnFwd(OUT_AC);Wait(100);              //箱まで進む   

   ClearMessage();                       //アームを下げる

   SendMessage(OPEN);                    //アームを開くメッセージを送信する

   SendMessage(UP);                      //アームを上げるメッセージを送信する

   OnRev(OUT_AC);Wait(100);              //箱から離れる
   Off(OUT_AC);

   ClearMessage();                       //アームを下げる
}

受信側のプログラム

準備のプログラム

#define OPEN 13       //アームを開くメッセージの番号
#define UP 14         //アームを上げるメッセージの番号
#define FREEZE 15     //何もせず止まるようにするメッセージの番号

#define open(t) OnFwd(OUT_B);Wait(t);OnRev(OUT_B);Wait(5); //アームを開く番号
#define up(t) OnFwd(OUT_AC);Wait(t);                       //アームを上げる番号

プログラムの中身

task main()
{
   ClearMessage();

   while(true){                   
      ClearMessage();  

      while(Message() == OPEN){     //OPENを受信したとき
         open(300);                 //3秒開く
      }
      Off(OUT_AC);                  //処理が終わったら停止
      while(Message() == UP){       //UPを受信したとき
         up(300);                   //3秒開く
      }
      Off(OUT_AC);                  //処理が終わったら停止
   }
}

連続して黒になる時間の計り方

今回は、全てのサブルーチンが、連続して黒になる時間を
計っています。
なので、全てのサブルーチンに、このパラグラフの
一番最後に書かれているプログラムの構造が適応されています。
したがって、そのプログラムについて説明したいと思います。

  1. まず初めにタイマーをリセットする。(ClearTimer(0);)
  2. タイマーが[時間]未満なら、whileループが実行される。
  3. ライトセンサーが白の上にいるときは、処理後にタイマーをリセットする。
  4. ライトセンサーが黒の上にいるときは、処理後にタイマーがリセットされず、
    whileの条件のFastTimer(0)に代入される。
    sub [サブルーチン名]{
       ClearTimer(0);                 //1番、4番
    
       while(FastTimer(0) < [時間]){  //2番
          if(SENSOR_2 > black){                      //白のラインをトレースしている時
             [プログラム1]
    
             ClearTimer(0);           //3番
          }else if(SENSOR_2 < black){                //黒のラインをトレースしている時
             [プログラム2]
          }
          [プログラム3]
       }
    }

プログラム全体

送信側

#define OPEN 13       //アームを開くメッセージの番号
#define UP 14         //アームを上げるメッセージの番号
#define FREEZE 15     //何もせず止まるようにするメッセージの番号

#define black 37

//ラインの右側をトレースするサブルーチン
sub intersection_stop_rightside(){  
   ClearTimer(0);                       //最初にタイマーをリセットしておく

   while(FastTimer(0)<30){
      if(SENSOR_2 > black){             //白のラインをトレースしている時
         OnFwd(OUT_C);Off(OUT_A);ClearTimer(0); 
      }else if(SENSOR_2 < black){       //黒のラインをトレースしている時
         OnFwd(OUT_A);Off(OUT_C); 
      }    
   }
   Off(OUT_AC);                         //最後はロボットを停止させて終了する
}

//ラインの左側をトレースするサブルーチン
sub intersection_stop_leftside(){    
   ClearTimer(0);                       //最初にタイマーをリセットしておく
                                                
   while(FastTimer(0)<30){
      if(SENSOR_2 > black){             //白のラインをトレースしている時
         OnFwd(OUT_A);Off(OUT_C);ClearTimer(0);
      }else if(SENSOR_2 < black){       //黒のラインをトレースしている時
         OnFwd(OUT_C);Off(OUT_A); 
      }      
   }
   Off(OUT_AC);                         //最後はロボットを停止させて終了する
}

//交差点で止まるサブルーチン
sub corner_stop(){ 
   ClearTimer(0);                       //最初にタイマーをリセットしておく

   while(FastTimer(0) < 63){
      if(SENSOR_2 < black){             //白のラインをトレースしている時
         OnFwd(OUT_C);Off(OUT_A);ClearTimer(0); 
      }else if(SENSOR_2 > black){       //黒のラインをトレースしている時
         OnFwd(OUT_A);Off(OUT_C);
      }         
   }
   Off(OUT_AC);

   while(SENSOR_2 > black){             //黒のラインをトレースしている時
      OnFwd(OUT_A);OnRev(OUT_C); 
   }
   Off(OUT_AC);                         //最後はロボットを停止させて終了する
}


task main()
{
   SetSensor(SENSOR_2,SENSOR_LIGHT);
   ClearTimer(0);
   FastTimer(0);
   ClearMessage();
  
   intersection_stop_rightside();        //ヘアピンカーブで停止する
   corner_stop();                 

   OnFwd(OUT_A);OnRev(OUT_C);Wait(180);  //反転する

   SendMessage(OPEN);                    //アームを開けるメッセージを送信する

   OnFwd(OUT_AC);Wait(100);              //ピンポンボールまで進む  

   ClearMessage();                       //アームを閉じる   

   OnFwd(OUT_C);OnRev(OUT_A);Wait(130);  //箱の正面まで回転 
   Off(OUT_AC); 

   SendMessage(UP);                      //アームを上げるメッセージを送信する

   OnFwd(OUT_AC);Wait(100);              //箱まで進む   

   ClearMessage();                       //アームを下げる

   SendMessage(OPEN);                    //アームを開くメッセージを送信する

   SendMessage(UP);                      //アームを上げるメッセージを送信する

   OnRev(OUT_AC);Wait(100);              //箱から離れる
   Off(OUT_AC);

   ClearMessage();                       //アームを下げる
}

受信側

#define OPEN 13       //アームを開くメッセージの番号
#define UP 14         //アームを上げるメッセージの番号
#define FREEZE 15     //何もせず止まるようにするメッセージの番号

#define open(t) OnFwd(OUT_B);Wait(t);OnRev(OUT_B);Wait(5); //アームを開く番号
#define up(t) OnFwd(OUT_AC);Wait(t);                       //アームを上げる番号


task main()
{
   ClearMessage();

   while(true){                   
      ClearMessage();  

      while(Message() == OPEN){     //OPENを受信したとき
         open(300);                 //3秒開く
      }
      Off(OUT_AC);                  //処理が終わったら停止
      while(Message() == UP){       //UPを受信したとき
         up(300);                   //3秒開く
      }
      Off(OUT_AC);                  //処理が終わったら停止
   }
}

感想

ロボットは小さくてバランスも良く、動いたときに
ピンポンボールや箱に当たりにくくできてよかったと思った。
しかし、ロボット2台を使って送受信を行うということもあり、
プログラムに時間がかかった。
1台から2台に代わるだけで、プログラムがグンと難しくなったように感じた。


添付ファイル: file後輪.JPG 17件 [詳細] fileアームを上げるパーツ.JPG 19件 [詳細] fileルート.png 22件 [詳細] file全体像.JPG 27件 [詳細] fileピンポン玉を掴むパーツ2.JPG 18件 [詳細] fileピンポン玉を掴むパーツ1.JPG 6件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-08-13 (火) 21:01:10