LoginSignup
1

More than 1 year has passed since last update.

posted at

updated at

誰でもすぐにBLE通信機器が作れるnRF52用サンプルプログラム

記事の概要

BLE通信機器の開発に使える以下のサンプルの使用方法について解説します。
https://github.com/matsuikosuke/nRF52_Central_and_Peripheral

BLE通信モジュールにはNordicのnRF52シリーズを使用します。
サンプルはnRF52832を対象にしていますが、メモリや端子設定が少し異なるだけで他のnRF52シリーズにも使用できます。

BLE通信についての知識はあるものとみなして解説します。
BLE通信について知りたい方は、以下の本などをご参照ください。

Bluetooth Low Energyをはじめよう

(2022年5月4日追記)注意事項

本サンプルでCentral機能を有効にするとDFU機能が無効になることが分かりました。
原因はDFU用のUUIDをCentral用のUUIDが上書きしてしまうためです。
Peripheralだけを使用する場合、PeripheralとCentralのSCAN機能のみ使用する場合は、DFU機能が使用できます。

準備

開発環境の構築

開発環境は無料で用意できます。
開発環境の構築方法については以下の記事をご参照ください。

Nordic社製BLEの開発環境構築と動作確認

nRF52モジュールの購入

個人での電子工作では開発ボードを使用するのが便利です。
NRF52-DKのようなNoridicが提供する各種ボードは日本の技適を取得していないので使用が難しいです。
ですが、技適取得済みの開発ボードとして、以下があります。

他にも多くの開発ボードがあります。
配線が少し面倒ですが小型モジュールを使う手もあります。

これらはDigi-keyなどで1個1,500円前後で購入できます。
使用方法については以下を参照ください。

表面実装部品の太陽誘電BLEモジュールを強引に電子工作で利用する方法

サンプルプロジェクト

ダウンロード

今回用意したサンプルはオリジナルのBLEサービスです。
以下からダウンロードしてください。

このサンプルはSDK 17.0.2とソフトデバイスs132_nrf52_7.2.0を使用しています。
SDKとソフトデバイスのダウンロードと使用方法については、先ほどに紹介したNordic社製BLEの開発環境構築と動作確認:SDKとソフトデバイスをご参照ください。

現在の最新のSDKは17.1.0ですが、そちらでも問題なく使用できると思われます。
今後もSDKやソフトデバイスが更新されるにつれて、サンプルはそのままでは使用できなくなる可能性があります。

ダウンロードしたファイルは適当な名前をつけたフォルダ、例えばtest_projectに入れて、SDKの以下の階層に置いてください。
別の階層に置く場合は、ライブラリなどへのリンクを見失ってしまうので、自分の環境に合わせてリンク先を修正してください。

~nRF5_SDK_17.0.2_d674dde\examples\ble_central_and_peripheral\test_project

開発環境にはSEGGER Embedded Studioを使用しています。
以下の階層にあるtest_s132.emProjectを開いて、修正、ビルド、デバックをしてください。

~\nRF5_SDK_17.0.2_d674dde\examples\ble_central_and_peripheral\test_project\pca10040\s132\ses\test_s132.emProject

機能

サンプルのBLEサービスは、CentralとPeripheralの両方の機能を持ちます。
サービス名はorangeとしています。
自分用のサービスに作り替える時は、orangeという単語を自分のサービス名に置き換えてください。

使用するのがCentral機能かPeripheral機能のどちらか1つでいい場合は、関係ない部分を削除するか、Central機能だけを使用したい場合はアドバタイジング発信を停止し、Peripheral機能だけを使用したい場合はスキャンをしないようにしてください。
各種関数の設定方法やどれがCentral機能やPeripheral機能に関する部分なのかは以下を参照ください。

また、サンプルはDFU機能を持っています。
DFUとは、JTAGツールなどを使用せずに、BLE通信によりファームウェア更新する機能のことです。
詳細は以下を参照ください。

ビルド済ファイル

自分でBLEサービスを作成するにはプロジェクトを開いて修正した上で、ビルドやデバッグをしていただく必要があります。

ですが動作確認だけしたいという場合は既にビルド済みのファイルを書き込んで使用ください。
書き込み方法はNordic社製BLEの開発環境構築と動作確認:サンプルプログラムのビルドと書込みを参照ください。

~\nRF5_SDK_17.0.2_d674dde\examples\ble_central_and_peripheral\test_project\Output\all.hex

このビルドファイルはDFU機能を持っているので、このファイルを書き込んだ機器はnRF ToolBoxアプリなどによりファームウェア更新ができます。

