| ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|---|
回転センサー付モーター¶
図 2 回転センサー付の Powered Up モーター。矢印はデフォルトの正方向を示します。内蔵モーターのデフォルトの方向については、 hubs モジュールを参照してください。¶
- 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°)
計測
- angle() int: deg¶
モーターの回転角を取得します。
- 戻り値:
モーターの回転角。
- reset_angle(angle=None)¶
モータの累積回転角を任意の値に設定します。
角度を指定しない場合、モーターが対応していれば絶対角度が適用されます。
- パラメータ:
angle (Number, deg) -- リセットする角度の値。
- speed(window=100) int: deg/s¶
モーターのスピードを取得します。
速度は、与えられたタイムウィンドウの間のモーター角度の変化として測定されます。ウィンドウを短くすると、速度値はモータの動きに反応しやすくなりますが、安定性は低下します。長いウィンドウを使用すると、速度値はモータの動きに反応しにくくなりますが、より安定した値になります。
- パラメータ:
window (Number, ms) -- 速度を決定するために使用されるタイムウィンドウ。
- 戻り値:
モーターのスピード。
- load() int: mNm¶
モーターが動こうとしたときに、それを押しとどめる荷重を見積もります。
- 戻り値:
負荷トルク。
- stalled() bool¶
現在、モータが失速状態なのかを確認します。
最大動作信号でも目標速度や位置に到達できない場合、失速していることになります。
- 戻り値:
モータが失速している場合は
True、失速していない場合はFalse。
停止
- stop()¶
モーターを停止し、惰性で回転するままにします。
モーターは摩擦により徐々に停止します。
- brake()¶
モータに受動的にブレーキをかけます。
摩擦による停止に加え、モータが動いている間に発生した電圧で停止します。
- hold()¶
モータを停止し、現在の角度に能動的に維持します。
無限動作
- run(speed)¶
モーターを一定速度で回転させます。
指定された速度まで加速し、新たな指令を出すまでこの速度で動き続けます。
- パラメータ:
speed (Number, deg/s) -- モーターの速度。
一定量の動作
- awaitrun_time(speed, time, then=Stop.HOLD, wait=True)¶
モータを一定速度で一定時間回転させます。
与えられた速度まで加速し、その速度で走り続け、その後減速します。全動作は指定した時間(
time)だけ続きます。
- awaitrun_target(speed, target_angle, then=Stop.HOLD, wait=True)¶
指定した目標角度に向かって一定速度でモーターを回転させます。
回転方向は、目標角度に応じて自動的に選択されます。速度(
speed)は正で負でもかまいません。
- track_target(target_angle)¶
目標角度を追跡します。これは
run_target()と似ていますが、通常の滑らかな加速はスキップし、できるだけ速く目標角度に移動します。この方法は、目標角度を連続的に変化させたい場合に有効です。- パラメータ:
target_angle (Number, deg) -- モーターが回転すべき目標角度。
モーターの設定
- settings(max_voltage)¶
- settings() Tuple[int]
モータの設定を行います。引数を与えない場合は、現在の値を返します。
- パラメータ:
max_voltage (Number, mV) -- すべてのモーターコマンドの間、モーターにかかる最大電圧。
- close()¶
モーターオブジェクトを閉じます。新しいオブジェクトを初期化するには
Motorを再度呼び出す必要があります。これにより、上級ユーザはプログラムの途中でギアリングなどのプロパティを変更できるようになり、取り外し可能なアタッチメント用に便利です。
制御の設定
❌ ✅ ✅ ✅ ✅ ✅ - control.limits(speed, acceleration, torque)¶
- control.limits() Tuple[int, int, int]
最大の速度、加速度、トルクを設定します。
引数を指定しない場合は、現在の値を返します。
新しい加速度(
acceleration)と速度(speed)の制限は、新しいモーターコマンドを入力したときに有効になります。実行中の操作には影響しません。
❌ ✅ ✅ ✅ ✅ ✅ - 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) -- 誤差積分値の最大速度。
❌ ✅ ✅ ✅ ✅ ✅ - control.target_tolerances(speed, position)¶
- control.target_tolerances() Tuple[int, int]
動作がいつ終了するかという公差を取得または設定します。
引数を指定しない場合は、現在の値を返します。
❌ ✅ ✅ ✅ ✅ ✅ - control.stall_tolerances(speed, time)¶
- control.stall_tolerances() Tuple[int, int]
失速の許容値を取得または設定します。
引数を指定しない場合は、現在の値を返します。
❌ ✅ ✅ ✅ ✅ ✅ - control.scale¶
ギア列の出力で1度を完成させるためにモータが回転する度数。モータの初期化時に引数
gearsから求めたギア比になります。
❌ ✅ ✅ ✅ ✅ ✅ - 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
# ポート A に繋いだモーターを初期化。
example_motor = Motor(Port.A)
# 500°/s で動作後、惰性で停止。
print("Demo of run")
example_motor.run(500)
wait(1500)
example_motor.stop()
wait(1500)
# Run at 70% のデューティ比("パワー")で動作後、惰性で停止。
print("Demo of dc")
example_motor.dc(50)
wait(1500)
example_motor.stop()
wait(1500)
# 500°/s で2秒間動作。
print("Demo of run_time")
example_motor.run_time(500, 2000)
wait(1500)
# 500°/s で 90° になるまで動作。
print("Demo of run_angle")
example_motor.run_angle(500, 90)
wait(1500)
# 500°/s で 0° に戻るまで動作。
print("Demo of run_target to 0")
example_motor.run_target(500, 0)
wait(1500)
# 500°/s で -90° に戻るまで動作。
print("Demo of run_target to -90")
example_motor.run_target(500, -90)
wait(1500)
# 500°/s でモーターが失速するまで動作。
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!")