hiro99ma blog

何か技術的なこと

BLE基礎 (3)

2024/08/08

前回、DevAcademy Exercise 1で LBS を動かした。

どうでもよいが「LBS」だと足りない気がして「LBSサービス」と書いてしまいそうになる。 せめて「LBサービス」なのかもしれないが、”S” で終わっていないと落ち着かない気がするのだ。

LED は 3つはないと不便そうだったのでブレッドボードを使って追加した(2ch FET付きLEDボード)。 基板には「3.3V」と「VIN」があるのだが、それぞれ3.2Vちょっとと4.5Vちょっとくらいだった。 電圧的には足りてるのだが、他にも接続したいこともありそうなので USBマイクロBコネクタ・ピッチ変換基板 で USB から 5V をもらってきて、ブレッドボード用電源ボード3.3V で 3.3Vを作っている。

image

このくらいだと USBハブのバスパワーから電源を得ても大丈夫な気がするのだが、どうなんだろうね。 セルフパワーにもできるハブを使っているので、足りなければACアダプタを挿せばよい。4.5V くらいしか出力されていないのもバスパワーにしているせいだろう。


少しmain.cを見ておく。

LED/Buttonライブラリは気にしないとするとこんなところだ。

LBSサービスの初期化でコールバック関数を登録し、LEDはdk_set_led()で制御、Buttonは現在持っているボタンの状態を返すようになっている。

CONFIG_BT_LBS_SECURITY_ENABLEDが有効な場合はもう少し処理が追加されていて、認証が行われるようだ。 認証とはなんだったか。。。SMPとかそういうやつだとは思うが記憶にない。
この Exercise には出てこなかったので、別で説明があるだろう。

image

最後は LED を点滅する無限ループになっているのだが、無限に止めたい場合は k_sleep()の引数にK_FOREVERを指定すれば良いそうだ。 ncs ではない時代はタイマーを使って点滅させていたような気がする。便利になったものだ。

あとはprintk()でのログ出力を有効にしておきたい。 これは以前やった Exercise 2 – DFU over USB, adding external flash & custom keys のまねをする。

/ {
	chosen {
		zephyr,uart-mcumgr = &cdc_acm_uart0;
	};
};

&zephyr_udc0 {
	cdc_acm_uart0: cdc_acm_uart0 {
		compatible = "zephyr,cdc-acm-uart";
	};
};
# USB
CONFIG_USB_DEVICE_STACK=y
CONFIG_UART_LINE_CTRL=y
...
#include <zephyr/usb/usb_device.h>

...

	if (IS_ENABLED(CONFIG_USB_DEVICE_STACK)) {
		int ret = usb_enable(NULL);
		if (ret) {
			return -1;
		}
	}

image

しばしば使いそうなので Raytacベースの設定に追加した。 KconfigでチェックボックスをONにしたら有効になるのがよいのだが、やり方が分からんかった。 この方法だとメンテナンスするファイルが増える一方なので望ましくないのだが。

commit


ncs で LBS 以外に既に実装されているサービスはこれだけある。

Bluetooth libraries and services

たぶん「GATT」で始まっているのがBluetooth SIG標準のサービスだろう。 少ない気もするが、そもそもそんなに既存で使うシーンがあるサービスは多くないと思う。 BAS はバッテリー残量などで需要がありそうだが、それ以外は作った方が早いかもしれない。

nrfリポジトリの下にあるようだ。 これを参考にすればサービスを作るのは難しくないのかもしれない。

が、DevAcademy の順番としては次は Advertising なのでそれにあわせよう。

< Top page