回転センサー付モーター

pupmotors

図 2 回転センサー付の Powered Up モーター。矢印はデフォルトの正方向を示します。内蔵モーターのデフォルトの方向については、 hubs モジュールを参照してください。

Amotoronwith forward
class Motor(port, positive_direction=Direction.CLOCKWISE, gears=None, reset_angle=True, profile=None)

LEGO® 回転センサー付の Powered Up モーター。

パラメータ:
  • port (Port) -- モーターが接続されているポート。

  • positive_direction (Direction) -- 正の速度値または角度を与えたときに、モーターがどの方向に回転すべきかを指定します。

  • gears (list) -- モーターに接続している歯車のリスト。モーターに直接接続している歯車をリストの最初に指定し、出力側に接続している歯車をリストの最後に指定します。たとえば [12, 36] は、モーターに直接接続している12歯の歯車と、出力側に接続している36歯の歯車を持つ歯車列を表します。複数の歯車列を扱う際には [[12, 36], [20, 16, 40]] のようにリストのリストを使います。歯車列を指定すると、すべてのモーターコマンドと設定は、結果として生じる歯車比を考慮して自動的に調整されます。モータの方向はこれによって変更されません。

  • reset_angle (bool) -- True を指定すると、回転センサーの値が絶対マーカー角(-180 から 179 の間)にリセットされます。 False を指定すると、現在の値が維持され、プログラムは前回の終了点を知ることができます。

  • profile (Number, deg) -- 精密プロファイル。これは、あなたのアプリケーションで許容される角度の位置許容差のおおよその値です。低い値はより精密ながら不規則な動きを提供しますが、高い値はより滑らかながら精度の低い動きを提供します。値が指定されていない場合、このモータータイプに適したプロファイルが自動的に選択されます(約11°)

計測

motorgetangle
angle() int: deg

モーターの回転角を取得します。

戻り値:

モーターの回転角。

motor0°reset angle to
reset_angle(angle=None)

モータの累積回転角を任意の値に設定します。

このモーターがドライブベースでも使われている場合、その距離および角度の値にも影響を与えます。そのため、代わりに reset メソッドの利用を推奨します。

パラメータ:

angle (Number, deg) -- リセットする角度の値を指定します。モーターの絶対値にリセットするには None を指定します。

motorgetspeed
100msmotorgetaverage speedduring
speed(window=100) int: deg/s

モーターのスピードを取得します。

速度は、与えられたタイムウィンドウの間のモーター角度の変化として測定されます。ウィンドウを短くすると、速度値はモータの動きに反応しやすくなりますが、安定性は低下します。長いウィンドウを使用すると、速度値はモータの動きに反応しにくくなりますが、より安定した値になります。

パラメータ:

window (Number, ms) -- 速度を決定するために使用されるタイムウィンドウ。

戻り値:

モーターのスピード。

motorgetload
load() int: mNm

モーターが動こうとしたときに、それを押しとどめる荷重を見積もります。

戻り値:

負荷トルク。

motorgetstalled
stalled() bool

現在、モータが失速状態なのかを確認します。

最大動作信号でも目標速度や位置に到達できない場合、失速していることになります。

戻り値:

モータが失速している場合は True 、失速していない場合は False

停止

motorcoaststop
stop()

モーターを停止し、惰性で回転するままにします。

モーターは摩擦により徐々に停止します。

motorbrakestop
brake()

モータに受動的にブレーキをかけます。

摩擦による停止に加え、モータが動いている間に発生した電圧で停止します。

motorholdstop
hold()

モータを停止し、現在の角度に能動的に維持します。

無限動作

motor500°/srun atforever
run(speed)

モーターを一定速度で回転させます。

指定された速度まで加速し、新たな指令を出すまでこの速度で動き続けます。

パラメータ:

speed (Number, deg/s) -- モーターの速度。

motor50%power atduty cycle
dc(duty)

指定のデューティ比(「パワー」とも言います)でモーターを回転させます。

パラメータ:

duty (Number, %) -- デューティ比 (-100.0 から 100 の間)。

一定量の動作

awaitrun_time(speed, time, then=Stop.HOLD, wait=True)

モータを一定速度で一定時間回転させます。

与えられた速度まで加速し、その速度で走り続け、その後減速します。全動作は指定した時間(time)だけ続きます。

