コードを実行し、サーボ位置を測定してから、これらの測定値をプログラムに戻して、適切に調整できるようにする必要があります。これは、調整とキャリブレーションとして知られています。
入力が目的の角度であり、出力がサーボに命令する必要がある PWM 値である関数になるはずです。サーボを動かす直前にこの関数を呼び出します。
注: あなたのコードのループは少し奇妙なので、特定のサーボがどのように制御されているか正確にはわかりません。PWM 制御は、デューティ サイクルに基づいて動作します。デューティ サイクルは、ローとハイの時間の比率、または 0 ~ 100% です。この回答では、これは 0.0 ~ 1.0 の PWM 値に相当します。もちろん、アイデアと方程式を自分でコードに統合する必要があります。
キャリブレーション係数を決定するには (サーボ制御が線形であると仮定すると、最も単純な変換gain
では と になります。ここで、 とはです。):offset
y = mx + b
gain
m
offset
b
- それを起動し、PWM を最小に設定します (最小値が 0 であるとしましょう)。
- サーボの角度を測定します。
- PWM を最大に設定します (最大値が 1.0 であるとしましょう)。
- サーボの角度を測定します。
私はいくつかの仮定を立て、任意に数字を選んでいますが、測定値は次のとおりです。
- PWM 設定 0 (最小) で -10 度。
- PWM 設定 1 (最大) で +80 度。
これらの測定値を呼び出しましょう:
x1 = angle1 = -10;
y1 = pwm1 = 0;
x2 = angle2 = 80;
y2 = pwm2 = 1;
には 2 つの値、には 2x
つの値があるので、 と の連立方程式をy
解くことができます。isとisであるため、次の式になります。y1 = x1 * m + b
y2 = x2 * m + b
m
gain
b
offset
y = (1/90) * x + (1/9)
また
gain = 1/90;
offset = 1/9;
dacValue = gain * angle + offset;
ここで、サーボが反復可能で、PWM 制御が線形であると仮定すると、45 度が要求されたときに、上記の式を使用して係数を適用すると、0.6111 の答えが得られます。これで PWM に命令すると、サーボが動くはずです。サーボの位置を測定すると、45 度である必要があります。
ゲインとオフセットは、サーボ、電子回路、機械的リンケージなどの変動により、システム内のサーボごとに異なる可能性があることに注意してください。システムの一部が変更された場合は、そのサーボ システムを再調整する必要があります。 .
範囲が直線的でない場合、これはさらに複雑になります (たとえば、サーボは最大に近く動き、最小に近づくと小さくなります)。二次方程式、高次の方程式、またはまったく異なる方程式を使用する必要があります。選択は、サーボ位置でどれだけの誤差を許容できるかにかかっています。
サーボが反復可能でない場合 (たとえば、特定の PWM 値に移動するたびにサーボが別の場所で停止するなど)、制御も困難になります。
また、これは少なくともシステムの開ループ制御であることに注意してください。サーボ内には、非常によく似た制御ループが存在します。の代わりにangle to PWM
、PWM to position
位置が実際の角度に調整されていない可能性があります。そのため、プログラムでその仕事を処理する必要があります。