2

サーボを前後に何度も回す次のコードがあります。私はそれを機能させましたが、それをある程度設定する関数を作成するにはどうすればよいですか...たとえば60?

私の現在のコード:

public static void Main()
{
    PWM servo = new PWM(PWMChannels.PWM_PIN_D5, 100, .5, false);
    servo.Start();

    while (true)
    {
        double startValue, endValue;

        for (startValue = 4.712; startValue < 10.995; startValue = startValue + 0.0005)
        {
            endValue = System.Math.Sin(startValue) * 0.5 + 0.5;
            servo.DutyCycle = endValue;
        }
    }

}

たとえば、60 度に設定し、後で 164 度に設定するにはどうすればよいですか?

4

1 に答える 1

3

コードを実行し、サーボ位置を測定してから、これらの測定値をプログラムに戻して、適切に調整できるようにする必要があります。これは、調整とキャリブレーションとして知られています。

入力が目的の角度であり、出力がサーボに命令する必要がある PWM 値である関数になるはずです。サーボを動かす直前にこの関数を呼び出します。

注: あなたのコードのループは少し奇妙なので、特定のサーボがどのように制御されているか正確にはわかりません。PWM 制御は、デューティ サイクルに基づいて動作します。デューティ サイクルは、ローとハイの時間の比率、または 0 ~ 100% です。この回答では、これは 0.0 ~ 1.0 の PWM 値に相当します。もちろん、アイデアと方程式を自分でコードに統合する必要があります。

キャリブレーション係数を決定するには (サーボ制御が線形であると仮定すると、最も単純な変換gainでは と になります。ここで、 とはです。):offsety = mx + bgainmoffsetb

  1. それを起動し、PWM を最小に設定します (最小値が 0 であるとしましょう)。
  2. サーボの角度を測定します。
  3. PWM を最大に設定します (最大値が 1.0 であるとしましょう)。
  4. サーボの角度を測定します。

私はいくつかの仮定を立て、任意に数字を選んでいますが、測定値は次のとおりです。

  • 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 + by2 = x2 * m + bmgainboffset

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 PWMPWM to position位置が実際の角度に調整されていない可能性があります。そのため、プログラムでその仕事を処理する必要があります。

于 2014-05-18T12:57:32.343 に答える