■センサーで目標を探す(KRS788使用)②

前回の続きです。

2) 頭部が旋回している間にセンサーの値を読み取る

・プログラムの解説

void mesure_distance ( ) // アナログ値を一定間隔で読み取る関数
{
    unsigned int i;
    wait(47370);
    for(i = 0; i < 8; i++){      // 頭を一度振る間に9回アナログ値を読み取り、
   
    adj[i] = ad7_read();    // adj[i]に代入していく
        ledgrn_switch();
        wait (47370);         // アナログ値を読む間隔は47370
                      // 426330(約0.7秒) / 9 = 47370
    }
    adj[8] = ad7_read( );       // 最後の1回

    for (i = 0; i <= 8; i++) {   //読みとった場所の番号を0からadk[]に代入
        adk[i] = i;
    }
}

  この関数はアナログ値を一定の間隔で読み取る処理を行います(画像)。この処理を頭部が旋回している間に行うことによって、ロボットの正面180°のどこに物体があるのかを知ることができます。

 読み取るタイミングはwaitで調整します。正面で読み取ることを基準にして、左右がほぼ同じ角度を読み取るように調節してください。読み取ったアナログ値は配列(例ではadj[ ])に代入してください。

 同時に、アナログ値を読み取った場所を、別の配列(例ではadk[ ])に代入します。この配列は次回の③で説明するバブルソートで使います。

 

 (画像 クリックして拡大)

 

・自律ロボット実装例で頭部サーボがシリアルサーボになっている理由

 アナログ値を読み取るタイミングを作るために、PWMサーボKRS788では時計を使って旋回時間を計り、waitを調整して読み取る角度を作らなくてはいけませんでした。この方法だと、正確な角度でアナログ値を読み取るために調整を繰り返す手間があります。

 ところが、シリアルサーボは、正確に回転角を指定することができるため、角度や読み込むタイミングを調節する手間が大幅に減ります。プログラムで細かい角度を指定し、それを連続して命令するだけで物体を簡単に探すことができるようになるのです。 

③に続く 

ホームに戻ります。