Seeed Studio XIAO ESP32C6 でBLEビーコンを試してみる(7)

この記事では、Seeed Studio XIAO ESP32C6を使って、MicroPythonからBluetooth Low Energy(BLE)のiBeacon形式のBLEビーコンを発信し、スマートフォンからビーコンを検出してみます。

はじめに

この記事では、Seeed Studio XIAO ESP32C6を使って、MicroPythonからBluetooth Low Energy(BLE)のiBeacon形式のBLEビーコンを発信し、スマートフォンからビーコンを検出してみます。
前回の記事では、Seeed Studio XIAO ESP32C6とMicroPythonを使用して、iBeacon形式のAdvertisingデータを送信する実験を行いました。
スマートフォンのnRF ConnectでUUID、Major、Minorなどの情報を確認し、iBeaconとして認識されることも確認できました。
今回は、iBeaconの距離推定に関係するRSSI(Received Signal Strength Indicator)について実験します。
iBeaconでは、1 m離れた位置での受信電波強度を基準値として設定します。この値はMeasured Powerと呼ばれ、受信側がビーコンとの距離や近接状態を推定するために利用されます。
今回は、次の手順で実験します。

  1. XIAO ESP32C6からiBeaconを送信する
  2. スマートフォンをビーコンから1 m離してRSSIを測定する
  3. 測定値を参考にMeasured Powerを設定する
  4. 距離を変えながらRSSIの変化を確認する

この記事で学べること

  • RSSIとは
  • Measured Powerとは

ステップごとの解説

  1. RSSIとは
    RSSIは、受信側で測定した電波の強さを表す指標です。単位にはdBmが使われます。
    一般に、ビーコンから離れるほど受信電波は弱くなるため、RSSIの値は小さくなります。例えば、受信値が-40 dBmの場合と-80 dBmの場合では、-40 dBmの方が強い電波を受信しています。
    ただし、RSSIは距離だけで決まるわけではありません。壁や人体、電波の反射、スマートフォンの向きなどによっても変化します。
  2. Measured Powerとは
    Measured Powerは、ビーコンから1 m離れた位置で測定したRSSIを基準値として使用するものです。
    受信側は、この基準値と実際のRSSIを比較し、ビーコンとの距離や近接状態を推定します。
    今回のプログラムでは、これまで動作確認用として-59 dBmを設定していました。しかし、この値は実測値ではありません。
    今回は実際に1 m地点でRSSIを測定し、その結果を使って設定値を見直します。
  3. 実験環境
    今回使用する機器とソフトウェアは次のとおりです。

項目

内容

マイコン

Seeed Studio XIAO ESP32C6

ファームウェア

MicroPython

送信方式

BLE Advertising

ビーコン形式

iBeacon

受信端末

スマートフォン

スキャンアプリ

nRF Connect

測定項目

RSSI(dBm)

XIAO ESP32C6からiBeaconを送信し、スマートフォンで受信したRSSIを確認します。

  1. iBeacon送信プログラム
    まず、これまで使用してきたiBeacon送信プログラムを用意します。
import bluetooth
import time

ble = bluetooth.BLE()
ble.active(True)

# iBeacon parameters
uuid = bytes.fromhex("12345678123412341234123456789ABC")
major = 1
minor = 1

# Measured Power (temporary value)
tx_power = -59

# Build iBeacon manufacturer data
ibeacon_data = bytearray()
ibeacon_data += b"\x4C\x00"  # Apple Company ID
ibeacon_data += b"\x02\x15"  # iBeacon type and length
ibeacon_data += uuid
ibeacon_data += major.to_bytes(2, "big")
ibeacon_data += minor.to_bytes(2, "big")
ibeacon_data += bytes([tx_power & 0xFF])

# Build Advertising Data
adv_data = bytearray()
adv_data += b"\x02\x01\x06"
adv_data += bytes([len(ibeacon_data) + 1, 0xFF])
adv_data += ibeacon_data

print("iBeacon Advertising started")
print("Measured Power:", tx_power, "dBm")
print("Advertising Data Length:", len(adv_data))
print("Advertising Data:", adv_data.hex())

ble.gap_advertise(100000, adv_data=adv_data)

while True:
    time.sleep(1)

tx_powerが、iBeaconデータに格納するMeasured Powerの値です。
今回は最初に-59 dBmを設定しておき、1 m地点での測定結果を確認してから必要に応じて変更します。
UUID、Major、Minorは前回と同じ値を使用するため、受信側で同じビーコンを識別できます。

  1. 1 m地点でRSSIを測定する
    測定方法
    1. XIAO ESP32C6で上記プログラムを実行します。
    2. スマートフォンでnRF Connectを起動し、スキャンを開始します。
    3. iBeaconのAdvertisingを確認します。
    4. XIAO ESP32C6とスマートフォンの距離を1 mに固定します。
    5. RSSIの値を複数回記録します。

