2019a/member
*課題について
[[2019a/Member]]
*課題3 [#m3326234]
#ref(sen.png)
**ルール [#y997dfa2]
競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。開始の合図から5秒以内にスタートボタンを押す作業を完了すること。競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。 競技終了後、ロボットが、ゴールのプラ容器に触れていてはいけない。競技終了時、もともと玉が入っていたプラ容器が、ゴールのプラ容器に触れていてはいけない。
**得点 [#ob6954dd]
***基本点 [#pf345ac7]
プラ容器内の玉を1個運べば8点。二つとも運べば20点。
L地点とL'地点の玉をどちらか1個運べば4点、2個とも運べば12点。
競技終了後、ゴールのプラ容器が完全に円から出しまった場合、もとの基本点の1/4を減点。
競技終了後、ゴールのプラ容器の半分以上が円から出ていれば、もとの基本点の3/4を減点。
競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれば、もとの基本点の1/2を減点。
競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれば、もとの基本点の1/2を減点。
競技終了後、ゴールのプラ容器にロボットが触れていれば、もとの基本点の1/4を減点。
***技術点 [#wa245e2e]
以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(5チーム)が20点満点で採点し、その平均点を求める。 得点の目安:
玉を探し取りにいくまでの動作 (3点)
玉を掴む動作 (3点)
玉をを運ぶ動作 (2点)
玉を容器の中に入れる動作 (2点)
2台のRIS、NXT、EV3の連携の良さ(2点)
自立型のロボットとしての形や動作の美しさ、斬新さ(2点)
その他 (3点)

*ロボットについて [#x2f60dff]
初めはRIS本体を2個使ってロボットを作っていたがロボットの構造的にアーム部分を持ち上げることができなかったのでもう一度作り直すことにした。時間的に無理があったのでRIS本体を1個使ってロボットを作った。

**1つ目のロボットについて [#i8630b15]
***失敗した原因 [#ka5af21f]
#ref(arm (2).jpeg)
・長い棒を6本使って平行四辺形を作り,各棒の接続部分は可動できるものとすることでアームを上下させる機構となる.この機構は一つの棒の下の方の先端に歯車を取り付け,モーターと嚙合わせることで動かすことができると思っていたが,アームの開閉を行うためのモーターが予想以上に重かったため,平行四辺形の機構を動かすことができなかった.原因としては平行四辺形の機構を動かすためのモーターのつける位置が悪かった,モーター1個で動かそうとしていたことが悪かった.これが一つ目のロボットがうまくいかなかったことの原因である.
***工夫した点 [#e383e09f]
拾ったボールを持ち運べるようにして動作を少なくすることでプログラムを短くし,ミスを減らそうとした.ボールを持ち運ぶために可動式のボールの受けを作った.(下図参照)
1つのモーターで水平方向の動きをすることでボールを受けに入れやすくなる.もう一つのモーターで受け本体を傾ける動作をすることでためたボールを容器の中に入れることができる.
#ref(uke2.jpeg)
***ボールのつかみ方 [#ec533efa]
ボールが置かれているところまで機体を近づける→アームを下す→ボールをつかむ→アームを上げる→ボールの受けを動かす→ボールを離して受けにボールを入れる→受けをもとの位置に動かす

**2つ目のロボットについて [#n61285c5]
1つ目のロボットからボール受けの機構を取り外し,アームを上下させるための平行四辺形の機構を動かなくし,RIS本体を一つにしたものである.特に工夫した点がなくなってしまった.
#ref(honntai2.jpg)

*プログラムについて [#fbb47262]
**一つ目のプログラム [#p5a54677]
***マスター [#h9179e1b]
 int white_time=15;                                         //白の時間の上限を0,15秒に定義する。
 #define migisenkai   OnFwd(OUT_A);  OnFwd(OUT_C); 
 #define usetsu       OnFwd(OUT_C);  Off(OUT_A);
 #define chokushin    OnFwd(OUT_A);  OnRev(OUT_C);
 #define sasetsu      Off(OUT_A);    OnRev(OUT_C);
 #define hidarisenkai OnRev(OUT_A);  OnRev(OUT_C);
 #define koutai       OnRev(OUT_A);  OnFwd(OUT_C);
 #define tsukamu 201                    //赤外線通信に使う数字を定義する。
 #define tomaru 202                    //赤外線通信に使う数字を定義する。
 sub follow_line()
 {
   SetSensor(SENSOR_2,SENSOR_LIGHT);            //MからKまでライントレースするにあたって機体が重いため、あまり良く機体が曲がらないので1つ目のカーブを曲がるように明るさの数値の区切りを大雑把にした。また2つ目のカーブは急カーブなのでこのプログラムでは曲がれない。なので白の数値が一定時間観測されたときライントレースをやめるようにすることで急カーブのところで機体が止まるようにした。          
     while(FastTimer(0)<white_time){
        if(SENSOR_2>=43){
           migisenkai 
        }else if((SENSOR_2>=38)&&(SENSOR_2<43)){
           chokushin ClearTimer(0);
        }else if(SENSOR_2<38){
           hidarisenkai ClearTimer(0);
         }
    }
 Off(OUT_AC);
 Wait(100);
 ClearTimer(0);
 }
 task main(){
    SetPower(OUT_AC,7);                                 //機体が重かったため、本体を動かすタイヤのモーターの出力を最大にした。            
    follow_line();                     
    follow_line();
    migisenkai Wait(60); Off(OUT_AC); Wait(100);      
    chokushin Wait(100); Off(OUT_AC); Wait(100);
    SendMessage(tsukamu);
    Message() == tomaru;
  }
一つの球を掴むところまでしか作れなかった。
***スレーブ [#a894cbad]

 #define tsukamu 201
 #define tomaru 202
 task main()
 {
    SetPower(OUT_AC,1);              //受けを動かす機構とアームの開閉のモーターの出力を最小にした。
    SetPower(OUT_B,7);              //アームを持ち上げるモーターの出力を最大にした。
  ClearMessage();
     until (Message() == tsukamu);
     OnFwd(OUT_B);Wait(20);Float(OUT_B);Wait(100);  //アームを下ろす
     OnRev(OUT_C);Wait(20);Float(OUT_C);Wait(100);  //アームでボールを掴む
     OnRev(OUT_B);Wait(150);Float(OUT_B);Wait(100);  //アームを上げる
     OnRev(OUT_A);Wait(70);Float(OUT_A);Wait(100);  //受けを動かす
     OnFwd(OUT_C);Wait(20);Float(OUT_C);Wait(100);  //ボールを離し、受けにボールを入れる。
     OnFwd(OUT_A);Wait(15);Off(OUT_A);Wait(100);   //受けをもとの位置に戻す。
     SendMessage(tomaru);
   }
**2つ目のプログラム [#t16fd945]

 int black_time=30;
 #define migisenkai   OnFwd(OUT_A);  OnFwd(OUT_C); 
 #define usetsu       Off(OUT_A);  OnFwd(OUT_C);
 #define chokushin    OnRev(OUT_A);  OnFwd(OUT_C);
 #define sasetsu      OnRev(OUT_A);    Off(OUT_C);
 #define hidarisenkai OnRev(OUT_A);  OnRev(OUT_C);
 #define koutai       OnFwd(OUT_A);  OnRev(OUT_C);
 sub follow_line2()
 {
  SetSensor(SENSOR_2,SENSOR_LIGHT);
     while(FastTimer(0)<black_time){
        if(SENSOR_2<33){
           migisenkai
        }else if((SENSOR_2>=33)&&(SENSOR_2<36)){
           usetsu ClearTimer(0);
        }else if((SENSOR_2>=36)&&(SENSOR_2<40)){
           chokushin ClearTimer(0);
        }else if((SENSOR_2>=40)&&(SENSOR_2<43)){
           sasetsu ClearTimer(0);
        }else if(SENSOR_2>=43){
           hidarisenkai ClearTimer(0);
         }
     }
 Off(OUT_AC);
 Wait(100);
 ClearTimer(0);
 }

 task main(){
    SetPower(OUT_AC,7);
    follow_line2();                                  
    follow_line2();                //MからKまでライントレースするときの二個目の急カーブで止まる。

    migisenkai Wait(75); Off(OUT_AC); Wait(100);
    chokushin;                  
    Wait(25);
    Off(OUT_AC);
    Wait(100);                                    //球の入ったカップの方向に機体を向ける

    OnRev(OUT_B);
    Wait(36);
    Off(OUT_B);
    Wait(100);                  //球を掴む

    migisenkai;
    Wait(60);
    Off(OUT_AC);
    Wait(100);                  //機体の向きを真横に向ける

    chokushin;
    Wait(240);
    Off(OUT_AC);
    Wait(100);                 //もう一つのカップのところまで動かす。

    migisenkai;
    Wait(75);
    Off(OUT_AC);
    Wait(100);                 //機体をカップの方に向ける

    OnFwd(OUT_B);                              
    Wait(50);
    Off(OUT_B);                                 //ボールを離してカップにボールを入れる。
     }
一つの球をいれるところまでしかかけなかった。

*まとめ [#ra92a0bf]
今回はロボットの設計ミスに早い段階で気づけず、ある程度プログラムを作った段階で気づいたので時間的に無理があり完成させることはできず、悔しかった。世の中に出回っているロボットの完成度はとても高いなとこのゼミを通して感じた。技術者になる場合プログラミングの能力は必須であると思うので、少しだとしてもプログラミングの能力を身につけられたいい機会だと思った。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS