0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MicroPython/CircuitPythonAdvent Calendar 2023

Day 15

Pybricks によるハブ間のブロードキャスト通信

Last updated at Posted at 2023-12-16

はじめに

Pybricks では BLE によるハブ間のブロードキャスト通信が可能です。

送信側のAPI

ブロードキャストのチャンネル設定

ハブのオブジェクトを作成する際に、ブロードキャストのチャンネル番号を設定します。たとえば Prime Hub の場合は次のように指定します。

hub = PrimeHub(broadcast_channel=1)

チャンネル番号は 0 から 255 までの値を指定できます。

データの送信

ハブの ble.broadcast(data) を使います。 data に送信するデータを指定します。指定できるデータは 型 int, float, str, bytes, bool の値、もしくはそれらのタプルに限定されています。

たとえば、整数値 5 を送信するには次のようにします。

data = 5
hub.ble.broadcast(data)

受信側のAPI

リスンするチャンネルの設定

ハブのオブジェクトを作成する際に、リスンするチャンネル番号をリストで設定します。たとえば Move Hub の場合は次のように指定します。

hub = MoveHub(observe_channels=[1])

チャンネルはリストで複数指定できます。

データの受信

ハブの ble.observe(channel) を使います。 channel に受信するチャンネル番号を指定します。受信できた場合は受信データを返し、受信できなかった場合は None を返します。

たとえば、チャンネル1から受信する場合は次のようにします。

data = hub.ble.observe(1)

簡単な例

Prime Hubがどの向きになっているかを示す色を、Move Hub と Technic Hub に伝える例です。

IMG_7220.JPG

送信側(Prime Hub を使った例)

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

hub = PrimeHub(broadcast_channel=1)

sides = [
    Side.TOP,
    Side.BOTTOM,
    Side.LEFT,
    Side.RIGHT,
    Side.FRONT,
    Side.BACK
]

colors = [
    Color.RED, 
    Color.BLUE,
    Color.GREEN,
    Color.YELLOW,
    Color.MAGENTA,
    Color.VIOLET
]

# 検出した側を元に色を更新し続ける。
while True:
    # ハブの上になっている側をチェック。
    up_side = hub.imu.up()

    try:
        data = sides.index(up_side)
    except ValueError:
        data = -1


    # 検出した側を元に色を変更。
    if data != -1:
        hub.light.on(colors[data])
    else:
        hub.light.on(Color.WHITE)

    # 色を他のハブに送信
    hub.ble.broadcast(data)

    wait(50)

受信側1(Move Hub を使った例)

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

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

colors = [
    Color.RED, 
    Color.BLUE,
    Color.GREEN,
    Color.YELLOW,
    Color.MAGENTA,
    Color.VIOLET
]

while True:
    # 他のハブからのブロードキャストの受信。
    data = hub.ble.observe(1)

    if data is None or data == -1:
        # 過去1秒間にデータが受信されていないか、データ不正。
        hub.light.on(Color.WHITE)
    else:
        # データが受信され、かつ1秒未満の新しいデータ。
        hub.light.on(colors[data])

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

受信側2(Technic Hub を使った例)

Move Hub を使った例との違いはハブのクラスだけです。

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

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

colors = [
    Color.RED, 
    Color.BLUE,
    Color.GREEN,
    Color.YELLOW,
    Color.MAGENTA,
    Color.VIOLET
]

while True:
    # 他のハブからのブロードキャストの受信。
    data = hub.ble.observe(1)

    if data is None or data == -1:
        # 過去1秒間にデータが受信されていないか、データ不正。
        hub.light.on(Color.WHITE)
    else:
        # データが受信され、かつ1秒未満の新しいデータ。
        hub.light.on(colors[data])

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?