2019a/Member

目次

課題2

A地点を出発し、次のいずれかの経路を黒い線にそって動くロボットを作成する。

・A地点から出発 → M → K(直進) → L(ピンポン玉をつかむ) → K(右折) → J(一時停止の後、左折) → I(直進) → H(直進) → G(左折) → F → E → D(一時停止の後、直進) → C(直進) → B(一時停止) → シュート→ A地点に入る(ゴール)

交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止すること。

rout.png

ロボットの説明

機体はマニュアルどおりのものを使用した。マニュアルにあるロボットはシンプルで安定性が高いため今回の課題に適していると思ったので使用した。ライントレースのための光センサーは前輪より前に取り付けた。

kitai.jpeg

ボールを掴む動作は、四角形のアームで囲うことによって行うことにした。モーター1つでアームを下げてボールを掴む(囲う)。そして、そのままボールを引きずって移動させるようにした。アームの輪っかの部分が大きめなので少しずれても意外と入る。シュートするための機構は作らず、体当たりをしてシュートをすることにした。

arm.jpeg

プログラム

マクロ

#define THRESHOLD 50//この値にプラスしたりマイナスしたりしてラインのあるなしを判別する
#define left1 OnFwd(OUT_B,20);OnFwd(OUT_C,5);//左回り
#define left2 OnFwd(OUT_B,20);OnFwd(OUT_C,-15);//左旋回、その場で止まっての旋回ではなく少しだけ進みながら回る
#define right1 OnFwd(OUT_B,-20);OnFwd(OUT_C,-5);//右回り
#define right2 OnFwd(OUT_B,-15);OnFwd(OUT_C,20);//右旋回
#define front OnFwd(OUT_BC,20);//前進

サブルーチン

sub followlineleft()//左の境目でライントレースと交差点でストップ
{
    SetSensorLight(S2);
    long t0;
    t0=CurrentTick();

    while(CurrentTick()-t0<300){//連続して黒の部分のときタイマーをリセットせず、タイマーが0.3秒になると止まる
    if(SENSOR_2>THRESHOLD+10){//白い部分のとき
        right2;t0=CurrentTick();//タイマーリセット
    }else if(SENSOR_2>THRESHOLD+5){//黒よりの白のとき
        right1;t0=CurrentTick();//タイマーリセット
    }else if(SENSOR_2>THRESHOLD-5){//白よりの黒のとき
        front;t0=CurrentTick();//タイマーリセット
    }else if(SENSOR_2>THRESHOLD-10){//黒の部分のとき
        left1;t0=CurrentTick();//タイマーリセット
    }else{
        left2;//リセットしない
    }
    }
     Off(OUT_BC);
     Wait(1000);
}
sub followlineright()//右の境目でライントレースと交差点でストップ
{
    SetSensorLight(S2);
    long t0;
    t0=CurrentTick();

    while(CurrentTick()-t0<300){//上のプログラムの左右逆バージョン
    if(SENSOR_2>THRESHOLD+15){
        left2;t0=CurrentTick();
    }else if(SENSOR_2>THRESHOLD+5){
        left1;t0=CurrentTick();
    }else if(SENSOR_2>THRESHOLD-5){
        front;t0=CurrentTick();
    }else if(SENSOR_2>THRESHOLD-15){
        right1;t0=CurrentTick();
    }else{
        right2;
    }
    }
     Off(OUT_BC);
     Wait(1000);
}
sub crosslineleft()//左の境目基準で交差点横断
{
    SetSensorLight(S2);
    long t0;
    t0=CurrentTick();

    while(SENSOR_2<THRESHOLD+10){//白になるまで前進
        front;
    }
    Off(OUT_BC);

    while(SENSOR_2>THRESHOLD-15){黒になるまで右回り
        right1;
    }
    Off(OUT_BC);
     
}

メインプログラム

(このプログラムは途中で止まってしまい、最後まで実行できていない)

task main ()
{   
    SetSensorLight(S2);
    long t0;
    t0=CurrentTick();
    followlineleft();//MからK
    crosslineleft();//Kの交差点を渡る
    followlineleft();//KからL
    Wait(500);

    catchball();//ボールを掴む
    left2;//方向変換
    Wait(200);
    while(SENSOR_2>THRESHOLD-10){//黒の部分になるまで左旋回
        left2;
    }
    Off(OUT_BC);

    followlineright();//LからK
    while(SENSOR_2<THRESHOLD-10){黒の部分まで直進
        front;
    }
    followlineleft();//KからJ
    left1;
    Wait(500);
    int n=0;//JからI、IからH
    while(n<3){//2回交差点を渡らせる
        followlineleft();
        crosslineleft();
        n++;
    }
    followlineleft();//HからG
    left2;
    Wait(300);
    int m=0;//GからF、FからE
    while(m<3){//交差点ではなく直角の曲がり角なので上と差別化
        followlineleft();
        left2;
        Wait(500);
        m++;
    }
    int l=0;//EからD,DからC
    while(l<3){//交差点を渡る
        followlineleft();
        crosslineleft();
        l++;
    }
    followlineleft();//CからB
    right2;
    Wait(2000);
    releaseball();//ボールを放す
    OnFwd(OUT_BC,70);//ボールにぶつかってシュート
    Wait(500);
}

考察

ライントレースと交差点停止は動作したが交差点で停止したまま動かなくなってしまった。交差点を渡れるときもあったが成功したとは言えない。原因として、プログラミングの方法がそもそも良くないか、電池の消耗でタイヤにうまく出力されていなかったかが考えられる。

その他に安定してボールに車体をぶつけてシュートすることができなかったことが反省点としてあげられる。


添付ファイル: filerout.png 12件 [詳細] filekitai.jpeg 9件 [詳細] filearm.jpeg 10件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-08-09 (金) 10:13:52