ムーブハブ

../_images/movehub.png

../_images/pybricks_variables_set_move_hub_option0.svg

../_images/pybricks_variables_set_move_hub_option4.svg

class MoveHub(top_side=Axis.Z, front_side=Axis.X, broadcast_channel=0, observe_channels=[])

LEGO® ブースト ムーブハブ。

パラメータ:
  • top_side (Axis) -- ハブの上面を通る軸。

  • front_side (Axis) -- ハブの前面を通る軸。

  • broadcast_channel -- hub.ble.broadcast() が使うチャンネルを示す0から255の値。デフォルトのチャンネルは0です。

  • observe_channels -- hub.ble.observe() が呼び出された際にリッスンするチャンネルのリスト。より多くのチャンネルをリッスンすると、より多くのメモリが必要になります。デフォルトは空のリスト(チャンネルなし)です。

バージョン 3.3 で変更: broadcast_channelobserve_channels 引数を追加。

ハブ内蔵ステータスライトの利用

../_images/pybricks_blockLightOnColor_movehub_on.svg

light.on(color)

指定の色でライトを点灯します。

パラメータ:

color (Color) -- ライトの色。

../_images/pybricks_blockLightOnColor_movehub_off.svg

light.off()

ライトの消灯。

指定の色で、指定の時間だけライトを点灯・消灯して点滅させます。

プログラムの残りの部分が動作している間、ライトは無限に点滅し続けます。

このメソッドは、基本的で、よく使うパターンを作成する簡易な方法を提供します。より一般的で複数色のパターンを作成するには、代わりに animate() を使用してください。

パラメータ:
  • color (Color) -- ライトの色。

  • durations (list) -- 時間のシーケンスを [on_1, off_1, on_2, off_2, ...] の形式で指定。

light.animate(colors, interval)

指定の間隔で1つずつ表示される色のシーケンスでライトをアニメートします。

このアニメーションはバックグラウンドで実行され、プログラムの他の部分は継続的に実行されます。アニメーションが完了すると、繰返し実行します。

パラメータ:
  • colors (list) -- Color の値のシーケンス。

  • interval (Number, ms) -- 色の更新間隔。

IMU の利用

../_images/pybricks_blockImuUp_MoveHub.svg

imu.up() Side

現在、ハブのどちらの面を上に向けているかをチェックします。

戻り値:

Side.TOP, Side.BOTTOM, Side.LEFT, Side.RIGHT, Side.FRONT, Side.BACK のいずれか。

../_images/pybricks_blockTilt_MoveHub_imu.tilt.pitch.svg

../_images/pybricks_blockTilt_MoveHub_imu.tilt.roll.svg

imu.tilt() Tuple[int, int]

ピッチ角とロール角を取得します。これは、 user-specified neutral orientation からの相対的なものです。

回転の順序は、ピッチ角、ロール画です。これはロボットのY軸に沿った正回転と、X軸に沿った正回転に相当します。

戻り値:

ピッチ角とロール角のタプル(度単位)。

../_images/pybricks_blockImuAcceleration_MoveHub.svg

imu.acceleration() Tuple[int, int, int]: mm/s²

デバイスの加速度を取得します。

戻り値:

3軸すべてのに沿った加速度

バージョン 3.2 で変更: 加速度の単位を m/s² から mm/s² に変更しました。

非接続 Bluetooth メッセージングの利用

../_images/pybricks_blockBleBroadcast_PrimeHub.svg

PrimeHub.ble.broadcast(data)

ハブ初期化時に選択した broadcast_channel で、指定データのブロードキャストを開始します。

データには、型 int, float, str, bytes, True, False のもの、もしくはそれらのリストを指定できます。

ブロードキャスト通信を停止するに None を指定します。ブロードキャスト通信が必要ない場合には、それを停止することによりパフォーマンスを向上させられます。同時にデータ観察をしている場合には特に便利です。

合計データサイズはかなり制限されています(26バイト)。 TrueFalse はそれぞれ1バイトを占有します。 float は5バイトを占有します。 int は数値の大きさに応じて2から5バイトを占有します。 strbytes はオブジェクトのバイト数に加えて1バイトを占有します。

マルチタスクを行う場合、ブロードキャスト通信は一度に1つのタスクでしかできません。複数のタスク(またはブロックスタック)からの情報をブロードキャストするには、ブロードキャスト通信用の専用タスクを用意して、他の複数タスクからの情報を送信するようにできます。

パラメータ:

data -- ブロードキャストする値、もしくは値のリスト。

バージョン 3.3 で追加.

../_images/pybricks_blockBleObserve_PrimeHub.svg

PrimeHub.ble.observe(channel) bool | int | float | str | bytes | tuple | None

