0

私が持っているサーボを制御できないという問題があります。私は2つのサーボを持っています。1つは模型飛行機で使用される通常のサーボで、もう1つはマイクロサイズのサーボです。

両方を別々に配線しました(GPIOピンへの信号ケーブルと、最初にボードに直接、次に外部電源に他の2本のケーブル)。同様のpythonコードを介してそれらを実行しようとすると

...
GPIO.setmode(GPIO.BCM)
GPIO.setup(11, GPIO.OUT)
pwm = GPIO.PWM(11, 50)
pwm.start(2)
timelib.sleep(2)
pwm.ChangeDutyCycle(3)
timelib.sleep(2)
...

サーボは時々少しだけ回転しますが、その後片側で停止します。その後も、サーボがさらに実行しようとしているようなノイズが聞こえます。それが最後まで回った後、私はそれを機能させることも、決して回すこともできません。私がどんな入力をしても、そこにとどまります。手動で開始位置に戻すと、再び同じ端に戻ります。何が間違っているのか、どこでやり方を変える必要があるのか​​ わかりません。

誰かが何かヒントを持っているか、同様の問題を抱えていましたか? 今後のすべてのヒントとさらなるステップに感謝します。

前もって感謝します!

4

2 に答える 2

0

サーボの位置は、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を参照してください。

于 2015-10-26T21:11:38.743 に答える