2019b/Member

課題3

青と赤のボールを運搬して空き缶の上に乗せる

ロボットについて

robo.jpeg

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

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

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

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

プログラミング

#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);                                 //後退する
}

これがメインのプログラム

まとめ

プログラミングということができてとても良かった。


添付ファイル: filerobo.jpeg 2件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-02-15 (土) 19:39:08