目次
#contents

*課題について [#z31d1a0c]

**課題の詳細 [#j3756556]
ボールを運ぶためのロボットを作成し、ボールを運搬して所定の容器の中に入れる。
#ref(2019a/Member/Gouki/Mission3/map3.png,100%);
**フィールドの説明 [#x07bc6d6]
-フィールドは課題2で使用した紙を使用する。
-生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片方に玉を2個入れる。
-残りの2個の玉は課題2と同じ位置に置く。その際、ゴムタイヤやプレートの上に置いてもよい。
-プラ容器には色をつけたり文字や記号を書いてもよい。
-プラ容器は両面テープ等でフィールドに固定してもよい。
-2枚の紙の境界にはそれぞれ幅1cm、合計2cmの黒線を描いてもよい。

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

**基本特典の計算方法 [#v3e9c93a]
-プラ容器内の玉を1個運べば8点。二つとも運べば20点。
-L地点とL'地点の玉をどちらか1個運べば4点、2個とも運べば12点。
-競技終了後、ゴールのプラ容器が完全に円から出しまった場合、もとの基本点の1/4を減点。
-競技終了後、ゴールのプラ容器の半分以上が円から出ていれば、もとの基本点の3/4を減点。
-競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれば、もとの基本点の1/2を減点。
-競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれば、もとの基本点の1/2を減点。
-競技終了後、ゴールのプラ容器にロボットが触れていれば、もとの基本点の1/4を減点。

**技術展の計算方法 [#t74989b1]
以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(5チーム)が20点満点で採点し、その平均点を求める。 得点の目安:
-玉を探し取りにいくまでの動作 (3点)
-玉を掴む動作 (3点)
-玉をを運ぶ動作 (2点)
-玉を容器の中に入れる動作 (2点)
-2台のRIS、NXT、EV3の連携の良さ(2点)
-自立型のロボットとしての形や動作の美しさ、斬新さ(2点)
-その他 (3点)


*ロボットについて [#dc407bb5]
私たちのロボットはボールを一つずつ運搬出来るようなロボットを作成しました。~
そのためきちんと小回りがきくようにするために、コンパクトな形に仕上げしました。
#ref(2019a/Member/Gouki/Mission3/みっしよん3_190814_0005.jpg,15%);
#ref(2019a/Member/Gouki/Mission3/みっしよん3_190814_0004.jpg,15%);
#ref(2019a/Member/Gouki/Mission3/みっしよん3_190814_0003.jpg,15%);


**本体部分 [#rfb9cbf5]
なるべく小さくコンパクトに作った。本体を背面あわせにし、無駄な空間を無くした。~
センサーは車輪に近づけ、きちんと小回りが可能なセンサー検知を出来るようにした。
#ref(2019a/Member/Gouki/Mission3/asimawari.jpg,30%);

**アーム部分 [#n6f8d1c4]
アームの部分も本体同様シンプルにし、モーターに直接部品をつけ、回転させアームを動かし、~
ボールをつかんだり離したり出来るようなクレーン型のアームに落ち着いた。

#ref(2019a/Member/Gouki/Mission3/Inkedみっしよん3_190814_0002_LI.jpg,15%);
#ref(2019a/Member/Gouki/Mission3/Inkedみっしよん3_190814_0001_LI.jpg,15%);
#ref(2019a/Member/Gouki/Mission3/Inkedみっしよん3_190814_00021_LI.jpg,15%);

アームを一番上まで上げるために、補助として輪ゴムを使った。

#ref(2019a/Member/Gouki/Mission3/Inkedみっしよん3_190814_0005_LI.jpg,15%);


*作戦 [#z667c8b6]
**ルートについて [#i3296f07]
私たちはボールを一つずつ運搬するロボットを作ったため、ボールをつかみ~
トレーに持っていき、ボールを離すという行動を合計4回行う必要がある。
そのため次のようなルートでロボットを動かすことにした。

#ref(2019a/Member/Gouki/Mission3/みっしよん3_190814_0007.jpg,50%);

��A'を出発しL'のボールを掴み,旋回して容器に入れる.
#ref(2019a/Member/Gouki/Mission3/route1.png,50%);

�⊆,法い修海�ら直線を突っ切って容器の中のピンポン玉を掴みゴールにある容器に入れ替える.
#ref(2019a/Member/Gouki/Mission3/route2.png,50%);
�F韻犬�容器の中のボールをゴールの容器に持っていき入れる.
#ref(2019a/Member/Gouki/Mission3/route3.png,50%);
�ず埜紊法�Lにあるボールを掴みゴールの容器に入れる
#ref(2019a/Member/Gouki/Mission3/route4.png,50%);






*プログラムについて [#h6c4ad2e]
今回は本体を2機使い、
-マスター:両車輪、アームの上げ下げ
-スレーブ:ボールをつかむ動作
というように動作を分けて、プログラミングを作った。

**共通のプログラム [#n4cc6b0d]
2機間で通信するために以下のマクロを定義した。
 #define SIGNALON1 11
 #define SIGNALOFF1 12
 #define SIGNALON2 13
 #define SIGNALOFF2 14

**アームのプログラム(スレーブ側のプログラム) [#ife08613]
***アームの上げ下げのマクロ [#yfbde368]
 #define arm_down OnFwd(OUT_A,25);Wait(1500);Off(OUT_A);  //アームを下げる
 #define arm_up OnRev(OUT_A,35);Wait(1500);Off(OUT_A);  //アームを上げる
 
***スレーブのプログラム [#x33fd690]

 #define SIGNALON1 11
 #define SIGNALOFF1 12
 #define SIGNALON2 13
 #define SIGNALOFF2 14
 #define CONN 1          //マスターの接続番号
 
 task main()
 {
     int msg;            //受け取った値を格納する変数
     
     while(true){
         ReceiveRemoteNumber(MAILBOX1,true,msg);     //MAILBOX1の値を受け取りmsgに格納
         
         if(msg==SIGNALON1){       //SIGNALON1を受信したとき
             OnRev(OUT_A,20);Wait(1000); //ボールを掴む
         }else if(msg==SIGNALOFF1){    //SIGNALOFF1を受信したとき
             Off(OUT_A);         //モータAを止める
         }else if(msg==SIGNALON2){    //SIGNALON2を受信したとき
             OnFwd(OUT_A,20);Wait(1000); //ボールを放す
         }else if(msg==SIGNALOFF2){    //SIGNALOFF2を受信したとき
            Off(OUT_A);         //モータAを止める
         }
     }
 }


**ライントレース [#zd28da58]
***マクロ [#h278ba8e]
私たちは「完全に真っ白」、「白と境目の間」、「境目」、「黒と境目の間」、~
「完全に黒」の5つの部分に色を分けて測った。~
光センサーで検知する数値を以下のマクロで定義した。

 #define black 30
 #define white 60
 #define lightgray 50
 #define darkgray 39
 #define center 45
#ref(2019a/Member/Gouki/Mission3/light_sennser.png,15%);

その他様々な動作を以下のように定義した。


 #define turn_right OnFwd(OUT_C,25);OnRev(OUT_B,23);  //右折
 #define turn_left OnFwd(OUT_B,28);OnRev(OUT_C,20);  //左折
 #define rotate_right OnFwd(OUT_C,25);OnRev(OUT_B,22);  //右旋回
 #define rotate_left OnFwd(OUT_B,28);OnRev(OUT_C,15);  //左旋回
 #define go_straight OnFwd(OUT_B,23);OnFwd(OUT_C,20);  //直進
 #define go_straight2 OnFwd(OUT_B,20);OnFwd(OUT_C,17);  //K'からL'での出力弱めの直進
 #define turn OnRev(OUT_C,20);OnFwd(OUT_B,28);Wait(3200);Off(OUT_BC);  //L'のボール掴んで から入れるまでの旋回
 #define turn2 OnRev(OUT_B,28);OnFwd(OUT_C,20);Wait(1500);Off(OUT_BC);  //ボールの入ってるトレーへのわずかな調整
 #define sakittyo OnFwd(OUT_C,20);OnFwd(OUT_B,23);Wait(1150);Off(OUT_BC);  //ボールが入ってるトレー前でのわずかな前進
 #define turn3 OnRev(OUT_B,30);Wait(4800);Off(OUT_BC);  //トレーのボールを掴んだ後の方向転換
 #define turn4 OnRev(OUT_B,30);Wait(5200);Off(OUT_BC);  //
 #define back OnRev(OUT_C,20);OnRev(OUT_B,28);Wait(3000);Off(OUT_BC);  //最後トレーに触れないように少し離れる


***左側のライントレース [#a05ab4c7]
 sub followline_L(int stop_time)
 {
     long t0=CurrentTick();
     while(CurrentTick()-t0<stop_time){ //現在の時刻が一定の値を超えるまで
         if(SENSOR_1<black){            //センサーが黒の時
         rotate_left;                   //左旋回
         }else if(SENSOR_1<darkgray){   //センサーが黒灰なら
         turn_left;                     //左折
         }else if(SENSOR_1>lightgray){  //センサーが白灰なら
         turn_right;                    //右折
         t0=CurrentTick();              //時間をリセット
         }else if(SENSOR_1<center){         //明るさ45以下で
         go_straight;                   //直進
         t0=CurrentTick();              //時間をリセット
         }else{                         //それ以外は
         rotate_right;                  //右旋回
         t0=CurrentTick();              //時間をリセット
         }
     }    
     Off(OUT_BC);          //時刻が一定の値を超えると停止
     Wait(1000);           //1秒間停止
 }
***右側のライントレース [#qa9b1ed2]

 sub followline_R(int stop_time)
 {
     long t0=CurrentTick();
     while(CurrentTick()-t0<stop_time){  //現在の時刻が一定の値を超えるまで
         if(SENSOR_1<black){             //センサーが黒の時
         rotate_right;                   //右旋回
         }else if(SENSOR_1<darkgray){    //センサーが黒灰なら
         turn_right;                     //右折
         }else if(SENSOR_1>lightgray){   //センサーが白灰なら
         turn_left;                      //左折
         t0=CurrentTick();               //時間をリセット
         }else if(SENSOR_1<center){          //センサーが45以下なら
         go_straight;                    //直進
         t0=CurrentTick();               //時間をリセット
         }else{                          //それ以外は
         rotate_left;                    //左旋回
         t0=CurrentTick();               //時間をリセット
         }
     }    
     Off(OUT_BC);           //一定の時間を超えると停止
     Wait(1000);            //一秒間停止
 } 

又、K,L間、K`,L`間ではそのままの出力で直進してしまうとボールに触れた際に~
ボールを飛ばしてしまう可能性があるため、この部分だけ直進の出力が弱くなるような~
右側ライントレースにした。それが下記のプログラムである。
 sub followline_R2(int stop_time)
 {
     long t0=CurrentTick();
     while(CurrentTick()-t0<stop_time){   //時刻がある一定の値より小さいとき
         if(SENSOR_1<black){              //黒なら
         rotate_right;                    //右旋回
         t0=CurrentTick();                //時間をリセット
         }else if(SENSOR_1<darkgray){     //灰黒色なら
         turn_right;                      //右折
         t0=CurrentTick();                //時間をリセット
         }else if(SENSOR_1>lightgray){    //灰白色なら
         turn_left;                       //左折
         }else if(SENSOR_1<center){           //明るさ45以下で
         go_straight2;                    //ゆっくり直進
         t0=CurrentTick();                //時間をリセット
         }else{                           //それ以外なら
         rotate_left;                     //左旋回
         }
     }    
     Off(OUT_BC);            //停止
     Wait(2000);             //2秒間停止
 }
***横断 [#d41cbe46]
二つのマップを横断する際、黒を見つけるまで直進するプログラムと白を見つけるまで直進する~
プログラムを交互に組み合わせて横断する
-黒を見つけるまで直進
 sub Blackto_White()
 {
     while(SENSOR_1<lightgray){ //光センサーの値が白灰より小さいとき
         OnFwd(OUT_C,25);      
         OnFwd(OUT_B,25);      //直進
     }
     Off(OUT_BC);        //白灰より大きくなると止まる
 }
-白を見つけるまで直進
 sub Whiteto_Black()
 {
     while(SENSOR_1>darkgray){ //光センサーの値が黒灰よりも大きいとき
         OnFwd(OUT_C,25);      
         OnFwd(OUT_B,25);           //直進
     }
     Off(OUT_BC);               //黒灰よりも大きくなると止まる
 }
又、ライントレースの右側と左側を入れ替える時に使う横断のプログラムがある。
-黒を見つけるまで右旋回
 sub Whiteto_Black_R()
 {
     while(SENSOR_1>darkgray){ //光センサーの値が黒灰よりも大きいとき
     OnFwd(OUT_C,25);      
     OnRev(OUT_B,25);           //右旋回
     }
     Off(OUT_BC);               //黒灰よりも小さくなると止まる
 }    

-黒を見つけるまで左旋回
 sub Whiteto_Black_L()
 {
     while(SENSOR_1>black){ //光センサーの値が黒より大きいとき
     OnFwd(OUT_B,25);        
     OnRev(OUT_C,25);        //左旋回
     }
     Off(OUT_BC);            //黒より小さいとき
 }
**マスターのプログラム [#g32bc84d]
 task main()
 {
     SetSensorLight(S1);     //端子1に光センサー
     RemoteStartProgram(CONN,"kodomo.nxc");  //スレーブのプログラムを起動
     
     followline_R(200);
     Blackto_White();
     followline_L(150);
     Blackto_White_R();
     followline_R2(150);
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);  //MAILBOX1にSIGNALON1を送信
     Wait(1000);
     arm_up;
     turn;
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);  //MAILBOX1にSIGNALON2を送信
     Wait(1000);
     
     followline_R(150);
     Blackto_White_L();
     followline_L(100);
     Blackto_White();
     Whiteto_Black();
     Blackto_White();
     Whiteto_Black();
     Blackto_White();
     Whiteto_Black();
     Blackto_White();
     followline_R(150);
     Blackto_White();
     turn2;
     sakittyo;
     arm_down;
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);   //MAILBOX1にSIGNALON1を送信
     Wait(1000);
     arm_up;
     turn3; 
 
     
     Whiteto_Black();
     Blackto_White();
     Whiteto_Black();
     Blackto_White();
     followline_R(200);
     Blackto_White();
     turn2;
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);   //MAILBOX1にSIGNALON2を送信
     Wait(1000);
     turn3;
      
 
     Whiteto_Black();
     Blackto_White();
     Whiteto_Black();
     Blackto_White();
     followline_R(200);
     Blackto_White();
     turn2;
     sakittyo;
     arm_down;
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);   //MAILBOX1にSIGNALON1を送信
     Wait(1000);
     arm_up;
     turn3;
      
      
     Whiteto_Black();
     Blackto_White();
     Whiteto_Black();
     Blackto_White();
     Blackto_White_R();
     followline_R(200);
     Blackto_White();
     turn2;
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);   //MAILBOX1にSIGNALON2を送信
     Wait(1500);
     turn4;
     arm_down
     
     
     Whiteto_Black();
     Blackto_White();
     Whiteto_Black();
     Blackto_White();
     followline_L(200);
     Blackto_White();
     followline_R(200);
     Blackto_White();
     followline_L(200);
     Blackto_White();
     followline_R(200);
     Blackto_White();
     followline_L(150);
     Blackto_White_R();
     followline_R2(125);
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);   //MAILBOX1にSIGNALON1を送信
     Wait(1000);
     arm_up;
     turn;
     
     
     followline_R(100);
     Blackto_White_L();
     followline_L(100);
     Blackto_White();
     Whiteto_Black();
     Blackto_White();
     Whiteto_Black();
     Blackto_White();
     Whiteto_Black();
     Blackto_White();
     followline_R(200);
     Blackto_White();
     turn2;
     sakittyo;
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);   //MAILBOX1にSIGNALON2を送信
     Wait(1000);
 }
ゴールのトレーをGT,もともとボールを入れてあるトレーをSTと呼ぶと, 一つ目の塊は,M'からス~タートしL'のボールを掴んでGTに入れるまでのプログラム 二つ目の塊は,L'のボールを入れた後~STまで行き,ボールを掴むまでのプログラム 三つ目の塊は,STからGTまで行き,ボールを入れる~プログラム 四つ目の塊は,ボールを入れてからまたSTまで行き,ボールを掴むまでのプログラム ~五つ目の塊は,ボールを掴んでからGTまで行きゴールするまでのプログラム 六つ目の塊は,STから~Lまで移動し,Lのボールを掴むまでのプログラム 七つ目の塊は,LからGTまで移動してゴールし,~トレーから少し離れまでのプログラム である.
*完成したプログラム [#nd4c0788]
**マスター [#ld48981e]
 #define CONN 1
 #define SIGNALON1 11
 #define SIGNALOFF1 12
 #define SIGNALON2 13
 #define SIGNALOFF2 14 
 
 
 #define turn_right OnFwd(OUT_C,25);OnRev(OUT_B,23);
 #define turn_left OnFwd(OUT_B,28);OnRev(OUT_C,20);
 #define rotate_right OnFwd(OUT_C,25);OnRev(OUT_B,22);
 #define rotate_left OnFwd(OUT_B,28);OnRev(OUT_C,15);
 #define go_straight OnFwd(OUT_B,23);OnFwd(OUT_C,20);
 #define go_straight2 OnFwd(OUT_B,20);OnFwd(OUT_C,17);
 #define turn OnRev(OUT_C,20);OnFwd(OUT_B,28);Wait(3200);Off(OUT_BC);
 #define turn2 OnRev(OUT_B,28);OnFwd(OUT_C,20);Wait(1500);Off(OUT_BC);
 #define sakittyo OnFwd(OUT_C,20);OnFwd(OUT_B,23);Wait(1150);Off(OUT_BC);
 #define turn3 OnRev(OUT_B,30);Wait(4800);Off(OUT_BC);
 #define turn4 OnRev(OUT_B,30);Wait(5200);Off(OUT_BC);
 #define back OnRev(OUT_C,20);OnRev(OUT_B,28);Wait(3000);Off(OUT_BC);   
 
 #define osidasi OnFwd(OUT_BC,100);Wait(100);Off(OUT_BC);
 #define arm_down OnFwd(OUT_A,25);Wait(1500);Off(OUT_A);
 #define arm_up OnRev(OUT_A,35);Wait(1500);Off(OUT_A);
 #define black 30
 #define white 60
 #define lightgray 50
 #define darkgray 39
 #define center 45 
 
 sub followline_L(int stop_time)
 {
     long t0=CurrentTick();
     while(CurrentTick()-t0<stop_time){
 if(SENSOR_1<black){
    rotate_left;
 }else if(SENSOR_1<darkgray){
    turn_left;
 }else if(SENSOR_1>lightgray){
    turn_right;
    t0=CurrentTick();
 }else if(SENSOR_1<center){
    go_straight;
    t0=CurrentTick();
 }else{
    rotate_right;
    t0=CurrentTick();
 }
     }    
     Off(OUT_BC);
     Wait(1000);
 }
  
 sub followline_R(int stop_time)
 {
     long t0=CurrentTick();
     while(CurrentTick()-t0<stop_time){
 if(SENSOR_1<black){
    rotate_right;
 }else if(SENSOR_1<darkgray){
    turn_right;
 }else if(SENSOR_1>lightgray){
    turn_left;
    t0=CurrentTick();
 }else if(SENSOR_1<center){
    go_straight;
    t0=CurrentTick();
 }else{
    rotate_left;
    t0=CurrentTick();
 } 
     }    
     Off(OUT_BC);
     Wait(1000);
 }  
 
 sub followline_R2(int stop_time)
 {
     long t0=CurrentTick();
     while(CurrentTick()-t0<stop_time){
 if(SENSOR_1<black){
    rotate_right;
    t0=CurrentTick();
 }else if(SENSOR_1<darkgray){
    turn_right;
    t0=CurrentTick();
 }else if(SENSOR_1>lightgray){
    turn_left;
 }else if(SENSOR_1<center){
    go_straight2;
    t0=CurrentTick();
 }else{
    rotate_left;
 }
     }    
     Off(OUT_BC);
     Wait(2000);
 }  
 
 sub Blackto_White()
 {
     while(SENSOR_1<lightgray){
     OnFwd(OUT_C,25);
     OnFwd(OUT_B,25);
     }
     Off(OUT_BC);
 }  
 
 sub Whiteto_Black()
 {
     while(SENSOR_1>darkgray){
     OnFwd(OUT_C,25);
     OnFwd(OUT_B,25);
     }
     Off(OUT_BC);
 } 
  
 
 sub Blackto_White_R()
 {
     while(SENSOR_1<darkgray){
     OnFwd(OUT_C,25);
     OnRev(OUT_B,25);
     }
     Off(OUT_BC);
 }  
 
 sub Blackto_White_L()
 {
     while(SENSOR_1<lightgray){
     OnFwd(OUT_B,25);
     OnRev(OUT_C,25);
     }
     Off(OUT_BC);
 }
 
  
 task main()
 {
     SetSensorLight(S1);
     RemoteStartProgram(CONN,"kodomo.nxc");
     
     followline_R(200);
     Blackto_White();
     followline_L(150);
     Blackto_White_R();
     followline_R2(150);
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
     Wait(1000);
     arm_up;
     turn;
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
     Wait(1000);
     
     followline_R(150);
     Blackto_White_L();
     followline_L(100);
     Blackto_White();
     Whiteto_Black();
     Blackto_White();
     Whiteto_Black();
     Blackto_White();
     Whiteto_Black();
     Blackto_White();
     followline_R(150);
     Blackto_White();
     turn2;
     sakittyo;
     arm_down;
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
     Wait(1000);
     arm_up;
     turn3;
 
     
     Whiteto_Black();
     Blackto_White();
     Whiteto_Black();
     Blackto_White();
     followline_R(200);
     Blackto_White();
     turn2;
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
     Wait(1000);
     turn3;
       
 
     Whiteto_Black();
     Blackto_White();
     Whiteto_Black();
     Blackto_White();
     followline_R(200);
     Blackto_White();
     turn2;
     sakittyo;
     arm_down;
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
     Wait(1000);
     arm_up;
     turn3;
     
     
     Whiteto_Black();
     Blackto_White();
     Whiteto_Black();
     Blackto_White();
     Blackto_White_R();
     followline_R(200);
     Blackto_White();
     turn2;
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
     Wait(1500);
     turn4;
     arm_down
     
    
     Whiteto_Black();
     Blackto_White();
     Whiteto_Black();
     Blackto_White();
     followline_L(200);
     Blackto_White();
     followline_R(200);
     Blackto_White();
     followline_L(200);
     Blackto_White();
     followline_R(200);
     Blackto_White();
     followline_L(150);
     Blackto_White_R();
     followline_R2(125);
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
     Wait(1000);
     arm_up;
     turn;
     
     
     followline_R(100);
     Blackto_White_L();
     followline_L(100);
     Blackto_White();
     Whiteto_Black();
     Blackto_White();
     Whiteto_Black();
     Blackto_White();
     Whiteto_Black();
     Blackto_White();
     followline_R(200);
     Blackto_White();
     turn2;
     sakittyo;
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON2);
     Wait(1000);
 }


**スレーブ [#yb1b6b06]

 #define SIGNALON1 11
 #define SIGNALOFF1 12
 #define SIGNALON2 13
 #define SIGNALOFF2 14
 #define CONN 1 
 
 task main()
 {
     int msg;
     
     while(true){
         ReceiveRemoteNumber(MAILBOX1,true,msg);
         
         if(msg==SIGNALON1){
             OnRev(OUT_A,20);Wait(1000);
         }else if(msg==SIGNALOFF1){
             Off(OUT_A);
         }else if(msg==SIGNALON2){
             OnFwd(OUT_A,20);Wait(1000);
         }else if(msg==SIGNALOFF2){
             Off(OUT_A);
          }
      }
 }
*まとめ [#b5c75a06]
今回の課題ではプログラミングもロボットの作成も多くの時間を費やした。~
ロボットの作成では、ロボットの形、ボールを運ぶ方法など様々な事を考え~
作成した。プログラムではライントレースは課題2で使用したモノをまんま~
使って、論理上ではきちんとコース上を完璧に動くものが作れたが、現実問題~
として、電池が切れたのが原因だと思うが、出力がすぐに弱くなったり、~
片方のモーターが不調で同じ出力で直進させても曲がってしまうという~
ようなことがあり、出力や秒数を毎回毎回調整したりするのにかなり~
時間がかかった。だが、最終的にロボコンでボールを一つしかトレーに~
入れられなかったが二位という結果だったので、自分としては悪くはない結果~
出会ったと思う。

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