#author("2020-02-15T19:38:10+09:00","Hatto","Hatto")
#author("2020-02-15T19:39:08+09:00","Hatto","Hatto")
[[2019b/Member]]

*課題3 [#b30eedab]
青と赤のボールを運搬して空き缶の上に乗せる

*ロボットについて [#hffb59e9]
#ref(2019b/Member/Hatto/Mission3/robo.jpeg,50%)

一体型のロボットを作ることにした。

下の部分が各種センサーでライントレースと缶の発見を行う側で、上の部分がアームでボールの回収と設置を行う側である。

光センサーは、車体との距離を縮めることでカーブを交差点だと認識することを減らした。さらに地面と近すぎず、

遠すぎない位置に設置することで安定した値を取れるようにした。

*プログラミング [#l257949b]
 #define SPEED 35                                             //モーターの回転速度
 #define STEP 1                                               //一回の判断で進む時間
 #define mae OnFwd(OUT_BC,SPEED);                             //前進する
 #define usiro(t) OnRev(OUT_BC,SPEED);Wait(t);Off(OUT_BC);    //後退する
 #define migi1 OnFwd(OUT_C,SPEED);                            //右折する
 #define migi2 OnFwd(OUT_C,SPEED);OnRev(OUT_B,SPEED);         //右に旋回
 #define hidari1 OnFwd(OUT_B,SPEED);                          //左折する
 #define hidari2 OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED);       //左に旋回
 #define CONN 1                                               //スレーブの番号
 #define SIGNALON 11                                          //SIGNALONは11と定義
 #define SIGNALOFF 12                                         //SIGNALOFFは12と定義 
これがマクロのプログラミング
 
 sub linefollow1()
 {
     SetSensorLight(S3);                //S3に光センサーをつける
     SetSensorLowspeed(S4);             //S4に超音波センサーをつける
     long t0;
     t0=CurrentTick(); 
     while(CurrentTick()-t0<200){       //t0が0.2秒の間繰り返す
         if(SensorUS(S4)<=6){           //6cm以内に近づくと
             Off(OUT_BC);               //モーターが止まる
             PlaySound(SOUND_UP);       //ピロピロという音が鳴る
             break;                     //whileループから抜け出す
         }
         if(SENSOR_3>60){               //値が60以上の時
            migi2;                     //右に旋回
            t0=CurrentTick();          //時間をリセット
        }else if(SENSOR_3>52){         //値が52以上の時
             migi1;                     //右折する
             t0=CurrentTick();          //時間をリセット
         }else if(SENSOR_3>40){         //値が40以上の時
             hidari1;                   //左折する
             t0=CurrentTick();          //時間をリセット
         }else if(SENSOR_3>30){         //値が30以上の時
             hidari2;                   //左に旋回
         }else{                         //そのほかの時  
             mae;                       //前進する
             t0=CurrentTick();          //時間をリセット 
         }                             
          Wait(STEP);                    
         }
     Off(OUT_BC);                       //モーターを止める
     Wait(1000);                        //1秒待つ
 }
これが左をトレースするプログラム

 {
     Wait(1000);                                  //1秒待つ
     PlaySound(SOUND_CLICK);                      //ピッという音を出す
     linefollow1();                               //左側をライントレースし缶の前まで行く
     mae;Wait(350);Off(OUT_BC);                   //缶の前でもう少し前へ行く(タッチセンサーならいらなかったかも) 
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON);    //スレーブに11を送る(C地点の缶) 
     Wait(17000);                                 //17秒待つ(これを無くしたかった)
     usiro(1400);                                 //後退する
     kaihi();                                     //缶を回避
     linefollow1();                               //左側をライントレース
     mae;Wait(700);Off(OUT_BC);                   //D地点の交差点を直進 
     linefollow1();                               //左側をライントレース
     mae;Wait(350);Off(OUT_BC);                   //缶の前まで調節 
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON);    //スレーブに11を送る
     Wait(17000);                                 //17秒待つ
     usiro(1100);                                 //後退する
     migi2;Wait(1600);Off(OUT_BC);                //D地点の交差点を右折
     linefollow1();                               //左側をライントレース
     hidari2;Wait(1600);Off(OUT_BC);              //G地点の交差点を左折
     linefollow1();                               //左側をライントレース
     mae;Wait(350);Off(OUT_BC);                   //缶の前まで調節 
     SendRemoteNumber(CONN,MAILBOX1,SIGNALON);    //スレーブに11を送る 
     Wait(17000);                                 //17秒待つ
     usiro(1100);                                 //後退する
     migi2;Wait(1700);Off(OUT_BC);                //G地点の交差点を右折
     linefollow1();                               //左側をライントレース
     hidari1;Wait(2000);Off(OUT_BC);              //H地点の交差点を左折
     linefollow2();                               //右側をライントレース
     migi1;Wait(2000);Off(OUT_BC);                //H'地点の交差点を右折
     linefollow1();                               //左側をライントレース 
     hidari2;Wait(1600);Off(OUT_BC);              //G'地点の交差点を左折
     linefollow1();                               //左側をライントレース 
     mae;Wait(350);Off(OUT_BC);                   //缶の前まで調節 
     SendRemoteNumber(CONN,MAILBOX1,SIGNALOFF);   //スレーブに11を送る 
     Wait(17000);                                 //17秒待つ
     usiro(1100);                                 //後退する
 }
これがメインのプログラム

*まとめ [#t907cb9b]
プログラミングということができてとても良かった。

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