測定するときは、できるだけ同じ場所・同じ向きで測定してください。周囲の壁や金属、人体による影響を減らすため、マイコンとスマートフォンの間を人が横切らないようにします。
また、スマートフォンを手に持つ場合と机に置く場合では結果が変わる可能性があります。測定中は持ち方や向きをなるべく変えないようにします。

  1. 測定結果の記録
    RSSIは一定ではなく、時間とともに変動することがあります。そのため、1回だけの値ではなく、複数回測定することが重要です。
    次の表に測定結果を記録します。

回数

RSSI(dBm)

1

-86

2

-85

3

-86

4

-85

5

-86

6

-86

7

-85

8

-83

9

-86

10

-85

平均値

-85.3

平均値は、測定したRSSIの合計を測定回数で割って求めます。
例えば、測定値が、-84、-86、-85 dBmだった場合、平均値は-85 dBmです。
実際の測定では、使用する端末や設置環境によって値が異なります。

  1. Measured Powerを設定する
    1 m地点でのRSSIを複数回測定したら、その平均値をMeasured Powerの設定値として使用します。
    例えば、測定した平均値が、-85.3 dBmだった場合は、プログラムの次の部分を変更します。
tx_power = -85  #四捨五入します

変更後、プログラムを再実行してAdvertisingデータを送信します。
iBeaconのMeasured Powerは、実際に1 m地点で測定したRSSIを基準に設定するのが基本です。Appleの資料でも、1 m地点で受信したRSSIの平均値を使用する方法が紹介されています。
なお、今回の値は実験環境での校正値です。スマートフォンの機種や設置場所が変われば、適切な設定値も変わる可能性があります。

  1. 距離を変えてRSSIを測定する
    次に、XIAO ESP32C6とスマートフォンの距離を変え、RSSIがどのように変化するか確認します。
    測定距離は、例えば次のように設定します。
    • 1m
    • 2m
    • 3m
    • 5m

各距離でRSSIを複数回測定し、平均値を記録します。測定中はマイコンの位置や向きを変えず、スマートフォンの向きもできるだけ一定に保ちます。

測定結果の記録

距離

RSSI 1(dBm)

RSSI 2(dBm)

RSSI 3(dBm)

平均RSSI(dBm)

1m

-85

-86

-84

-85

2m

-90

-92

-91

-92

3m

-94

-95

-94

-95

5m

-100

-99

-101

-102

測定が終わったら、距離が遠くなるにつれてRSSIが弱くなる傾向があるか確認します。
ただし、電波の反射や遮蔽物の影響によって、距離とRSSIが必ずしもきれいな比例関係になるとは限りません。

  1. RSSIから距離を推定する
    RSSIとMeasured Powerを利用すると、電波の減衰モデルに基づいて距離を推定できます。
    代表的な近似式のひとつは、次のとおりです。
[
d = 10^{\frac{P_1-R}{10n}}
]

ここで、

  • (d):推定距離(m)
  • (P_1):1 m地点のMeasured Power(dBm)
  • (R):受信側で測定したRSSI(dBm)
  • (n):周囲の環境による減衰を表す係数

です。
例えば、Measured Powerが-59 dBm、受信RSSIが-69 dBm、減衰係数を仮に2とした場合、

[
d = 10^{\frac{-59-(-69)}{20}}
\approx 3.16\ \mathrm{m}
]

となります。
ただし、これは単純化したモデルによる計算例です。実際の距離が3.16 mであることを保証するものではありません。減衰係数は環境によって異なり、屋内では反射や遮蔽物などの影響も受けます。
また、スマートフォンのnRF Connectで表示されるRSSIと、iBeaconのMeasured Powerは別の値です。受信側のアプリが距離を表示する場合も、その推定方法はアプリやOSによって異なります。

  1. 実験結果から分かること
    今回の実験では、次の点を確認します。
  • 1 m地点でのRSSIが時間とともにどの程度変動するか
  • 測定した平均値と、最初に設定した-59 dBmにどの程度の差があるか
  • 距離を変えるとRSSIがどのように変化するか
  • RSSIだけで距離を正確に推定することが難しい理由

Measured Powerを適切に設定することで、受信側が距離や近接状態を推定する際の基準を整えられます。ただし、RSSIだけで正確な距離を求めることは難しく、実際の運用では環境に応じた校正や複数回の測定が重要です。

まとめ

今回は、XIAO ESP32C6から送信するiBeaconを使用して、1 m地点でのRSSI測定とMeasured Powerの設定、さらに距離を変えたときのRSSIの変化を調べる方法を紹介しました。
iBeaconでは、UUID、Major、Minorによってビーコンを識別するだけでなく、Measured Powerを使って受信側が近接状態や距離を推定する仕組みがあります。
次回は、今回の測定結果をもとに、RSSIの変動をグラフ化したり、距離推定の精度を改善する方法について検討していきます。

類似投稿