TOPに戻る

gpiozeroライブラリ入門⑫import Servo

 前回まではDCブラシありモータを駆動するHブリッジICを使いました。ここでは、ラジコンや小さなロボットに使われるサーボ・モータのクラスServoを利用します。産業用機器の位置決めなどに用いられるモータもサーボ・モータと呼ばれますが、異なるジャンルです。

 サーボ・モータはPWM信号を使います。HブリッジでもPWM信号を使いましたが、中身はまったく異なります。サーボ・モータのPWMは周期が業界でほぼ決まっており、回転角度(軸に取り付けられたホーンの動き)はHighのパルス幅で決定されます。Hブリッジのようにデューティ比で回転数を制御するのではありません。

クラスServo

class gpiozero.Servo(pin, *, initial_value=0, min_pulse_width=1/1000, max_pulse_width=2/1000, frame_width=20/1000, pin_factory=None)

 CompositeDeviceを拡張し、GPIOピンに接続されたPWM制御のサーボ・モータを使う。3本のケーブルは次の接続をする。

  • 電源(バッテリ・パックや5Vピンなど)をサーボの電源ケーブル(通常は赤色)に
  • サーボのアース・ケーブル(通常は黒または茶色)をバッテリ・パックのマイナスまたはGNDピンに
  • 最後のケーブル(通常は白またはオレンジ色)を、サーボの制御に使用するGPIOピンに

パラメータ;
 pin (int or str) – サーボが接続されているGPIOピン。 有効なピン番号、ピン番号を参照。 これがNoneの場合、GPIODeviceErrorが発生する。
 initial_value (float) – 0(デフォルト)の場合、デバイスの中間点が最初に設定される。 -1から1までの値は、初期位置として指定できる。 Noneは、制御されていないサーボを開始することを意味する(値を参照)。
 min_pulse_width (float) – サーボの最小位置に対応するパルス幅。 デフォルトは1ms。
 max_pulse_width (float) – サーボの最大位置に対応するパルス幅。 デフォルトは2ms.
 frame_width (float) – 秒単位で測定されたサーボ制御パルス間の時間の長さ。 デフォルトは20msであり、これはサーボの一般的な値。
 pin_factory (Factory or None) – APIの解説を読む。

detach()

 サーボの制御を一時的に無効にする。これは、値を「なし」に設定することと同じ。

max()

 サーボを最大位置に設定する。

mid()

 サーボを中点位置に設定する。

min()

 サーボを最小位置に設定する。

frame_width

 制御パルス間の時間。単位は秒。

is_active

 複合デバイスは、その構成デバイスのいずれかに「真の」値がある場合、「アクティブ」と見なされる。

max_pulse_width

 サーボの最大位置に対応する制御パルス幅(単位は秒)。

min_pulse_width

 サーボの最小位置に対応する制御パルス幅。(単位は秒)。

pulse_width

 サーボを制御する現在のパルス幅を返す。

value

 サーボの位置を-1(最小位置)から1(最大位置)までの値で表す。これは、サーボが現在「制御されていない」こと、つまり制御信号が送信されていないことを示す特別な値Noneにもできる。通常、これはサーボの位置は変更されないままだが、手動で移動できることを意味する。

接続

 GPIO17に信号を出しています。使用したモータは、電源は3.3V、5Vのどちらでも動きました。

プログラム

 min、mid、maxの三か所にホーンを動かします。すこしプルプルと震えているのが気になります。


from gpiozero import Servo
from time import sleep,time

motor = Servo(17)

while 1:
    motor.min()
    sleep(1)
    motor.mid()
    sleep(1)
    motor.max()
    sleep(1)
    motor.mid()
    sleep(1)

 つなぐサーボ・モータを増やしていきました。4台です。問題なく動きました。最大接続数は不明です。


from gpiozero import Servo
from time import sleep

motor = Servo(17)
motor1 = Servo(27)
motor2 = Servo(21)
motor3 = Servo(20)
while 1:
    motor.min()
    motor1.min()
    motor2.min()
    motor3.min()
    sleep(1)
    motor.mid()
    motor1.mid()
    motor2.mid()
    motor3.mid()
    sleep(1)
    motor.max()
    motor1.max()
    motor2.max()
    motor3.max()
    sleep(1)
    motor.mid()
    motor1.mid()
    motor2.mid()
    motor3.mid()
    sleep(1)


波形

 周期の実測値は20msです。

 min()、mid()、max()の周期です。それぞれ1.05ms、1.65ms、2.1msでした。

 いずれも、業界の標準に近い値です。

連載 gpiozeroライブラリ入門

- OutputDevice -

(1) LED その1 (2) LED その2 (3) PWMLED (4) RGBLED

(5) Buzzer (6) TonalBuzzer

(7) Motor その1 BD65496 (8) その2 TB67H420FTG (9) その3 TB6612 (10) その4 MC33926 (11) PhaseEnableMotor DRV8835

(12) Servo (13) AngularServo