サンプルプロジェクトの動作

Peripheral機能の確認

Nordicが無償で配布しているアプリnRF Connectを使用してPeripheral機能を確認します。

ファームウェアを書き込んだnRF52に電源を供給するとアドバタイジングパケット発信を開始します。
SCANでORANGE_DEVICEを探してください。
SCAN.png

CONNECTを選択するとサービス名とCharacteristicが確認できます。
Notifyの横のアイコンをクリックして受信可能に設定してください。
BLE接続.png

NotifyとWrite

サンプルはperipheral_write_notification_test関数により、Writeで受信したデータをNotifyでそのまま送り返します。

スマホからwriteデータを送信します。
writeの横のアイコンをクリックしてデータ入力画面を開き、適当な送信データを入力してSENDを押してください。
write.png

送信したのと同じデータがNotifyに返ってきているのが分かります。
write_notify.png

Indicate

IndicateはNotifyと同様の方法で確認できます。
サンプルはperipheral_write_indication_test関数により、Writeで受信したデータをIndicateでそのまま送り返します。

Notifyとの動作の違いはIndicate送信後にACK応答が返ってくることです。
ACK応答はBLE_GATTS_EVT_HVCイベントにより受信できます。

Read

ReadはCentaral側からの要求に対してPeripheral側がデータを返します。
Readの横のアイコンをクリックすることでRead要求を実行します。
するとReadデータが返ってくることが分かります。
read.png

Central機能の確認

デバッガを使用してCentral機能を確認します。
DFU機能が有効ですとデバックできないのでdefine.hの#define WITHOUT_DFUを有効化してください。

この試験をするにはnRF52の開発ボードが2台必要になります。
両方ともにサンプルを書き込みます。
1台をデバッガと接続してCentral機能を確認します。
もう1台がCentral側にならないように、そちらに書き込むファームウェアは、define.hの#define WITHOUT_SCANを有効化してPeripheral機能のみ有効化した方が便利です。

アドバタイジングパケットのスキャン

Central側はアドバタイジングパケットとスキャンパケットをスキャンしています。

アドバタイジングパケットにはUUIDの77bfabc0-b245-d7d5-baaf-7cb4aec8129cが含まれていることが分かります。
アドバタイジングパケット.png

スキャンパケットにはDevice名のORANGE_DEVICEが含まれていることが分かります。
スキャンパケット.png

BEACONの検知を行う場合はBLE接続は行わずに、このアドバタイジングパケットだけを取得します。

NotifyとWrite

サンプルのcentral_write_notification_test関数は10秒周期でWriteデータを送信します。
Peripheral側はとWrite
サンプルはperipheral_write_notification_test関数によりWrite受信したデータをNotifyで送信します。

デバッガを確認すると送信したデータと同じデータがNotify受信していることが分かります。
centaral_notify.png

Indicate

IndicateはNotifyと同様の方法で確認できます。
サンプルはperipheral_write_indication_test関数によりWrite受信したデータをIndicateで送信します。

Read

サンプルのcentral_read_test関数は10秒周期でread要求します。

デバッガを確認するとread要求後にreadデータを受信していることが分かります。
centaral_read.png

DFU機能の確認

Nordicが無償で配布しているアプリnRF ToolBoxを使用してDFU機能を確認します。

まず以下のzipファイルをスマホに保存してください。
私はいつもスマホにメールで添付送信して、スマホのフォルダにダウンロードしています。

~\nRF5_SDK_17.0.2_d674dde\examples\ble_central_and_peripheral\test_project\Output\test_app.zip

このzipファイルの生成方法についてはnRF52のDFU試験1を参照してください。
実例として私の環境で実行しているコマンドを以下に記載します。
set命令を用いて、よく使うフォルダ名や定数を定義した方がいいのでしょうが、Dドライブに入れたフォルダをset命令で定義するとエラーになってしまうので諦めました。

nrfutil settings generate --family NRF52 --application D:\BLE\nRF5_SDK_17.0.2_d674dde\examples\ble_central_and_peripheral\test_project\pca10040\s132\ses\Output\Release\Exe\test_s132.hex --application-version 1 --bootloader-version 1 --bl-settings-version 1 D:\BLE\nRF5_SDK_17.0.2_d674dde\examples\ble_central_and_peripheral\test_project\Output\settings.hex 

