2018b/Member

課題2

 今回の課題はライントレースカーのプログラミングで、

 ”コースで黒い線に沿って動き、途中でボールをゴール付近に立てた350mlの空き缶(黄色で表示)に当てるロボットを製作”

である。

目次

コース

 走るコースは右の通りである。   kadai2_rrr2.jpg

  • 矢印の終点で一時停止
  1. ロボットを正方形X内におき、Lをスタート
  2. Eを一時停止して直進
  3. Iを一時停止して左折
  4. Hを直進
  5. Kを直進
  6. Jを左折
  7. Cを一時停止して右折
  8. Eを一時停止して直進
  9. Gを一時停止して直進
  10. 長方形X内に入って停止
  • (一時停止の指定がある場所は、1秒間停止すること)
  • ボールはロボットが弧IHKJ上にある時にQ地点の空き缶に当てる

ロボット

今回作ったロボットはこれだ!! ☞☞☞ 車体1.JPG

車体

 二輪をメインに、後輪一つ、前方に光センサを取り付けたスタンダードな形状を採用した。

ボール発射部分

プログラム

マクロ

マクロは以下の通りである。

/************************************************
  ライントレ____@(;ω;`)@彡_____ス・プログラム
*************************************************/

/*マクロ*/
#define fw Off(OUT_BC);OnFwd(OUT_BC,30); // 直進
#define lt Off(OUT_BC);OnFwd(OUT_B,35);  // 左回
#define rt Off(OUT_BC);OnFwd(OUT_C,35);  // 右回
#define rrt Off(OUT_BC);OnFwd(OUT_C,30);OnFwd(OUT_B,-55); // 右旋回
#define llt Off(OUT_BC);OnFwd(OUT_B,30);OnFwd(OUT_C,-55); // 左旋回
#define wait_sec Off(OUT_BC);Wait(1000); //一時停止
#define mini_go Off(OUT_BC);OnFwd(OUT_BC,30);Wait(500);Off(OUT_BC); //少し直進
#define throw_ball Wait(500);RotateMotor(OUT_A,20,-50);Off(OUT_A);//投げる
const float tire_diameter = 5.75; //タイヤの直径
const float tire_axis = 11.5; //タイヤの軸の長さ

投射プログラム

/*探して投げる*/
void search_throw(){
    SetSensorLowspeed(S2);
    int d_min=1000; //物体までの最小値
    long ang_min=0,angle=0; //最小値までのタイヤの回転角
    ResetTachoCount(OUT_BC);  //回転角リセット
    OnFwdSync(OUT_BC,40,100); //時計回りに旋回
    while(((tire_diameter/tire_axis)*MotorTachoCount(OUT_C))<=360.0){
        if(d_min>SensorUS(S2)){  //最小値更新時
            d_min=SensorUS(S2);
            angle=MotorTachoCount(OUT_C);//タイヤ回転角更新
        }
    }
    ang_min=MotorTachoCount(OUT_C)-angle;
    Off(OUT_BC);
    Wait(1000);
    ResetTachoCount(OUT_BC);
    RotateMotorEx(OUT_BC, 40, ang_min, -100, true, true);//物体の方を向く
    Off(OUT_BC);
    throw_ball;
    ResetTachoCount(OUT_BC);
    RotateMotorEx(OUT_BC, 40, angle, -100, true, true);//元の向きへ戻す
    Off(OUT_BC);
}

ライントレースプログラム

/*T字路、十字路における選択*/
//  0: 1秒停止 終  1: 少し直進 終  2: 1秒停止して少し直進 終
void blk_selection(int blk_select){
    if(blk_select!=1){  // 一時停止
        wait_sec;
    }
    if(blk_select!=0){  // 少し直進
        mini_go;
    }
}
/*:::ライントレースのメイン部分:::*/
// しきい値の反転(この機体の場合):var*(-1)+91
void follow_line(int bw_time,long min_t,int blk_cnt,string invert_info){
    int bb_cnt;
    int B_cnt=0;
    long t0,t1,start_t; // t0,t1,start_t 時間変数の定義
    SetSensorLight(S1); // 光センサ定義
    t1=CurrentTick(); // 経過時間
    t0=CurrentTick(); // カーブ初期時間
    start_t=CurrentTick(); // 追尾初期時間
    int right_var;        // 光センサ値用変数
    while(t1-start_t<min_t || min_t<0){
/*----------------↓繰り返し↓-----------------*/
        right_var = SENSOR_1; // 光センサ値代入
        if(invert_info=="on"){  // ラインの右か左か "off"で左,"on"で右
             right_var = right_var*(-1)+91;} 

        if (right_var>50){ 

     /*********右回り↓********/
            if (t1-t0>bw_time){ // 右回で0.15s以上のとき右旋回
                  if (blk_cnt>=0 && blk_cnt<=2 && invert_info=="on"){
                         blk_selection(blk_cnt);
                         break;
                   }else{
                       rrt;}
            }else{        // 右回
                  rt;}
     /**********直進↓********/
        }else if (right_var>40){
            fw;
             t0=CurrentTick(); // カーブ初期時間の更新
     /*********左回り↓*******/ 
        }else{
            if (t1-t0>bw_time){   // 左回で0.15s以上のとき左旋回
                  if (blk_cnt>=0 && blk_cnt<=2 && invert_info!="on") {
                         blk_selection(blk_cnt);
                         break;
                   }else{
                       llt;}
            }else{            // 左回 
                  lt;}}
    t1=CurrentTick();    //経過時間
/*----------------↑繰り返し↑-----------------*/
    }Off(OUT_BC);
}

メインプログラム

/*^^^^^^^^メイン関数^^^^^^^^
follow_line("白黒時間","追尾継続時間※1","交差点等行動選択※2",invert_str);
※1  負の値で連続
※2  0:1秒停止-終  1:少し直進-終  2:0+1-終  その他:llt or rrt
~~~~~~~~~:::::~~~~~~~~*/

task main(){
    string invert_str="off";
// L-E
    follow_line(200, 2000,-1,invert_str); // 追跡
    follow_line(200,   -1, 2,invert_str); // 追跡
// E-I
    follow_line(200, 2000,-1,invert_str); // 追跡
    follow_line(200,   -1, 0,invert_str); // 追跡
// I-H
    follow_line(200, 3000,-1,invert_str); // 追跡
    follow_line(200,   -1, 1,invert_str); // 追跡
// H-K
    follow_line(200, 3000,-1,invert_str); // 追跡 

    search_throw(); //投げる 

    follow_line(200,   -1, 1,invert_str); // 追跡
// K-J-・・・-C
    follow_line(200, 7000,-1,invert_str); // 追跡
    follow_line(220,   -1, 0,invert_str); // 追跡 

    RotateMotor(OUT_C,30,360); //右折 

    invert_str="on"; 

// C-D-・・・
    follow_line(200,21500,-1,invert_str); // 追跡
// ・・・-E
    follow_line(220,   -1, 2,invert_str); // 追跡
// E-F-・・・
    follow_line(200,26000,-1,invert_str); // 追跡
// ・・・-G
    follow_line(220,   -1, 2,invert_str); // 追跡
// G-X
    follow_line(200, 1500,-1,invert_str); // 追跡
    follow_line(220,   -1, 1,invert_str); // 追跡
// X-
    fw;Wait(1000);Off(OUT_BC); // 枠の中へ
}

反省感想


添付ファイル: file車体1.JPG [詳細] filekadai2_rrr2.jpg 4件 [詳細] filekadai2_rrr.jpg 1件 [詳細] filekadai2_r.jpg [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-01-11 (金) 20:02:36 (4d)