[[2018a/Member]]
目次
#contents

*課題 [#q37cb201]
缶を指定された場所に運ぶロボットを作り、プログラミングする。
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2018a%2FMission3&openfile=2018a-mission3.png

**フィールド [#x922fd49]
-フィールドは課題2で使用した紙を使用する。
-2種類の空き缶(Aタイプ,Bタイプ)をそれぞれ3個づつ用意し、円XにABA、円YにBABとなるように3段づつ積み上げる。
-空き缶には色をつけたり文字や記号を書いてもよい。あるいは周囲に紙を張ってもよい。


**ルール [#maaab090]
-競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。
-図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。
-Aタイプの空き缶を円Y内に、Bタイプの空き缶を円X内に運ぶ。
-開始の合図から5秒以内にスタートボタンを押す作業を完了すること。
-競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。
-途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。

*ロボット [#w3dc3fcb]
**全体 [#b3533487]
#ref(ロボ3.1.jpg)
-全体的にバランスが悪くなってしまった。
-そのままだと重心が前にいきすぎてしまうので、後ろ使わなくなった電池を積んでいる。(写真撮り忘れ)

**下の缶 [#a5aedd15]
#ref(ロボ3.2.jpg)
-このアームは下の缶を固定するためだけのもの
-ギアがなかなか噛み合わずギアの大きさの調整が少し大変だった。

**真ん中の缶 [#t0f3cbfe]
#ref(ロボ3.4.jpg)
-前に付いているタイヤで真ん中の缶を押し出す構造。
#ref(ロボ3.5.jpg)
-このギアが回って前後に動く仕組み。
-ギアとモータが直で繋がっているためプログラムでパワーを抑えないと思いっきり動いてしまう。

**上の缶 [#p61523dc]
#ref(ロボ3.3.jpg)
-上の缶を左のキャタピラで押さえて、右のキャタピラを動かして缶を上に上げる仕組み。
-最初は1番下から上に上げようとしたが、キャタピラの長さ的に無理だった。

*プログラム [#e72e0e22]
**下のRCX [#x901f19f]
 #define LOWPOWER 1
 #define HIGHPOWER 6
 #define B 39    //黒
 #define W 40    //白

 #define turn_r 
 OnFwd(OUT_A);OnRev(OUT_C);SetPower(OUT_AC,HIGHPOWER); //右旋回
 #define turn_l 
 OnFwd(OUT_C);OnRev(OUT_A);SetPower(OUT_AC,HIGHPOWER);   //左旋回
 #define go 
 OnFwd(OUT_AC);SetPower(OUT_AC,LOWPOWER);       
  //直進
 #define catch_sita Off(OUT_B);SetPower(OUT_B,LOWPOWER);OnFwd(OUT_B);  //下の缶を掴む
 #define release Off(OUT_B);SetPower(OUT_B,LOWPOWER);OnRev(OUT_B);  //下の缶を放す
 #define stay Off(OUT_AC); //止まる

 //通信用定義
 #define CATCH_UE 11   //上の缶を掴ませる
 #define STAY 12     //止まらせる
 #define RELEASE 13   //上の缶を放させる
 #define GO_TRACE 14&  //トレースに戻る
 #define PUSH 15   //真ん中の缶を落とさせる
 #define DOWN 16   //上の缶を下ろさせる


 task main(){
 SetSensor(SENSOR_1,SENSOR_LIGHT);
 SetSensor(SENSOR_3,SENSOR_LIGHT);
 ClearMessage();

 int blackN = 0;  //T字路の判断
 while(blackN <= 1){
 if(SENSOR_1 >= WHITE && SENSOR_3>= WHITE) 
 //トレース開始
     go;
  }else if(SENSOR_3 <= BLACK && blackN == 0){   //曲がり角判断
    go;Wait(50);
    stay;Wait(50);
    turn_r;
    Wait(125);
 blackN++;   //黒に入った回数をカウント

  }else if(SENSOR_3 <= B && blackN == 1){//T字路判断
    stay;
 blackN++;
 }
   stay;Wait(30);   //一時停止
 }
 catch_sita;Wait(60);Off(OUT_B);  //下の缶を掴む

 SendMessage(CATCH_UE);Wait(800); //上の缶を掴む命令を出す

 while(Message() == GO_TRACE) 
 {SendMessage(STAY);
  stay;Wait(50);
  OnFwd(OUT_AC);Wait(300);stay;
  ClearMessage();
  }
 }
**上のRCX [#q4b0578f]
 
#define LOWPOWER 2
 #define LOWPOWER 2
 #define catch_ue OnFwd(OUT_C);SetPower(OUT_C,LOWPOWER);Wait(100);    //上の缶を掴む
 #define release OnRev(OUT_C);SetPower(OUT_C,LOWPOWER);Wait(100);Off(OUT_C);  //上の缶を放す
 #define lift_up OnFwd(OUT_A);SetPower(OUT_A,LOWPOWER);Wait(100);Off(OUT_A);   //上の缶を上げる
 #define lift_down OnRev(OUT_A);SetPower(OUT_A,LOWPOWER);Wait(200);Off(OUT_A);   //上の缶を下ろす
 #define push OnFwd(OUT_B);SetPower(OUT_B,LOWPOWER);Wait(100);Off(OUT_B);   //真ん中の缶を落とす
 #define reload OnRev(OUT_B);SetPower(OUT_B,LOWPOWER);Wait(100);Off(OUT_B);  //缶を落とす機構を戻す
 #define stay Off(OUT_AC);  //静止
 //通信用
 #define CATCH_UE 11  //上の缶を持ち上げる
 #define STAY 12      //静止する
 #define RELEASE 13   //上の缶を放す
 #define GO_TRACE 14  //トレース動作に戻させる
 #define PUSH 15&     //真ん中の缶を落とす
 #define LIFT_DOWN 16  //上の缶を下ろす

#define grip_ue OnFwd(OUT_C);SetPower(OUT_C,LOWPOWER);Wait(100);&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; /*上の缶を掴む*/
#define release OnRev(OUT_C);SetPower(OUT_C,LOWPOWER);Wait(100);Off(OUT_C);&#160;&#160;&#160; &#160;&#160;&#160; /*上の缶を放す*/
#define lift_up OnFwd(OUT_A);SetPower(OUT_A,LOWPOWER);Wait(100);Off(OUT_A);&#160;&#160;&#160; &#160;&#160;&#160; /*上の缶を上げる*/
#define lift_down OnRev(OUT_A);SetPower(OUT_A,LOWPOWER);Wait(200);Off(OUT_A);&#160;&#160;&#160; /*上の缶を下ろす*/
#define push OnFwd(OUT_B);SetPower(OUT_B,LOWPOWER);Wait(100);Off(OUT_B);&#160;&#160;&#160; &#160;&#160;&#160; /*真ん中の缶を落とす*/
#define reload OnRev(OUT_B);SetPower(OUT_B,LOWPOWER);Wait(100);Off(OUT_B);&#160;&#160;&#160; &#160;&#160;&#160; /*缶を落とす機構を戻す*/
#define stay Off(OUT_AC);&#160;&#160;&#160; &#160;&#160;&#160; /*静止*/&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160;&#160;
&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160;&#160;
/*通信用*/
#define GRIP_UE 11&#160;&#160;&#160; &#160;&#160;&#160; /*上の缶を持ち上げる*/
#define STAY 12&#160;&#160;&#160; &#160;&#160;&#160; /*静止する*/
#define RELEASE 13&#160;&#160;&#160; &#160;&#160;&#160; /*上の缶を放す*/
#define GO_TRACE 14&#160;&#160;&#160; &#160;&#160;&#160; /*トレース動作に戻させる*/
#define PUSH 15&#160;&#160;&#160; &#160;&#160;&#160; /*真ん中の缶を落とす*/
#define LIFT_DOWN 16&#160;&#160;&#160; &#160;&#160;&#160; /*上の缶を下ろす*/
 task main(){
 ClearMessage();
 int CT1=0;  //缶のタワー1に対する動作の区別
 while(CT1 == 0){
 if(Message()==CATCH_UE) 
 {grip_ue;    //上の缶を掴む
    stay;Wait(50);
    CT1++;  //缶のタワー1に対する操作終わり
   }else{
         stay;
        }
   }
 lift_up;    //上の缶を持ち上げる 
 stay;Wait(50);
 push;       //缶を押し倒す
 Wait(50);
 reload;     //落とすのに使った機構を戻す
 stay;Wait(50);
 lift_down;   //上の缶を下ろす
 SendMessage(GO_TRACE); //トレース再開
 }

task main(){
ClearMessage();
int CT1=0;&#160;&#160;&#160; &#160;&#160;&#160; /*缶タワー1に対する動作の区別に使用*/
&#160;&#160;&#160; while(CT1 == 0){
&#160;&#160;&#160; &#160;&#160;&#160; if(Message()==GRIP_UE){&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160;&#160;
&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; grip_ue;&#160;&#160;&#160; &#160;&#160;&#160; /*上の缶を掴む*/
&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; stay;Wait(50);
&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; CT1++;&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; /*缶タワー1に対する操作の終了*/

&#160;&#160;&#160; &#160;&#160;&#160; }else{
&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; stay;&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160;&#160;

&#160;&#160;&#160; &#160;&#160;&#160; }
&#160;&#160;&#160; }

&#160;&#160;&#160; lift_up;&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; /*上の缶を持ち上げる*/&#160;&#160;&#160;&#160;
&#160;&#160;&#160; stay;Wait(50);

&#160;&#160;&#160; push;&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; /*缶を押し倒す*/
&#160;&#160;&#160; Wait(50);
&#160;&#160;&#160; reload;&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; /*落とすのに使った部分を戻す*/
&#160;&#160;&#160; stay;Wait(50);

&#160;&#160;&#160; lift_down;&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; /*上の缶を下ろす*/

&#160;&#160;&#160; SendMessage(GO_TRACE);&#160;&#160;&#160; &#160;&#160;&#160; /*トレースを再開してもらう*/
}



*まとめ [#t9cfe28c]
**結果 [#l9a5b72b]
-練習では確実に3点取れるようになっていたのだが、本番では思うように動かず0点だった。
**反省点 [#s14d4cb2]
-ロボットをもっとコンパクトにできれば良かった。
-ロボットを作る時間をかけすぎてしまって、プログラミングする時間があまりなかった。
-RCX同士の通信をもっと上手くできればよかった。
**感想 [#saffc580]
-課題1、2で習ったことを生かしてプログラミングできた気がするが、なかなか上手くいかなかった。
-ここで学んだプログラミングを少しでもこれからに生かしたい。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS