2019a/Member 目次

課題3

フィールドの説明

ruuto3.png

基本ルール

基本得点の計算方法

得点の目安:

作戦

ルート

自分たちは容器内のボールで点数を獲得しようとした。そのためにまず容器ごと掴み、ボールをロボット内に回収、そして移動してボールを別の容器に入れるという作戦を考えた。ロボットを動かすルートは以下のようにした。

ruuto.png

ロボットの説明

比較的大型のロボットであるので多少カーブが苦手になるが四輪の二輪駆動の車体である。前輪の少し前にライントレースように光センサーをつけている。

image1.jpeg

まず、手前にあるアームの開いた部分で容器をつかめるようになっている。容器をつかんだままアームを持ち上げ、アームをレールにしてボールを転がし車体にボールを回収する。

image5a.jpg

ここで問題となったことはアームが重く簡単に持ち上がらないということだ。そこでギアをモーターとアームの間に挟み少ない力で重いものを動かせるように改良した。下の画像がそのギアの部分である。

image2.jpeg

最後に集めたボールを少ない手間で別の容器に移すため、ボールを回収する部分の底を斜めにすることで蓋を開けるだけで勝手に転がるようになっている。また、ボールを回収したケースの出口の高さは所定の容器の高さより高くなっているのでボールを移しやすくなっている。

image4a.jpg

プログラム

マスター側にラインセンサーと車輪のためのモーター2つ、スレーブ側にアーム用のモーター3つをつけている。主にマスター側で移動を担当し、スレーブ側でアームの動作の役割分担を行っている。

このメリットとしてアーム動作と車体移動を明確に分けることができ、移動中にアームが動いてしまうといった誤作動を防止してくれる。

マクロ

マスター側(マクロ)

#define CONN 1
#define on1 1
#define on2 2
#define on3 3

#define zenshin OnFwd(OUT_BC,60); //前進
#define koushin OnFwd(OUT_BC,-60); //後進
#define migi OnFwd(OUT_B,-70);OnFwd(OUT_C,40); //右回転 
#define hidari OnFwd(OUT_B,40);OnFwd(OUT_C,-70); //左回転
#define mi OnFwd(OUT_C,40);Off(OUT_B);//右に進む
#define hi OnFwd(OUT_B,40);Off(OUT_C); //左に進む
#define tomaru Off(OUT_BC); //ストップ
long A=0;//コーナーで止まる時間を計測する変数
long B=0;//ライントレースしている時間を計測する変数

スレーブ側(マクロ)

#define on1 1
#define on2 2
#define on3 3

#define tomaru Off(OUT_AB);Wait(100);//ストップ

サブルーチン

void re_stop_corner(){
   SetSensorLight(S1);
   while(A<400){//角のタイマーが400になると繰り返し終わり
       if(SENSOR_1>40){
           hi;//白の時左へ
           A=0;//角のタイマーをリセット         
           B=B+1;ライントレース時間追加
                      }else{
                               mi;//黒の時右へ
                               A=A+1;//角のタイマーに1追加
                               B=B+1;
                              
                                }
                  }
   tomaru;//停止
   Wait(1000);
   B=0;
                  }//コーナーで止まるライントレース(ラインの右側を進む)
void re_cross_line(){
   SetSensorLight(S1);

       if(SENSOR_1>40){
           hi;//白の時左へ
           B=B+1;
                      }else{
                               mi;//黒の時右へ
                               B=B+1;
                                }
                          }//コーナーを直進するライントレース(ラインの右側を進む)

メインプログラム

マスター側(メイン)

task main()
{
  SetSensorLight(S1);


while(B<8000){//ライントレースをしている時間をはかるタイマーが8000未満の時
       re_cross_line();//ライントレース、交差点渡る
                   }

   while(B>=8000){//8000以上の時
       re_stop_corner();
                    }//ライントレース、交差点止まる
  tomaru;
    Wait(500);
  koushin;
   Wait(1600);
  mi;
    Wait(300);
  zenshin;
   Wait(1300);  
  migi;
   Wait(1300);
  tomaru;
   Wait(100);
  koushin;
   Wait(300);
  tomaru;
   Wait(100);
  zenshin;
   Wait(300);
  tomaru;
    Wait(100);//容器をつかむ位置に移動するための動作

(アームが移動中に容器に当たらないようアームは上に上げた状態でスタートする)

SendRemoteNumber(CONN,MAILBOX1,on2);//スレーブにアームを下げる指示を出す
 Wait(18000);
  zenshin;//容器の前まで移動
   Wait(300);
   tomaru;
    Wait(100);
  SendRemoteNumber(CONN,MAILBOX1,on1); //容器をつかむ、アームをあげる(ここでボールが転がり回収部分に回収)、アームを下げる動作の指示
   Wait(30000);
OnFwd(OUT_B,50);OnFwd(OUT_C,-80); 
     Wait(400);
   tomaru;
    Wait(100);
   koushin;
      Wait(1500); 
   tomaru;
    Wait(100);//空の容器に回収部分のボール出口が来るように移動
   SendRemoteNumber(CONN,MAILBOX1,on3);//ボールを止めていた蓋をあげて、ボールを空の容器に移す
    Wait(1000);
 tomaru;
  Wait(100);
}

スレーブ側(メイン)

task main()
{
 int msg1;
 int msg2;

  while(1){
      ReceiveRemoteNumber(MAILBOX1,true,msg1);
      if(msg1==on1){
          OnFwd(OUT_B,50);
          Wait(1500);//容器をつかむ
          tomaru;
          OnFwd(OUT_A,-100);アームをあげる
          Wait(20000);//
   
          OnFwd(OUT_A,100);
          Wait(20000);//アームを下げる
          tomaru;
          OnFwd(OUT_B,-50);
          Wait(1500);//容器を放す
          tomaru;
   
          msg1=100;//msg1に1,2,3以外の値を代入し、ifの外へ
   }
  
   if(msg1==on3){
       OnFwd(OUT_C,-30);
       Wait(200);//蓋を開ける動作
       
       msg1=100;
}

    if(msg1==on2){
        OnFwd(OUT_A,100);
        Wait(20000);//アームを下げる動作
        
       msg1=100;
       }
   }
}

考察

ロボコン本番であと少しで計画通りボールが回収できそうというところまでいったが成功しなかったことがとても悔しい。

容器内のボールしか拾えないロボットとなってしまったが容器内のボールを回収すると言う点ではアイデアは良かったと思う。

問題点は、上でも少し触れたがアームの重量にある。容器をつかむなどで必要な要素をアームに取り込むとどうしてもどんどん重くなってしまった。ギアを活用してアームを持ち上げることに成功したことは良かったが改善の余地はまだあるとは思う。

今回のロボティクス入門ゼミでロボットとプログラミングをさわり、機械の信頼できる面とそうでない面の両方見ることができて、不安定な部分に苦戦はしたが面白かった。


添付ファイル: fileimage4a.jpg 108件 [詳細] fileimage2.jpeg 128件 [詳細] fileimage5a.jpg 117件 [詳細] fileimage1.jpeg 141件 [詳細] fileruuto.png 101件 [詳細] fileruuto3.png 112件 [詳細]

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