指定したチャンネルで最後に観測されたデータを取得します。

ハブがコンピュータや他のデバイスに同時に接続しないようにすると、データを受信する信頼性が高くなります。

パラメータ:

channel (int) -- 観測するチャンネル(0から255)。

戻り値:

送信されたデータは、送信された形式と同じ形式で受信されます。最近のデータが利用できない場合は None が返されます。

バージョン 3.3 で追加.

ble.signal_strength(channel) int: dBm

指定したチャンネルの平均信号強度を dBm 単位で取得します。

これはブロードキャストデバイスがどれだけ近くにあるかを示します。近くのデバイスは約 -40 dBmの信号強度を持ち、遠くのデバイスは約 -70 dBmの信号強度を持ちます。

パラメータ:

channel (int) -- チャンネル番号(0から255)。

戻り値:

最近の観測データがない場合、信号強度は -128 となります。

バージョン 3.3 で追加.

ble.version() str

Bluetooth チップからファームウェアバージョンを取得します。

バージョン 3.3 で追加.

バッテリー値の利用

../_images/pybricks_blockBatteryMeasure_MoveHub_battery.voltage.svg

battery.voltage() int: mV

バッテリーの電圧を取得します。

戻り値:

バッテリーの電圧

../_images/pybricks_blockBatteryMeasure_MoveHub_battery.current.svg

battery.current() int: mA

バッテリーから供給される電流を取得します。

戻り値:

バッテリーの電流。

ボタンとシステム制御

../_images/pybricks_blockButtonIsPressed_PrimeHub.svg

buttons.pressed() Set[Button]

どのボタンが押されているかをチェックします。

戻り値:

押されているボタンの集合。

../_images/pybricks_blockHubStopButton_MoveHub.svg

../_images/pybricks_blockHubStopButton_MoveHub_none.svg

system.set_stop_button(button)

実行中のスクリプトを停止させるボタンまたはボタンの組み合わせを設定します。

デフォルトでは実行中のスクリプトを停止するのにセンターボタンを使います。この動作を変更または無効にして、センターボタンを他の用途に使えるようにできます。

パラメータ:

button (Button) -- Button.CENTER 、または複数のボタンのタプルを指定します。停止ボタンを完全に無効にするには None を指定します。望むなら、中央ボタンを3秒間押すことで、ハブをオフにできます。

system.name() str

ハブ名を取得します。これは Bluetooth で接続したときに表示される名前です。

戻り値:

ハブ名。

system.storage(offset, write=)
system.storage(offset, read=) bytes

バイナリデータを永続ストレージに読み書きします。

これにより、次にプログラムを実行するときに使えるデータを保存できます。

データは通常、ハブの電源をオフにしたときにフラッシュメモリーに保存されます。ハブを起動したままバッテリーを外すと保存されません。

一度保存されたデータは、バッテリーをを外しても残ります。

パラメータ:
  • offset (int) -- ユーザーストレージメモリの先頭からのオフセットをバイト数で指定します。

  • read (int) -- 読み込むバイト数。書出しの場合はこの引数を省略します。

  • write (bytes) -- 書き込むバイト数。読込み場合は、この引数を省略します。

戻り値:

読込み場合は読み込んだバイト数、書出しの場合は None

例外:

ValueError -- 許容範囲外のデータを読み書きしようとした場合。

このハブには最大128バイトのデータを保存できます。データは Pybricks のファームウェアをアップデートしたとき、または元のファームウェアに戻したときにクリアされます。

../_images/pybricks_blockHubShutdown_MoveHub.svg

system.shutdown()

プログラムを停止し、ハブをシャットダウンします。

system.reset_reason() int

ハブが(再)起動した理由と原因を調べます。これは、いくつかの問題を診断するのに役立ちます。

戻り値:

  • 0 ハブの電源が以前に正常に切られた。

  • 1 ファームウェアの更新後など、ハブが自動的に再起動した。

  • 2 ファームウェアの問題を示すウォッチドッグ・タイムアウトにより、以前にハブがクラッシュした。

ステータスライトの利用例

ライトの点灯と消灯

from pybricks.hubs import MoveHub
from pybricks.parameters import Color
from pybricks.tools import wait

# ハブを初期化。
hub = MoveHub()

# ライトの点灯と消灯を5回繰り返す。
for i in range(5):

    hub.light.on(Color.RED)
    wait(1000)

    hub.light.off()
    wait(500)

IMU の利用例

上がどっちかのテスト

from pybricks.hubs import MoveHub
from pybricks.parameters import Color, Side
from pybricks.tools import wait

# ハブを初期化。
hub = MoveHub()

# それぞれの側の色を辞書に定義。
SIDE_COLORS = {
    Side.TOP: Color.RED,
    Side.BOTTOM: Color.BLUE,
    Side.LEFT: Color.GREEN,
    Side.RIGHT: Color.YELLOW,
    Side.FRONT: Color.MAGENTA,
    Side.BACK: Color.BLACK,
}

# 検出した側を元に色を更新し続ける。
while True:

    # ハブの上になっている側をチェック。
    up_side = hub.imu.up()

    # 検出した側を元に色を変更。
    hub.light.on(SIDE_COLORS[up_side])

    # 結果の表示も行う。
    print(up_side)
    wait(50)

加速度の読取り

from pybricks.hubs import MoveHub
from pybricks.tools import wait

# ハブを初期化。
hub = MoveHub()

# 加速度のタプルを取得。
print(hub.imu.acceleration())

while True:
    # 角軸の個別の加速度を取得。
    x, y, z = hub.imu.acceleration()
    print(x, y, z)

    # 何がプリントされているかが確認できるように待機。
    wait(100)

Bluetooth の例

他のハブへのデータのブロードキャスト

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

# ハブを初期化。
hub = MoveHub(broadcast_channel=1)

# モーターを初期化。
left_motor = Motor(Port.A)
right_motor = Motor(Port.B)

while True:
    # 他のハブに送るモーター回転角度の読取り。
    left_angle = left_motor.angle()
    right_angle = right_motor.angle()

    # ブロードキャストするデータを設定。まだブロードキャストしていなければ開始。
    data = (left_angle, right_angle)
    hub.ble.broadcast(data)

    # ブロードキャストは100ミリ秒ごとにのみ送信するので、それ以上の頻度で
    # broadcast() メソッドを呼び出す理由はありません。
    wait(100)

他のハブからのデータ観測

from pybricks.hubs import MoveHub
from pybricks.pupdevices import Motor
from pybricks.parameters import Color, Port
from pybricks.tools import wait

# ハブを初期化。
hub = MoveHub(observe_channels=[1])

# モーターを初期化。
left_motor = Motor(Port.A)
right_motor = Motor(Port.B)

while True:
    # 他のハブからのブロードキャストの受信。

    data = hub.ble.observe(1)

    if data is None:
        # 過去1秒間にデータが受信されていない。
        hub.light.on(Color.RED)
    else:
        # データが受信され、かつ1秒未満の新しいデータ。
        hub.light.on(Color.GREEN)

        # *data* には、他のハブで hub.ble.broadcast() に指定した
        # 順序と同じ値が同じ順序で含まれています。
        left_angle, right_angle = data

        # 他のハブのモーターの位置をこのハブのモーターに反映します。
        left_motor.track_target(left_angle)
        right_motor.track_target(right_angle)

    # ブロードキャストは100ミリ秒ごとにのみ送信されるので、それ以上の頻度で
    # observe() メソッドを呼び出す理由はありません。
    wait(100)

ボタンとシステムの例

プログラム中でのストップボタンの利用方法

from pybricks.hubs import MoveHub
from pybricks.parameters import Color, Button
from pybricks.tools import wait, StopWatch

# ハブを初期化。
hub = MoveHub()

# ストップボタンを無効化。
hub.system.set_stop_button(None)

# 5秒間のボタンチェック。
watch = StopWatch()
while watch.time() < 5000:

    # 押されたら緑、押さてなければ赤でライトを点灯。
    if hub.buttons.pressed():
        hub.light.on(Color.GREEN)
    else:
        hub.light.on(Color.RED)

# ストップボタンを再有効化。
hub.system.set_stop_button(Button.CENTER)

# これで通常どおりストップボタンが使える。
wait(5000)

ハブの電源オフ

from pybricks.hubs import MoveHub
from pybricks.tools import wait

# ハブを初期化。
hub = MoveHub()

# さよならを言い、少し時間をおいて実行する。
print("Goodbye!")
wait(100)

# ハブをシャットダウン。
hub.system.shutdown()

乱数の作成

ムーブハブには urandom モジュールがありません。アプリケーションで乱数が必要な場合は、次の例のバリエーションを試してみてください。

より良く動作させるためには _rand の初期値を、アプリケーションで本当にランダムなものに変更します。例えば、IMUの加速度やセンサーの値が使えます。

from pybricks.hubs import MoveHub

# ハブを初期化。
hub = MoveHub()

# 「乱数」種を初期化。
_rand = hub.battery.voltage() + hub.battery.current()


# a <= N <= b の範囲で乱数の整数値 N を返す。
def randint(a, b):
    global _rand
    _rand = 75 * _rand % 65537  # Lehmer
    return _rand * (b - a + 1) // 65537 + a


# 乱数値をいくつか例として生成。
for i in range(5):
    print(randint(0, 1000))