[[2017a/Member]]
*目次 [#s3d0feec]
#contents
*課題 [#qcf82f56]
今回の課題はロボットに2cm幅の線の上を走らせるというものだ。
今回の課題は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]
線の右側を走行する。
 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;
 } 

 sub EQRGPQ()
 {  
     PlaySound(SOUND_UP);
     go_forward;
     Wait(350);
     off; 
 } 

 sub PS()
 {    
     PlaySound(SOUND_DOWN);
     wait;
     go_back;
     Wait(600);
     turn_left;
     Wait(100);
     go_forward;
     Wait(500);
 }

 sub TT()
 {
     PlaySound(SOUND_DOWN);
     wait;
     go_forward;
     Wait(350);
     off; 
 } 

 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]
今回の課題はなかなか進行しなかったが、光センサーを本体に近づけることで急にうまくいった。今回、プログラミングに苦戦した。


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