はじめに
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 に伝える例です。
送信側(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)