マイクロビットの無線通信の受信機側の値の取り扱い方を調べる


マイクロビットを二個用意して、マイクロビット間で無線通信でやり取りをしてみると、タイムラグがずれたような値を取得する事があります。

マイクロビットの無線通信で、送信側から送信した値を受信側ではどのように受け取っているか?を見ていきます。


無線通信 — BBC micro:bit MicroPython 2 ドキュメントを読んでみると、受信側では受信したメッセージをキュー(queue)というデータ構造を用いて格納しているそうです。

キュー(コンピュータ) - Wikipedia


キューを体感する為に、無線機能の送受信のコードを作成します。


送信側(transmitter.py)

from microbit import *
import radio

display.show(Image.ASLEEP)

radio.config(group=1)
radio.on()

i = 0
while True:
	display.show(Image.YES)
	sleep(500)
	radio.send(str(i))
	i += 1
	display.show(Image.ASLEEP)
	sleep(500)

1秒毎に数字を1ずつ増やした値を送信します。

送信するタイミングがわかりやすいように

radio.send(str(i))

の前後にImage.HEARTとImage.YESの表示の切り替えを挿入する事で、表示の切り替わりの時に値が送信された事がわかるようになります。


受信側(receiver.py)

from microbit import *
import radio

display.show(Image.TARGET)

radio.config(group=1)
radio.on()

while True:
	if button_a.is_pressed():
		msg = radio.receive()
		print(msg)
		sleep(300)

受信側ではボタンAを押した時にキューから取り出し、シリアルを表示で値を出力します。

これで受信側では毎秒キューに値を入れながら(エンキュー)、ボタンAを押した時だけキューから値を取り出す(デキュー)ということを行う事ができるようになります。


各々のマイクロビットにフラッシングした後、両方のマイクロビットのリセットボタンを押し、20秒程何もせずに放置します。

約一分程後に受信側のボタンAを連打してみると、シリアルの表示には、

0
1
2
3
4
5
6
7
8
9
10
21

と表示されました。

この出力内容を見る限り、無線通信の受信側のメッセージのデータ数は11であるらしく、10の後の21はキューからデキュー(データを取り出した)直後に送信側から新たに受け取った値で、11〜20までの値のメッセージは捨てていたことになります。


無線通信 — BBC micro:bit MicroPython 2 ドキュメントには無線通信のキュー(queue)のディフォルト値が 3 と表記されていましたが、見ているものが違うのかもしれません。