パラメータ:
  • speed (Number, deg/s) -- モーターの速度。

  • time (Number, ms) -- 動作時間。

  • then (Stop) -- 停止した後の挙動。

  • wait (bool) -- 動作が完了するのを待ってから、プログラムの続きを実行するのかの指定。

360°holdmotor500°/srun atbythen
awaitrun_angle(speed, rotation_angle, then=Stop.HOLD, wait=True)

モーターを一定速度で指定の角度だけ回転させます。

パラメータ:
  • speed (Number, deg/s) -- モーターの速度。

  • rotation_angle (Number, deg) -- モーターを回転させる角度。

  • then (Stop) -- 停止した後の挙動。

  • wait (bool) -- 動作が完了するのを待ってから、プログラムの続きを実行するのかの指定。

360°holdmotor500°/srun attowardsthen
awaitrun_target(speed, target_angle, then=Stop.HOLD, wait=True)

指定した目標角度に向かって一定速度でモーターを回転させます。

回転方向は、目標角度に応じて自動的に選択されます。速度(speed)は正で負でもかまいません。

パラメータ:
  • speed (Number, deg/s) -- モーターの速度。

  • target_angle (Number, deg) -- モーターが回転すべき角度(deg)。

  • then (Stop) -- 停止した後の挙動。

  • wait (bool) -- モーターが目標角度に到達するのを待ってから、残りのプログラムを続行するかの指定。

50%coastmotor500°/srun atto end stopwith power limitthen
awaitrun_until_stalled(speed, then=Stop.COAST, duty_limit=None) int: deg

モータが失速するまで一定速度で動作させます。

パラメータ:
  • speed (Number, deg/s) -- モーターの速度。

  • then (Stop) -- 停止した後の挙動。

  • duty_limit (Number, %) -- このコマンドの実行中のデューティ比制限値(%)。ギヤ機構やレバー機構にモータトルクをフルにかけないようにする場合に有効です。 None の場合、このコマンド実行中のデューティ制限を変更しません。

戻り値:

モーターが失速した角度。

motor90°track
track_target(target_angle)

目標角度を追跡します。これは run_target() と似ていますが、通常の滑らかな加速はスキップし、できるだけ速く目標角度に移動します。この方法は、目標角度を連続的に変化させたい場合に有効です。

パラメータ:

target_angle (Number, deg) -- モーターが回転すべき目標角度。

done() bool

実行中のコマンドや操作が完了したかどうかをチェックします。

戻り値:

完了した場合は True 、完了していない場合は False

モーターの設定

9000mVmotorconfiguremaximum voltage
settings(max_voltage)
settings() Tuple[int]

モータの設定を行います。引数を与えない場合は、現在の値を返します。

パラメータ:

max_voltage (Number, mV) -- すべてのモーターコマンドの間、モーターにかかる最大電圧。

close()

モーターオブジェクトを閉じます。新しいオブジェクトを初期化するには Motor を再度呼び出す必要があります。

これにより、上級ユーザはプログラムの途中でギアリングなどのプロパティを変更できるようになり、取り外し可能なアタッチメント用に便利です。

制御の設定

1000°/smotorconfiguremaximum speed
2000°/s²motorconfigureacceleration
200mNmmotorconfiguremaximum torque
control.limits(speed, acceleration, torque)
control.limits() Tuple[int, int, int]

最大の速度、加速度、トルクを設定します。

引数を指定しない場合は、現在の値を返します。

新しい加速度(acceleration)と速度(speed)の制限は、新しいモーターコマンドを入力したときに有効になります。実行中の操作には影響しません。

パラメータ:
  • speed (Number, deg/s or Number, mm/s) -- 最大速度。すべての速度コマンドはこの値に制限されます。

  • acceleration (Number, deg/s² or Number, mm/s²) -- 加速または減速時の速度曲線の傾き。加速と減速を別々に設定するには、タプルを使います。1つの値を指定した場合には、加速と減速は両方に適用されます。

  • torque (トルク: mNm) -- 制御中の最大フィードバックトルク。

control.pid(kp, ki, kd, integral_deadzone, integral_rate)
control.pid() Tuple[int, int, int, int, int]

位置および速度制御のためのPID値を取得または設定します。

