BLE基礎 (2)
2024/08/07
前回の続き。
Exercise 1
LED Button Service(LBS)を動かしてみようという Exercise である。 Bluetooth SIGの方にはない service だが nordicのページにはあるので、独自サービスなのか? しかし「Nordic UART Service」なんかはちゃんと “nordic” と入っているので違うのか。
単なる列挙になりそうだが、LBSの概要をメモしておこう。
LBS
LEDの状態を受け取ったり、ボタンのステータスが変化したときに通知を送信したりするサービス。
LEDの状態を受け取る、というのはクライアントからの変更要求を受け取るという意味なのだろうか? 表になっていないとわかりづらいな。
Service UUID
00001523-1212-EFDE-1523-785FEABCD123
Characteristic
Button Characteristic
00001524-1212-EFDE-1523-785FEABCD123
LED Characteristic
00001525-1212-EFDE-1523-785FEABCD123
GitHubにある LBS peripheral サンプルコードを動かすと LED1 が点滅する。 そして Advertising しているのでスマホアプリ nRF Connect for Mobile で接続してあれこれやってみましょう、というのが Exercise の内容だ。
Raytac ベースでやると 確かに LED は点滅している。 Advertisingもしている。 接続すると、ボタンを押した状態で “Nordic LED Button Service” を Read すると “Button pressed” になっていた。
LED は 3つ(LED1=status, LED2=connect, LED3=service)使うようになっているが、開発ボードには 1つしかないので変更したい。
src/main.c
にそれっぽい定義があるのだが、{DK_LED1](https://github.com/NordicDeveloperAcademy/bt-fund/blob/main/lesson1/blefund_less1_exer1/src/main.c#L32-L38)などは知らない定義である。
dk_buttons_and_leds.hに定義はあるものの、単に0
や1
の番号だけだ。
“Other libraries” に DK Buttons and LEDsという章があったので、Nordic DKボードようなのだろう。
それだとDKを持っていない人には意味が無いのだが、Use on non-DK boards節にカスタマイズの仕方が書かれていた。
が・・・どれがカスタマイズ項目なんだろう?
「LED1」はnRF5340DKの画像を見ると「LED1」~「LED4」なので、Devicetreeのled_0と同じで良いはずだ。 だとすると、私のRaytacベースのled_0も同じようになっている。
雰囲気からすると、Devicetreeの leds
ノードと buttons
ノード に列挙されている定義をまとめて登録して、アクセスするときにはそれをインデックス値で指定できるようになっている。
なので、ラベル名やエイリアスは深く考えずに Devicetree の順番に割り当てられると思っておこう。
なら単純にUSER_LEDをDK_LED1
にすればよい。
元々DK_LED1
が割り当てられていたRUN_STATUS_LED
はDK_LED3
にもでしておこう。
今のわたしのボードにはLEDとボタン以外はGPIOが空いているので、どうでもよいのだ。
そうすると nRF Connect for Mobile から LED の ON/OFF 制御ができるようになった。 Read がないためか制御しかできないが、そういうもんだろう。
関係ないけど、マイコンの GPIO 定義で Write only にしていてもポートを読むと値が取得できたのでハードの人に質問したことがあるが、そういうものだっていうことだった。
あれはそのマイコンだけなのか、GPIOの切替ができるタイプはだいたいそうなのか。
こういうちょっと込みいったところになると知識がまったく無いのがつらい。
VCOM でログを見ることができるようだったが、Raytacベースの方はまだそこまで仕込んでないので何も出力されなかった。 あとでやろう。
ともかく、BLE機能が使えることが確認できて良かった。
cpuapp と cpunet があったはずだが、どうやって使い分けるのだろう? Exercise 1 には nRF5340DK への説明文に COM ポートが app core と network core の 2つあって今回は app の方だ、とあったが、つまり network core からもハードウェアの操作がまったくできないわけではないということになる。
まあ、これはやっていけばわかるだろう。