サーボの位置は、50 Hz PWM 信号のパルス幅によって制御されます。したがって、50 Hz で PWM シーケンスをオンにする必要があります。50 Hz 信号の場合、信号の周期は 1/50=.02 秒、つまり 20 ミリ秒であることに注意してください。この期間については後で説明しますので、覚えておいてください。次のコマンドを使用して、ピン 11 に 50 Hz 信号の PWM オブジェクトを作成することから始めます。
pwm=GPIO.PWM(11,50)
信号の DutyCycle を指定するコマンドを与えることで、pwm シーケンスを開始できます。これを行う前に、サーボがどのように機能するかについて少し話す必要があります。典型的なサーボは、制御ラインで 50 Hz の周波数を見たいと思っています。移動する位置は、信号のパルス幅によって異なります。ほとんどのサーボは大まかにそのように動作しますが、特定のサーボについてこれらの数値を微調整する必要があります。通常、サーボは 1 ミリ秒のパルス幅を検出すると左いっぱいの位置に移動し、1.5 ミリ秒のパルス幅を検出すると中央の位置に移動し、パルス幅を検出すると右いっぱいの位置に移動します。パルス幅 2 ミリ秒。ただし、Raspberry Pi ではパルス幅を指定せず、DutyCycle を指定することに注意してください。したがって、次の関係を使用できます。
デューティサイクル = パルス幅/周期
Period = 1/frequencyであることを思い出してください。
デューティサイクル = パルス幅/(1/周波数) = パルス幅 * 周波数
完全な左位置を与える PulseWidth は1 ミリ秒です。次に、適用される DutyCycle を計算して、目的の位置を取得します。
デューティサイクル = パルス幅*周波数=.001 *50 = .05 = 5%
したがって、50 Hz の信号の場合、DutyCycle を 5 に設定すると、サーボが完全に左の位置に移動するはずです。同様に、DutyCycle を 7.5 に設定すると中間の位置になり、10 に設定すると完全に正しい位置になります。5 から 10 の間で直線的にスケーリングすることにより、すべての中間位置を取得できます。これらの値は、ブランド間および個々のサーボ間で異なることに注意してください。そのため、サーボをいじって調整してください。これで、サーボを配置するコマンドを適用する準備が整いました。サーボを完全に左の位置にしたい場合は、DutyCycle を 5% に設定する必要があります。次のコマンドでそれを行います。
pwm.start(5)
これにより、PWM 信号が開始され、5% に設定されます。前のコマンドで pwm オブジェクトを作成したときに、50 Hz 信号を指定したことを思い出してください。位置を変更したい場合は、DutyCycle を変更できます。たとえば、中間の位置に移動したい場合は、次のコマンドで取得できる 7.5 の DutyCycle が必要です。
pwm.ChangeDutyCycle(7.5)
ここで、完全に正しい位置が必要な場合は、デューティ サイクルを 10 に設定します。これは、次のコマンドで取得できます。
pwm.ChangeDutyCycle(10)
実際にサーボ位置を制御するのは DutyCycle ではなく、PulseWidth であることを思い出してください。目的の PulseWidth を提供するために DutyCycles を作成しています。
ここで、特定のサーボをいじってから、完全な左位置と完全な右位置につながる特定の DutyCycles を見つけます。私のサーボでは、左いっぱいが DutyCycle=2、右いっぱいが DutyCycle=12 であることがわかりました。これらの値を使用して、0 から 180 までの任意の角度を与える線形方程式を作成できます。これにより、Raspberry Pi は Arduino のシンプルで直感的な操作のように動作します。
線形方程式を実行するには、2 つの点が必要です。目的の角度 0 を得るには、DutyCycle を 2 に設定する必要があることはわかっています。これが点 (0,2) になります。これで、目的の角度 180 を得るには、DutyCycle を 12 に設定する必要があることもわかりました。これが点 (180,12) になります。これで 2 つの点ができ、直線の方程式を計算できます。(覚えておいてください、あなたのサーボで遊んでください...あなたの数値は私のものとは少し異なるかもしれませんが、あなたの2つのポイントを使用すれば以下の方法論はうまくいきます)
線の傾きは次のようになります。
m=(y2-y1)/(x2-x1)=(12-2)/180-0)=10/180 = 1/18
点の傾きの式を使用して、直線の方程式を取得できるようになりました。
y-y1=m(x-x1)
y-2=1/18*(x-0)
y = 1/18*x + 2
実際の変数を入れると、
デューティサイクル = 1/18* (望ましい角度) + 2
その位置に変更するには、次のコマンドを使用するだけです。
pwm.ChangeDutyCycle(DutyCycle)
詳細は http://www.toptechboy.com/raspberry-pi/raspberry-pi-lesson-28-controlling-a-servo-on-raspberry-pi-with-python/#sthash.LRmf7708.dpufを参照してください。