引数を指定しない場合は、現在の値を返します。

パラメータ:
  • kp (int) -- 比例位置制御定数。誤差1度あたりのフィードバックトルク: μNm/deg。

  • ki (int) -- 積分位置制御定数。累積誤差1度あたりのフィードバックトルク: µNm/(deg s)。

  • kd (int) -- 微分位置(または比例速度)制御定数。単位速度あたりのフィードバックトルク: µNm/(deg/s)。

  • integral_deadzone (Number, deg or Number, mm) -- 誤差積分がエラーを蓄積しないターゲットまわりのゾーン。

  • integral_rate (Number, deg/s or Number, mm/s) -- 誤差積分値の最大速度。

50°/s11°motorconfiguretolerancesspeedangle
control.target_tolerances(speed, position)
control.target_tolerances() Tuple[int, int]

動作がいつ終了するかという公差を取得または設定します。

引数を指定しない場合は、現在の値を返します。

パラメータ:
  • speed (Number, deg/s or Number, mm/s) -- 運動が完了したとみなす速度ゼロからの許容誤差。

  • position (Number, deg or 距離: mm) -- 運動が完了したとみなす目標位置からのずれ。

control.stall_tolerances(speed, time)
control.stall_tolerances() Tuple[int, int]

失速の許容値を取得または設定します。

引数を指定しない場合は、現在の値を返します。

パラメータ:
  • speed (Number, deg/s or Number, mm/s) -- コントローラを最大に動作させても、この速度にしばらく到達できない場合、失速となります。

  • time (Number, ms) -- コントローラがこの最低速度(speed)を下回ってから失速したと言うまでの時間。

control.scale

ギア列の出力で1度を完成させるためにモータが回転する度数。モータの初期化時に引数 gears から求めたギア比になります。

バージョン 3.2 で変更: done(), stalled(), load() メソッドは移されました。

model.state() Tuple[float, float, float, bool]

実際のモータを模倣したシミュレーションモデルを用いて、モータの角度、速度、電流、失速状態の推定値を取得します。これらの推定値は実際の測定値よりも高速に更新されるため、独自のPIDコントローラを構築する際に有用です。

ほとんどのアプリケーションでは、代わりに計測した angle, speed, load, stall を使った方がよいでしょう。

戻り値:

推定した角度(deg)、速度(deg/s)、電流(mA)、失速状態を表すタプル。

model.settings(values)
model.settings() Tuple

モデル設定を整数のタプルとして取得または設定します。引数が与えられていない場合は、現在の値が返されます。このメソッドは主にモーターモデルクラスのデバッグに使われます。ユーザープログラムでは、これらの設定を変更する必要はないはずです。

パラメータ:

values (Tuple) -- model settings を持つタプル。

初期化の例

モーターを前後に動作

from pybricks.pupdevices import Motor
from pybricks.parameters import Port
from pybricks.tools import wait

# ポート A に繋いだモーターの初期化。
example_motor = Motor(Port.A)

# モーターを時計回りに 500°/s で動作させる。
example_motor.run(500)

# 3秒待機。
wait(3000)

# モーターを反時計回りに 500°/s で動作させる。
example_motor.run(-500)

# 3秒待機。
wait(3000)

複数のモーターの初期化

from pybricks.pupdevices import Motor
from pybricks.parameters import Port
from pybricks.tools import wait

# ポート A と B に繋いだ2つのモーターの初期化。
track_motor = Motor(Port.A)
gripper_motor = Motor(Port.B)

# 両方のモーターを 500°/s 動かす。
track_motor.run(500)
gripper_motor.run(500)

# 3秒待機。
wait(3000)

正方向を反時計回りに設定

from pybricks.pupdevices import Motor
from pybricks.parameters import Port, Direction
from pybricks.tools import wait

# ポート A に繋いだモーターについて、反時計回りを正方向を
# とするように初期化。
example_motor = Motor(Port.A, Direction.COUNTERCLOCKWISE)

# 正の速度値を指定すると、モータは今度は反時計回りに回転。
example_motor.run(500)

# これは、モーターが逆向きに取り付けられている場合や、逆さまに取り付けられている
# 場合に有効です。正方向を変更することで、正の速度値でロボットやメカが前進する
# ようになり、スクリプトが読みやすくなります。

# 3秒待機。
wait(3000)

ギアの利用

from pybricks.pupdevices import Motor
from pybricks.parameters import Port, Direction
from pybricks.tools import wait

# ポート A に繋いだモーターについて、反時計回りを正方向とするように初期化。
# また、12歯と36歯のギアを持つギア列を1つ指定。12歯のギアはモータ軸に取り付け、
# 36歯のギアは出力軸に取り付けている。geared_motor = Motor(Port.A, Direction.COUNTERCLOCKWISE, [12, 36])

# 出力軸は1秒間に100度回転するようにする。モータの回転数は、ギアを補正するために
# 自動的に増加する。
geared_motor.run(100)

# 3秒待機。
wait(3000)

計測の例

角度と速度の計測

from pybricks.pupdevices import Motor
from pybricks.parameters import Port
from pybricks.tools import wait

# ポート A に繋いだモーターを初期化。
example_motor = Motor(Port.A)

# 300°/s で動作を開始。
example_motor.run(300)

# 角度と速度を100回表示。
for i in range(100):

    # 角度(度)と速度(度/s)を取得。
    angle = example_motor.angle()
    speed = example_motor.speed()

    # 取得した値を表示。
    print(angle, speed)

    # 何が表示されているかが分かるよう、少し待機。
    wait(200)

計測角度のリセット

from pybricks.pupdevices import Motor
from pybricks.parameters import Port

# ポート A に繋いだモーターを初期化。
example_motor = Motor(Port.A)

# 角度を 0 にリセット。
example_motor.reset_angle(0)

# 角度を 1234 にリセット。
example_motor.reset_angle(1234)

# 角度を絶対角度にリセットします。
# 絶対エンコーダーを搭載しているモーターにのみ対応しています。
# その他のモーターでは、エラーが発生します。
example_motor.reset_angle()

絶対角度の取得

from pybricks.pupdevices import Motor
from pybricks.parameters import Port
from pybricks.tools import wait

# ポート A に繋いだモーターを初期化。
example_motor = Motor(Port.A)

while True:

    # デフォルトの角度を取得。
    angle = example_motor.angle()

    # 0 から 360 度の間で角度を取得。
    absolute_angle = example_motor.angle() % 360

    # -180 から 179 度の間で角度を取得。
    wrapped_angle = (example_motor.angle() + 180) % 360 - 180

    # 結果を表示。
    print(angle, absolute_angle, wrapped_angle)
    wait(100)

動作の例

すべての run メソッドの基本的な使い方

from pybricks.pupdevices import Motor
from pybricks.parameters import Port
from pybricks.tools import wait

# Initialize a motor on port A.
example_motor = Motor(Port.A)

# Run at 500 deg/s and then stop by coasting.
print("Demo of run")
example_motor.run(500)
wait(1500)
example_motor.stop()
wait(1500)

# Run at 50% duty cycle ("power") and then stop by coasting.
print("Demo of dc")
example_motor.dc(50)
wait(1500)
example_motor.stop()
wait(1500)

# Run at 500 deg/s for two seconds.
print("Demo of run_time")
example_motor.run_time(500, 2000)
wait(1500)

# Run at 500 deg/s for 90 degrees.
print("Demo of run_angle")
example_motor.run_angle(500, 90)
wait(1500)

# Run at 500 deg/s back to the 0 angle
print("Demo of run_target to 0")
example_motor.run_target(500, 0)
wait(1500)

# Run at 500 deg/s back to the -90 angle
print("Demo of run_target to -90")
example_motor.run_target(500, -90)
wait(1500)

# Run at 500 deg/s until the motor stalls
print("Demo of run_until_stalled")
example_motor.run_until_stalled(500)
print("Done")
wait(1500)

動作を停止させるさまざまな方法

from pybricks.pupdevices import Motor
from pybricks.parameters import Port
from pybricks.tools import wait

# ポート A に繋いだモーターを初期化。
example_motor = Motor(Port.A)

# 500°/s で動作後、惰性で停止。
example_motor.run(500)
wait(1500)
example_motor.stop()
wait(1500)

# 500°/s で動作後、ブレーキで停止。
example_motor.run(500)
wait(1500)
example_motor.brake()
wait(1500)