mergehex --merge D:\BLE\nRF5_SDK_17.0.2_d674dde\examples\ble_central_and_peripheral\test_project\softdevice\s132_nrf52_7.2.0_softdevice.hex D:\BLE\nRF5_SDK_17.0.2_d674dde\examples\ble_central_and_peripheral\test_project\secure_bootloader\pca10040_s132_ble\ses\Output\Release\Exe\secure_bootloader_ble_s132_pca10040.hex --output D:\BLE\nRF5_SDK_17.0.2_d674dde\examples\ble_central_and_peripheral\test_project\Output\SD_BL.hex

mergehex --merge D:\BLE\nRF5_SDK_17.0.2_d674dde\examples\ble_central_and_peripheral\test_project\Output\SD_BL.hex D:\BLE\nRF5_SDK_17.0.2_d674dde\examples\ble_central_and_peripheral\test_project\pca10040\s132\ses\Output\Release\Exe\test_s132.hex --output D:\BLE\nRF5_SDK_17.0.2_d674dde\examples\ble_central_and_peripheral\test_project\Output\SD_BL_APP.hex

mergehex --merge D:\BLE\nRF5_SDK_17.0.2_d674dde\examples\ble_central_and_peripheral\test_project\Output\SD_BL_APP.hex D:\BLE\nRF5_SDK_17.0.2_d674dde\examples\ble_central_and_peripheral\test_project\Output\settings.hex --output D:\BLE\nRF5_SDK_17.0.2_d674dde\examples\ble_central_and_peripheral\test_project\Output\all.hex

del D:\BLE\nRF5_SDK_17.0.2_d674dde\examples\ble_central_and_peripheral\test_project\Output\SD_BL.hex
del D:\BLE\nRF5_SDK_17.0.2_d674dde\examples\ble_central_and_peripheral\test_project\Outputut\SD_BL_APP.hex
del D:\BLE\nRF5_SDK_17.0.2_d674dde\examples\ble_central_and_peripheral\test_project\Output\settings.hex

REM make image
nrfutil pkg generate --hw-version 52 --application-version 1 --application D:\BLE\nRF5_SDK_17.0.2_d674dde\examples\ble_central_and_peripheral\test_project\pca10040\s132\ses\Output\Release\Exe\test_s132.hex --sd-req 0x0101 --key-file D:\BLE\nRF5_SDK_17.0.2_d674dde\examples\ble_central_and_peripheral\test_project\private.key D:\BLE\nRF5_SDK_17.0.2_d674dde\examples\ble_central_and_peripheral\test_project\Output\test_app.zip

DFUおよびzipファイル生成方法については以下の記事を参照しています。

ここでDFU機能を持つhexファイルが既にnRF52832に書き込まれているとします。
nRF ToolBoxからOrangeDeviceにBLE接続し、zipファイルを選択してDFU実行します。
成功画面で終了するのが確認できるはずです。

なお、皆様が私のサンプルを元にしてファームウェアを作成した際は、private keyとpublic keyを再生成して、secure_bootloaderの以下のプロジェクトを開き、再ビルドするのを忘れないようにご注意ください。

~\nRF5_SDK_17.0.2_d674dde\examples\ble_central_and_peripheral\project\secure_bootloader\pca10040_s132_ble\ses\secure_bootloader_ble_s132_pca10040.emProject

もしこの変更をしなければ、GitHubに公開鍵も秘密鍵も置いてあるので、世界中の誰でも皆様の作成したファームウェアを自由に上書きできてしまいます。

消費電力の測定

アドバタイジングパケットを発信しているだけの時とアドバタイジングパケット発信とスキャンの両方をしている時の消費電力を比較します。

消費電力はPower Profiler Kitで測定しました。測定方法は以下を参照ください。
Power Profiler KitでBLEの消費電力を測定する

スキャン機能無効時

アドバタイジングパケットを発信しているだけの時は平均して4mAを消費しています。

SmartLock_Central機能あり_SCAN無効時消費電力2.png

スキャン機能有効時

アドバタイジングパケット発信と同時にスキャンも実行している時には平均して6.5mAを消費しています。

SmartLock_Central機能あり_SCAN有効時消費電力.png

BLE通信は消費電力の大きな処理をCentral側に任せることでPeripheral機器の消費電力を低く抑えています。
Central機能をBLE機器に持たせる場合はスキャンを常時行っていると、BLE通信の利点である低消費電力を損なうことにご注意ください。

その他

サンプルにはAuthority Writeの機能を実装しているものの、まだ実際に動作を確認していません。
また、Central側が複数のPeripheral機器とBLE接続した場合、それらを識別する機能も実装していません。

今後、これらの機能の確認と実装をする予定です。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1