■シリアルサーボの簡易位置制御

シリアルサーボモーターを回す場合は、sio_set_pos関数などで指定した目標角度に到達するまでには時間がかかります。かといって次のようなプログラムでは、むだ時間が発生します。

while (1) {
  pos == sio1_set_pos(id, 目標)

  if ((pos <= 目標 + 5) && (pos >= 目標 - 5) {
      //目標位置に到達した(誤差付き)と見なして、何か処理をする
  }
  else {
      wait (100000);  // モーターが目標に到達するまでちょっと待つ
  }
}

シリアルサーボモーターは目標位置へ到達すると停止しますので、現在位置を数回調べても移動していない場合は、目標へきちんと到達したと判断します。

while (1){
    wait (300);                    // タイミング調整
    現在位置 = sio1_set_pos(ID, 目標); //シリアルサーボに目標位置を送って現在位置を取得
   
    if (前回位置 == 現在位置) {   // もし、現在位置が前回位置と同じだったら
        cnt = cnt + 1;             // cntが一つ増える
    }
    if (cnt == 適当な数){          // cntが適当な数になったら、目標位置で停止したと判断して
        break;                     // ループを抜ける
    }
    前回位置 = 現在位置;          //現在の値を保持
}

sio_set_posは、処理の後に現在の位置を返します。その現在の位置前回の位置を比べて変化が無かった場合は、サーボが目標の位置に到着していると判断してcntを増やします。数回命令を送って同じ位置にいた場合は、サーボが完全に目標の位置にいると判断し、ループを抜けて次の処理に移ることができます。

同一サーボに連続して命令を送るときには、ある程度間隔をあける必要があるので、ここでは約500us(wait(300))待ちます。

ビーチフラッグロボットでは8回一致したら目標に到達したと判断しています。

ホームに戻ります。