# 500°/s で動作後、現状角度維持で停止。
example_motor.run(500)
wait(1500)
example_motor.hold()
wait(1500)

# 500°/s で動作後、速度を 0 にすることで停止。
# Run at 500 deg/s and then stop by running at 0 speed.
example_motor.run(500)
wait(1500)
example_motor.run(0)
wait(1500)

動作コマンドの停止方法に then 引数を使う方法

from pybricks.pupdevices import Motor
from pybricks.parameters import Port, Stop
from pybricks.tools import wait

# ポート A に繋いだモーターを初期化。
example_motor = Motor(Port.A)

# デフォルトで、モーターは角度を維持する。
# つまり、角度を補正し続ける。
example_motor.run_angle(500, 360)
wait(1000)

# これは上のものと全く同じ。
example_motor.run_angle(500, 360, then=Stop.HOLD)
wait(1000)

# ブレーキをかけることもできる。これは多少の抵抗を加えるが、
# 動いてしまった分を元に戻しません。
example_motor.run_angle(500, 360, then=Stop.BRAKE)
wait(1000)

# この指定で、モーターは停止後に自由に惰性で動く。
example_motor.run_angle(500, 360, then=Stop.COAST)
wait(1000)

失速に関する例

機構的な終点までモータを回転させる

from pybricks.pupdevices import Motor
from pybricks.parameters import Port

# ポート A に繋いだモーターを初期化。
example_motor = Motor(Port.A)

# すべてのコマンドで200°/sの速度を使うことにする。
speed = 200

# 機械的な停止までモーターを逆回転させる。
# duty_limit=30 の設定は、機械的な停止に対して最大トルクの30%
# しかかけないことを意味する。このようにすることで、あまり強い力をかけ
# すぎないようにできる。
example_motor.run_until_stalled(-speed, duty_limit=30)

# これにより角度が0になるたびに、機械的な停止になったことが分かる。
example_motor.reset_angle(0)

# 今度は、モーターをループで前後進させる。
# 常に機械的な終点からスタートするので、
# モータの初期角度に関係なく同じように動作する。
for count in range(10):
    example_motor.run_target(speed, 180)
    example_motor.run_target(speed, 90)

ステアリング機構のセンタリング

from pybricks.pupdevices import Motor
from pybricks.parameters import Port
from pybricks.tools import wait

# ポート A に繋いだモーターを初期化。
example_motor = Motor(Port.A)

# まず、前の例を参照。この例では2つの端点を求め、真ん中をゼロ点としている。

# run_until_stalled で失速した角度を出している。
# これで、知りたい両端点での角度が得られる。
left_end = example_motor.run_until_stalled(-200, duty_limit=30)
right_end = example_motor.run_until_stalled(200, duty_limit=30)

# 一番右の端点に移動している。そこで、この角度をリセットして、2つの
# 端点間の距離の半分にすればいい。
# そうすると、真ん中が0度に対応する。
example_motor.reset_angle((right_end - left_end) / 2)

# こうすれば、ゼロに向かって動かすだけで真ん中に到することができる。
example_motor.run_target(200, 0)

wait(1000)

並列動作の例

並列動作させるのに wait 引数を使う例

from pybricks.pupdevices import Motor
from pybricks.parameters import Port

# ポート A と B に繋いだ2つのモーターの初期化。
track_motor = Motor(Port.A)
gripper_motor = Motor(Port.B)

# 走行用モーターの動作を開始するが、
# 動作の終了は待たない。
track_motor.run_angle(500, 360, wait=False)

# ここで、旋回用モーターを回転させる。
# つまり、走行用と同時に動くことになる。
gripper_motor.run_angle(200, 720)

2つの並列動作の完了待機

from pybricks.pupdevices import Motor
from pybricks.parameters import Port
from pybricks.tools import wait

# ポート A と B に繋いだ2つのモーターの初期化。
track_motor = Motor(Port.A)
gripper_motor = Motor(Port.B)

# 両方のモーターを wait=False で動作をさせる。
track_motor.run_angle(500, 360, wait=False)
gripper_motor.run_angle(200, 720, wait=False)

# 片方または両方のモーターがまだ終わらない間に 他のことをする。
# この例では、ただ待つだけ。
while not track_motor.done() or not gripper_motor.done():
    wait(10)

print("Both motors are done!")