[[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);            /*上の缶を掴む*/ #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 GRIP_UE 11        /*上の缶を持ち上げる*/ #define STAY 12        /*静止する*/ #define RELEASE 13        /*上の缶を放す*/ #define GO_TRACE 14        /*トレース動作に戻させる*/ #define PUSH 15        /*真ん中の缶を落とす*/ #define LIFT_DOWN 16        /*上の缶を下ろす*/ 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;        /*缶タワー1に対する動作の区別に使用*/     while(CT1 == 0){         if(Message()==GRIP_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);        /*トレースを再開してもらう*/ } *まとめ [#t9cfe28c] **結果 [#l9a5b72b] -練習では確実に3点取れるようになっていたのだが、本番では思うように動かず0点だった。 **反省点 [#s14d4cb2] -ロボットをもっとコンパクトにできれば良かった。 -ロボットを作る時間をかけすぎてしまって、プログラミングする時間があまりなかった。 -RCX同士の通信をもっと上手くできればよかった。 **感想 [#saffc580] -課題1、2で習ったことを生かしてプログラミングできた気がするが、なかなか上手くいかなかった。 -ここで学んだプログラミングを少しでもこれからに生かしたい。