[[2017a/Member]]
*目次 [#s3d0feec]
#contents
*課題 [#qcf82f56]
今回の課題は2cm幅の線に沿って走るロボットの作成だ。
~[[詳しくはこちら:http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMission2]]
~私は点Eで右折するルートを選択した。
~相方のページは[[こちら:http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMember%2Ftomoya%2FMission2]]
*機体 [#e40e99e1]
ほとんど説明書のロボットと同じ構造にした。しかし、光センサーを近づけることでより急カーブを曲がりやすくした。
~&ref(aa.png);
~&ref(light2.png);
*プログラム [#ce1730e6]
**定義 [#g471afce]
 #define speedH 30   //直進、後退時の速度
 #define speedL 20   //曲がるときの速度
 #define OnRL(speedr,speedl) OnFwd(OUT_B,speedr);OnFwd(OUT_C,speedl);
 #define go_forward OnRL(speedH,speedH);    //直進
 #define go_back OnRL(-speedH,-speedH);    //後退
 #define spin_left OnRL (speedL,-speedL);    //左旋回
 #define turn_left OnRL (speedL,0);    // 左折
 #define turn_right OnRL (0,speedL);    //右折
 #define spin_right OnRL (-speedL,speedL);    //右旋回
 #define wait Wait(1000);
 #define off Off(OUT_BC)
**サブルーチン [#cef82b5a]
***線の上を走行時 [#b7ac7ac0]
線の右側を走行する。
 sub R()
 {
     SetSensorLight(S1);
     long t0 = CurrentTick();
     long tmax = 180;
     while (CurrentTick()-t0<=tmax) {
         if (SENSOR_1 >= 59){
             spin_left;
             t0 = CurrentTick();
         } else if (SENSOR_1 >= 53) {
             turn_left;
             t0 = CurrentTick();
         } else if (SENSOR_1 >= 45) {
             go_forward;
             t0 = CurrentTick();
         } else if (SENSOR_1 >= 39) {
             turn_right;
         } else {
             spin_right;
          }
       Wait(1);
     }
     off;
 }
線の左側を走行する。仕組みは右側を走行するときと同じである。
 sub L()   //
 { 
     SetSensorLight(S1);
     long t0 = CurrentTick();
     long tmax = 180;
     while (CurrentTick()-t0<=tmax) {
         if (SENSOR_1 >= 59){
             spin_right;
             t0 = CurrentTick();
         } else if (SENSOR_1 >= 53) {
             turn_right;
             t0 = CurrentTick();
         } else if (SENSOR_1 >= 45) {
             go_forward;
             t0 = CurrentTick();
         } else if (SENSOR_1 >= 39) {
             turn_left;
         } else {
             spin_left;
          }
       Wait(1);
     }
    off;
 } 
点Hから点Gまで移動するときに使う。ヘアピンカーブと直角カーブを間違えないように20秒間は黒い部分に長時間のっていても止まらないよにした。
 sub HtoG()
 {
     SetSensorLight(S1);
     long t0 = CurrentTick();
     long t1 = 20000;
     long tmax = 180;
     while (CurrentTick()-t0 <= t1) {
         if (SENSOR_1 >= 59){
             spin_left;
         } else if (SENSOR_1 >= 53) {
             turn_left;
         } else if (SENSOR_1 >= 45) {
             go_forward;
         } else if (SENSOR_1 >= 39) {
             turn_right;
         } else {
             spin_right; 
         }
     Wait(1);
     }
     t0 = CurrentTick();
     while (CurrentTick()-t0<=tmax) {
         if (SENSOR_1 >= 59){
             spin_left;
             t0 = CurrentTick();
         } else if (SENSOR_1 >= 53) {
             turn_left;
             t0 = CurrentTick();
         } else if (SENSOR_1 >= 45) {
             go_forward;
             t0 = CurrentTick();
         } else if (SENSOR_1 >= 39) {
             turn_right;
         } else {
             spin_right;
          }
       Wait(1);
     }
     off;
 } 

***各地点での方向転換、 [#s48b88b9]
点E,Q,R,G,P(二回目),Qでの方向転換、直進
 sub EQRGPQ()
 {  
     PlaySound(SOUND_UP);
     go_forward;
     Wait(350);
     off; 
 } 

点P(1回目),Sでの左折
 sub PS()
 {    
     PlaySound(SOUND_DOWN);
     wait;
     go_back;
     Wait(600);
     turn_left;
     Wait(100);
     go_forward;
     Wait(500);
 }

点Tを通過する
 sub TT()
 {
     PlaySound(SOUND_DOWN);
     wait;
     go_forward;
     Wait(350);
     off; 
 } 

点H,Fの直角コーナーを右折
 sub HF()
 {
     PlaySound(SOUND_UP);
     go_back;
     Wait(500);
     turn_right;
     Wait(1700);
     go_forward;
     Wait(500);
     off;
 }
**タスクメイン [#va3f6cff]
 task main()
 {
     R();
     EQRGPQ();
     L();
     PS();
     L();
     EQRGPQ();
     L();
     EQRGPQ();
     R();
     TT();
     R();
     TT();
     R();
     HF();
     HtoG();
     EQRGPQ();
     R();
     PS();
     L();
     EQRGPQ();
     L();
     EQRGPQ();
     R();
     HF();
     R();
 }
*感想 [#f13ec2b8]
今回の課題はなかなか進行しなかったが、光センサーを本体に近づけることで急にうまくいった。今回、プログラミングに苦戦した。
今回の課題はなかなか進行しなかったが、光センサーを本体に近づけることで急にうまくいった。今回、プログラミングに苦戦した。プログラミングの概形ができても細かな調整が必要だった。その中で同じ動きをする場所をみつけて、1つのサブルーチンにまとめることで少しは楽になったと思う。
~次回はプログラミングの改良だけでなく、ハード面の改良もしながら課題を進めていきたい。


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