BLE Long Rangeってどれくらいロングレンジなの?nRF52840評価ボードで長距離通信実験


こんにちは。PMの後藤です。

Bluetooth5.0になってCoded PHY、または通称Bluetooth Long Rangeと呼ばれる通信モードが使えるようになりました。Coded PHY(Bluetooth Long Range)とは通信速度の低下と引き換えに環境ノイズに強くなり、より遠距離と通信できるようになる方式です。

さて、今回は手元にあるnRF52840評価ボードを使って、この通信モードで実際にどの程度の長距離通信ができるのかを試してみることにしました。

※BLE Long Rangeとの表記をよく見ますがCoded PHYの呼称が正式のようですので、この記事ではCoded PHYで表記を統一します。

長距離通信実験の準備

nRF52840評価ボードについて

NordicSemiconductorのデモでは屋外でドローンに搭載し、見通し距離700m以上の距離でアドバタイジングパケットを通信出来ていましたし、別の実験では見通しで1500m程度通信できたとの報告もあるようです。

NordicSemiconductorのデモ

BLEマイコンとしてメジャーなNordicSemiconductorのnRF52シリーズではすでにCodedPHYに対応し、最近発売されたESP32-C3でもCoded PHYに対応したため、今後デバイス間通信として普及する可能性がありそうです。

その一方でスマートフォンでの普及状況はさほどでもなく、Galaxyなど一部の高級Androidデバイスで対応、AppleはiOS14以降対応していないという情報もあり、今後の動向には注意を払う必要がありそうです。IoTデバイスを作る側としてはPCを含めてあらゆるデバイスに対応してほしい!

環境構築

nRF52シリーズの公式開発環境にはnRF5 SDKnRF Connect SDKの2種類があります。現在nRF5 SDKは積極的に開発されておらず、今後開発する場合はZephyr RTOSベースのnRF Connect SDKを使うことになると思われます。

今回は両方でコードを動かしてみましたが、都合よくnRF5 SDKにPHYのプロファイルが切り替えられるサンプルプロジェクトがあったため屋外テストではそちらを使用しました。

評価用コード

nRF5ベースのCoded PHY評価プロジェクトはこちらのレポジトリのプロジェクトを利用しました。ただしこちらのプロジェクトでターゲットにしているnRF52840-DKは技適どころかCEマークも取得されていないため、今回はMinewのMS88SF21を使用し、ピン番号を合わせるようにしました。

nRF Connect SDK環境ではこちらの心拍数モニタサンプルがCoded PHYを使ったもので、こちらをベースにしました。(どうでもいいことですが遠距離から心拍数をモニタリングするなんて使い方あるんですかね?)

またCoded PHYでもエンコードレベルがS=2とS=8の2種類あり、S8のほうがよりエラーに強く遠方でも受信できる一方、通信速度がS2の500kbpsに対してS8は125kbpsと遅くなります。このサンプルではプロファイルが指定されていなかったためbt_init_callback()のなかでphyParamのオプションとして指定するようにしました。(参考にしたQ&A該当する関数

static bt_ready_cb_t bt_init_callback(struct bt_conn *conn, uint8_t conn_err)
{
	struct bt_conn_le_phy_param phyParam;
	phyParam.options = BT_CONN_LE_PHY_OPT_CODED_S8;
	phyParam.pref_rx_phy = BT_GAP_LE_PHY_NONE;
	phyParam.pref_tx_phy = BT_GAP_LE_PHY_NONE;

	bt_conn_le_phy_update(conn, &phyParam);
	printk("bt phy set\n");
}

また通信状態の評価のためにRSSIを読む関数を追加しています。

static void read_conn_rssi(uint16_t handle, int8_t *rssi)
{
	struct net_buf *buf, *rsp = NULL;
	struct bt_hci_cp_read_rssi *cp;
	struct bt_hci_rp_read_rssi *rp;

	int err;

	buf = bt_hci_cmd_create(BT_HCI_OP_READ_RSSI, sizeof(*cp));
	if (!buf)
	{
		printk("Unable to allocate command buffer\n");
		return;
	}

	cp = net_buf_add(buf, sizeof(*cp));
	cp->handle = sys_cpu_to_le16(handle);

	err = bt_hci_cmd_send_sync(BT_HCI_OP_READ_RSSI, buf, &rsp);
	if (err)
	{
		uint8_t reason = rsp ? ((struct bt_hci_rp_read_rssi *)rsp->data)->status : 0;
		printk("Read RSSI err: %d reason 0x%02x\n", err, reason);
		return;
	}

	rp = (void *)rsp->data;
	*rssi = rp->rssi;

	net_buf_unref(rsp);
}

機器構成

今回はBLEモジュールとしてnRF52840の搭載されたMinewのMS88SF21を使用しました。

スイッチサイエンスさんからもブレークアウトボードが購入出来ます。

いよいよ屋外で長距離通信実験

運河沿いへ

近所で見通しが良く、かつ人に邪魔されない場所がなかなかなかったため自転車で10分ほど走っていける運河沿いで実験してみることにしました。

三脚の上にBLEマイコンを設置しています。
これだけ広けりゃ大丈夫でしょと思いきや……

運河沿いは見通しの良い直線になっており実験に都合がよさそうです。

持ってきた三脚に送信側のBLEマイコンを設置し、受信側はPCにJ-Tag経由で受信側BLEマイコンを接続、アドバタイジングパケットを受信しRSSIを継続的に読み取るようにしました。

また、会社から借りてきたGalaxyS10でもBLE Coded PHYが受信できるためそれも参考用に見ることにしました。


日々使っているとBLEはさほど遠くまでつながらない印象がありますが、ここは直線で見通しも効くため、意外にパケットがすぐ途切れたりはせず、どんどん距離を取っていきました。

ところが、300mほど行ったところで排水管の金属柵が通路を遮っている個所があり、その先では受信できない状況になってしまいました。

ここまで到達するだけでも思ったより長距離を飛ぶという印象を受けたのですが、意外にもCoded PHYではないBLEでもこの距離でパケットが受信できてしまいます。これでは比較になりません。

また、休日の運河沿いは散歩をしている老夫婦、釣りおじさん、そして幾多のランニング集団と彼らがつけている沢山のスマートウォッチたちによりとてもではないですが安定した環境とはいえず、場所変えることにしました。

金属柵のこちら側では受信できず。
送信側は遠くに見える青い橋のたもとにあります。

コンテナふ頭へ

もう少し自転車で走ったところにコンテナふ頭があり長い直線道路があるため、そこに行ってみることにしました。普段はコンテナ待ちのトラックでごった返しているのですが休日なのでふ頭の警備のおじさんくらいしかいません。

僕は気が小さいのでこういうことをしているとテロや妨害行為と勘違いされないかとびくびくします。

実験の結果は……

BLE Coded PHY

テストはPCに接続した受信デバイスがアドバタイジングパケットを受信できるギリギリの距離まで歩き、その位置をGoogleMapsでスクリーンショットを取りました。

ふ頭の端っこから約550mほどまでいくと RSSIが-90dBm前後でパケットの受信限界が来ました。Galaxyでは-103dBm程度でした。

BLE PHY 1Mbps(通常のBLE通信)

比較のために通常のBLE通信の場合でも同様にテストしてみます。同じ位置からこちらは330mほどでRSSIが-80dBm前後で受信が途切れがちになりました。またGalaxyではもうリスト上に表示がされなくなっていました。

Coded PHYの場合は突如通信が途切れる印象がありましたが、通常のBLE通信の場合は徐々にパケット取りこぼしが多くなり、そして受信出来なくなる印象がありました。また信号強度もCodedPHYよりも強いレベルで通信不能となりました。

また、どちらの場合もトレーラーなど遮蔽物の裏側ではもっと近い距離でも受信不能となり、直進性の強い2.4GHz帯の特性を再確認することとなりました。

屋内での結果はどう変わるか?

屋外の解放環境では上記のように非常に遠くまで通信できたのですが、現実的には室内で見通しもあまりよくない環境でつかわれる場合が圧倒的に多いと考えられます。翌日オフィスにてCoded PHY通信を試してみました。

自分のデスク上に発信側デバイスを置き、どこまでパケットが受信できるかテストしてみました。写真はデスクから距離にして25mくらい、見通しではなく 一度90度曲がった先にある会議室です。

通常のBLE通信では会議室のドアを解放している状態でなんとか受信できましたが、Coded PHYの場合はかろうじてドアを閉めている状態でもパケットが受信出来ました。

考察

BLE Long Rangeと聞くとさも長い距離を飛ぶ規格である、という印象を受けますが、実際の規格としてのCodedPHYはパケットのエンコード方式によりノイズ耐性を上げ、結果的により遠くでも受信できるものであることは気に留めておくほうがよさそうです。特に遮蔽物のある環境では2.4GHz帯の特性である直進性のために「思ったよりLong Rangeじゃない」という状況も想定されます。またリサーチ中に気になった点として、2.4GHz Wi-Fi電波環境が悪い場合はCoded PHYも大きく影響を受けるという情報もありました。

スマートフォンで対応している機種が少ない点は大きな制約である一方で、IoTデバイス間の通信方式としてはBLEより有利であり、ESP系マイコンでも実装が出来るようになってきたことで普及していく可能性はありそうです。

またAndroidでも一部の機種では使えるのでCoded PHYを使って相互通信するアプリなども楽しそうです。(トランシーバーとか、相手を見つけ出すBLE追いかけっことかどうでしょう?)いずれ業務でも使ってみたいですね!

おまけのエピソード

テスト中にアパートの玄関にデバイスを置いて室内と通信テストしていたところ近所のおばちゃんに見つかってしまい非常に怪しまれました。LEDがピカピカ光ってワイヤーが伸びてるからって爆弾じゃないですよ!

エンジニア積極採用中

現在Cerevoでは各種エンジニアの採用、またハードウェア共同開発・受託開発を絶賛募集しております。それぞれご関心お持ちいただける方は、以下の専用お問い合わせフォームよりご連絡お待ちしております。

Back To Top
© Cerevo Inc.