RN4020を使ってみた

皆さんこんにちは!今回はマイクロチップテクノロジー社のBLEモジュールであるRN4020を使ってみました。

RN4020
RN4020(マイクロチップテクノロジー社)

マイクロチップテクノロジー社のBLEモジュールであるRN4020の外観です。ファームウェア(F/W)が内蔵されており、ちょっとした外付け部品を付加するだけで使えます。今回はこれを二個使って通信実験を行います。

こういったモジュールを使えば簡単に無線でデータを送る事が出来ます。でも、無線にも得意な事、不得意な事が有ります。こちらのページでは無線化のヒントを掲載しています。

このモジュールは、ご覧のとおり、面実装品ですので、このまま使うには実験回路の製作が大変です。都合の良い事に、秋月電子通商様からモジュール+電源回路を載せたものが発売されています。

AE-RN4020-XB外観
AE-RN4020-XB外観

RN4020が載った基板です。5Vからモジュールの動作電圧である3.3Vに変換するレギュレーターも載っていますので、いつも使っているUSB-シリアル変換ケーブルから電源を供給しつつ、動作させることが出来ます。秋月電子通商様から「AE-RN4020-XB」の型式で発売されています。

いつもの様に説明は、
 ・用意するもの
 ・事前設定
 ・実験
の順に進めて行きます。

準備

1.用意するもの

・RN4020搭載モジュール 2台
前述の「AE-RN4020-XB」です。

AE-RN4020-XB外観
AE-RN4020-XB

・実験回路 2台
実験回路と言っても大したものではありません。RN4020搭載モジュールとUSB-シリアル変換ケーブルを接続する事と、スイッチ1個が載っているだけです。下の写真と接続図を見ていただければ判る様に、ユニバーサル基板は信号線の中継をしているだけです。JP2の位置はUSB-シリアル変換ケーブルと接続する6ピンコネクタに対して2.54mmピッチから若干ズレていたので、ユニバーサル基板上に新たに穴を開けて信号を引き出しました。
(全部のピンが2.54mmピッチに載っていれば便利だったのですが。)

実験回路(表面)
実験回路(表面)
実験回路(裏面)
実験回路(裏面)
接続図
接続図

JP2から引き出したスイッチは、無線通信が成立後、短絡状態でMLDPモードと呼ばれるデータ送信モードに、開放状態でRN4020に対するコマンド送信モードになります。このスイッチが無いとコマンド/データの切り替えが出来ないので必須です。また、通信そのものはRTS/CTSの端子が繋がっていなくても出来る様ですが、RN4020内部のF/Wをアップデートするには必要となるので接続してあります。

・USB-シリアル変換ケーブル(3.3V用) 2本
「AE-RN4020-XB」内部には3.3Vのレギュレーターが実装されており、モジュール本体は3.3Vで動作しています。信号レベルが3.3Vなので、このUSB-シリアル変換ケーブルがうってつけです。

USB-シリアル変換ケーブル
USB-シリアル変換ケーブル(3.3V用)

USB-シリアル変換ケーブル(3.3V用)
型式:TTL-232R-3V3(FTDI製)

・PC 2台(又は1台)
いつものとおり、近距離で実験するのであればPCは1台で結構です。USBのコネクタが台数分必要です。

・PC用ターミナルソフト (TeraTermなど)
RN4020に対するコマンド/データの送受信に必要です。

2.事前設定

今回、TeraTermの設定が今までの実験とは少し違います。以下に設定を示します。

RN4020用端末設定
端末設定

端末設定の送信の改行コードは「CR」です。また、ローカルエコーはチェックを外して有ります。(ローカルエコーしない)

RN4020用シリアルポート設定
シリアルポート設定

フロー制御が「hardwere」になっています。COMポートの番号は、お使いの環境によって異なりますのでデバイスマネージャー等で確認してください。
※ハードフローを有効にしておくとデータが送れない時が有るようです。その場合はフロー制御を「none」に変更してください。

実験

では実験を始めます。先ずは二台の実験回路をセントラルとペリフェラルに設定し、接続させます。その後データ通信の実験を行います。

1.設定~接続

1-1.ペリフェラルの設定
実験回路のうち、一台をペリフェラル側に設定をします。RN4020はセントラルにもペリフェラルにも設定次第でなれますので、ここではペリフェラルに設定する方法を示します。毎度実験の度に同じ設定をしますので、TeraTermのマクロにしました。左下の文字列をテキストファイルにセーブして拡張子を「.ttl」に変更すればTeraTermがマクロとして認識してくれます。マクロの実行はメニューの「コントロール」-「マクロ」で実行できます。
右下が各コマンドの解説になります。マクロを実行する前に実験回路のスイッチを「コマンド」側にしてください。(JP2がオープンになる状態)
ーーー以下マクロです---

send '+' $0D ;Echo ON
mpause 100

send 'SF,1' $0D ;Module Initialize
mpause 100

send 'SS,FF000000' $0D ;Set SS
mpause 100

send 'SR,32000000' $0D ;Set MLDP Peripheral
mpause 100

send 'R,1' $0D ;Reboot
pause 5

send '+' $0D ;Echo ON
mpause 100

send 'D' $0D ;Device Information Display
mpause 300

---マクロ終了---
最初の”send ‘+’ $0D”はローカルエコーをオンするコマンドです。
$0Dは改行コード(CR)に相当します。
”mpause 100”は100mSのウェイトです。コマンド間には少し待ち時間を入れています。
”send ‘SF,1’ $0D”はモジュールのイニシャライズコマンドです。
”send ‘SS,FF000000’ $0D”は、モジュールの持っているサービス(BluetoothSIGで策定している体温計とか血糖値とかのサービス)を有効にしています。(使うかどうかは別ですが)
”send ‘SR,32000000’ $0D”では、マイクロチップ社の独自UART通信(データ通信)のモードをセットしています。(MLDPモードと呼んでいます)
”send ‘R,1’ $0D”これは再起動コマンドです。今まで設定した内容をモジュールの動作に反映させるには再起動する必要があります。再起動には少々時間がかかりますので、”mpause 100”の代わりに”pause 5”を入れて5秒間待っています。
send ‘+’ $0Dは先ほども出てきましたローカルエコーをオンするコマンドです。冒頭にローカルエコーをオンしていますが、再起動しているので、もう一度使っています。
”send ‘D’ $0D”は、現在デバイスがどの様な設定になっているのかを表示するコマンドです。これで設定した内容が正しく反映されているかを確認出来ます。
以上でペリフェラル側の設定は終了で、アドバタイズ信号を出し始め、セントラル側から見えるようになっています。

上記マクロを実行した結果は以下の様になります。

ペリフェラルイニシャライズ後
ペリフェラルイニシャライズ後

マクロ実行後の画面です。各種設定後、Dコマンドを発行し、モジュールの設定内容が表示されています。

1-2.セントラルの設定
続いてもう一台をセントラル(親)に設定します。こちらもマクロに登録して使いやすくしています。設定内容は異なりますが、コマンドそのものは殆どペリフェラルと一緒で、違うのは最後のFコマンドぐらいです。
マクロを実行する前に実験回路のスイッチを「コマンド」側にしてください。(JP2がオープンになる状態)
---以下マクロです---

send '+' $0D ;Echo ON
mpause 100

send 'SF,1' $0D ;Module Initialize
mpause 100

send 'SS,FF000000' $0D
mpause 100

send 'SR,92000000' $0D ;Set MLDP Central
mpause 100

send 'R,1' $0D ;Reboot
pause 5

send '+' $0D ;Echo ON
mpause 100

send 'D' $0D ;Device Information Display
mpause 300

send 'F' $0D ;Find Start

---マクロ終了---
最後の”send ‘F’ $0D”はペリフェラルを探すコマンドになります。

マクロを実行すると以下の様になります。

セントラルイニシャライズ後
セントラルイニシャライズ後

セントラル側のイニシャライズ後の画面表示です。設定後、Dコマンドで設定内容が表示されたのち、Fコマンドで周囲に有るBLEモジュールの情報が上がってきています。
「F」、「AOK」の下の行からが周囲に居るBLEモジュールの情報です。この中の「6827190AEE04,0,RNEE04,00035B0358E607DD021A08123A000300,-3C」の、行が先ほど設定したRN4020のペリフェラル側の情報です。

1-3.接続
ここまで設定出来たら、後はセントラル側からペリフェラルを指定して接続コマンド(Eコマンド)を発行するだけです。
「E,0,6827190AEE04」と入力し、エンターキーを押すとペリフェラルと接続し、「Connected」の表示がセントラル/ペリフェラルの両側に出ます。
(6827190AEE04はペリフェラル側のIDです。先のFコマンドで探した結果に表示されています。)

セントラル側コネクト画面
セントラル側コネクト画面
ペリフェラル側コネクト画面
ペリフェラル側コネクト画面

接続するとセントラル/ペリフェラルの両側に「Connected」の表示が出ます。
コマンド”E”の後ろには”0″又は”1″がパラメーターとして使われますが、ここはFコマンドで周囲のBLEモジュールを検索した時に出てくる二番目のパラメーターと同じものを使います。

2.データ通信

接続が出来た状態で両実験回路のスイッチをデータ側(JP2を短絡する側)に設定してください。すると、画面上に「MLDP」と表示が出て、MLDPモード(データ通信モード)に入った事が判ります。この状態だと、キーボードから送ったデータはそのまま相手方に送られます。

MLDPモードに入ったセントラル
MLDPモードに入ったセントラル
MLDPモードに入ったペリフェラル
MLDPモードに入ったペリフェラル

実験回路のスイッチをデータ側に設定するとMLDPモードに入ります。

これでデータ通信のモードに入りましたので、キーボードから文字を入力して相手方に正しく表示されるかを試してみましょう。例によって、セントラル側から「Hello!」を、続いてペリフェラル側から「Fine!」を送ってみます。

ペリフェラル側にHello!受信画面
ペリフェラル側にHello!が表示された
セントラル側Fine!受信画面
セントラル側にはFine!が表示されている

データ通信モードに入っているのでローカルエコーは有りませんが、お互いに送った文字が相手方に届いています。

3.切断

セントラルとペリフェラルの通信を切断するには「K」コマンドを用います。切断はセントラル/ペリフェラルのどちら側からでも実行できます。この時一点だけ注意があります。それはスイッチの切り替えを忘れない事です。データ通信中(JP2が短絡された状態)はKコマンドを送っても文字データとして相手方に送られてしまいますので、JP2が開放になる方向にスイッチを操作してからKコマンドを送ります。
以下にセントラル側から切断した時の画面を示します。

切断時セントラル側画面
切断時セントラル側画面
切断時ペリフェラル側画面
切断時ペリフェラル側画面

左の画面がセントラル側から切断した時のセントラル/ペリフェラルの画面表示です。

セントラル側のスイッチをコマンド側に切り替えると「CMD」の表示が画面に出ます。その後Kコマンドを発行すると「Connection End」が表示されます。これが表示されると同時にペリフェラル側に「CMD」と「Connection End」が表示されます。ペリフェラル側のスイッチは切り替えていないので、データ通信側のまま(JP2が短絡のまま)ですが、接続が切られているので、強制的にCMDモードになっているようです。

4.BluetoothSIGの策定したサービスの確認

先の設定の項目で簡単に説明しましたが、「SS」コマンドはBluetoothSIGが策定した各種サービスを有効にするかどうかのコマンドです。マイクロチップ社の資料(DS70005191A_JP)には以下の記述が有ります。(抜粋)

SSコマンドの説明
SSコマンドの説明

このコマンドでサポートしている各種サービスは以下のとおりです。(抜粋)

サービスのパターン

これを見るとデバイス情報、バッテリ情報以下各種のサービスが利用出来ます。さて、先の初期設定コマンドでは「SS,FF000000」と設定しました。と、言う事は
・デバイス情報
・バッテリ情報
・ハートレート(心拍)
・体温計
・グルコース(血糖値)
・血圧
・ランニングスピード
・サイクリングスピード
などなどの情報が送れるようになっているハズです。ちなみに、BluetoothSIGでは、これらのサービスを「UUID」と言う数字で管理しています。例えば、デバイス情報のサービスに相当するUUIDは「180A」と言った具合に。また、それぞれのサービスの下には、具体的な情報が入っている「キャラクタリスティックス」と言う物が有りますが、これもUUIDで管理されています。BluetoothSIGで策定しているサービスやキャラクタリスティックスは、良く使われるものなので、16ビット(16進数で4文字)ですが、SIGで決められていない独自のサービスやキャラクタリスティックスを作る事も出来、この場合は128ビットのUUIDを使う事になっています。

RN4020のコマンドモードでは、「LS」コマンドを使う事で何のサービスが有効になっているのかが判る様になっています。試しにセントラル側のモジュールにLSコマンドを送ってみましょう。(コマンドとして送りますので、実験回路のスイッチはJP2が開放になる側にしてください)

セントラル側LSコマンド
セントラル側LSコマンド

???LSコマンドを送った結果では180Aと180Fの二つしかサービスが出てきません。ペリフェラル側でLSコマンドを送っても同様な結果でした。
ここで、180Aとか180Fが何のサービスに対応するUUIDなのかはマイクロチップ社の資料(DS50002279A_JP)によると以下の様になっています。

サービスとUUIDの対比表

LSコマンドの結果と上の表を照らし合わせてみると、デバイス情報とバッテリ情報しか使えないようです。これは明らかにSSコマンドの設定値と違っています。
ここで、このモジュールに入っているF/Wのバージョンをデバイス情報を使って調べてみます。具体的にはデバイス情報(180A)の下にぶら下がっている2A26がF/Wのバージョンを示すUUIDとの資料が見つかりましたので、この中身を読みだしてみます。中身を読み出すには「SUR」コマンドと言う物を使います。以下に実行結果を示します。

F/Wバージョン読み出し結果
F/Wバージョン読み出し結果

「SUR,2A26」とコマンドを打ったところ、「312E3333424543」と返ってきました。これはキャラクターコードで返ってきているので”31”を数字の”1”と、言う様に解読する必要があります。この様にして解読すると上記文字列は「1.33BEC」と変換されます。つまり、このモジュールにはF/Wバージョン1.33BECと言う物が搭載されている事が判りました。ここでマイクロチップ社のサイトでこのバージョンに関する情報を探したところ、リリースノートが見つかりました。

リリースノート抜粋
リリースノート抜粋

太字で書いてありました。F/Wバージョン1.33BECではSSコマンドでサポートしているのはデバイス情報とバッテリ情報だけとなっています。そのためにSSコマンドで色々指定しても二つしか出てこなかったのですね。納得。

※捕捉説明
LSコマンドを打つと、先ずサービスのUUIDが表示され次の段落ちしている部分に、そのサービスにぶら下がっているキャラクタリスティックスのUUIDが表示されます。BluetoothSIGで策定されているUUIDに関しては資料が発行されていて、何のUUIDが何のサービス/キャラクタリスティックスに割り当てられているのかが判る様になっています。以下に例を示します。
(BluetoothSIG発行の「16-bit UUID NumbersDocument」から抜粋)

BluetoothSIGで策定しているUUIDの一部抜粋
BluetoothSIGで策定しているUUIDの一部抜粋

これはデバイス情報サービス(180A)の下にぶら下がっているキャラクタリスティックス(2A24~2A29)の周辺のリストです。(赤枠内)これを見るとどのUUIDに何の情報が入っているのかが判ります。

キャラクタリスティックスの中身を読み書きする手段としては、UUIDを指定して読み書きするSURコマンド/SUWコマンドが有ります。また、ハンドル(LSコマンドでキャラクタリスティックスを確認した時にUUIDの右側に表示される4桁の数字。例えば2A25のUUIDに対応するハンドルは000E)を使って読み書きするSHRコマンド/SHWコマンドが有ります。
また、通信の相手方のキャラクタリスティックスを読み書きする手段もUUIDを使ったコマンド、ハンドルを使ったコマンドの両方が有ります。詳しくはユーザーズマニュアルを確認してください。

5.通信の相手方サービスを確認する

先ほどは「LS」コマンドで自身のサポートしているサービスを確認しましたが、無線を接続した状態で「LC」コマンドを発行すると通信の相手方のサービス内容が確認出来ます。以下にセントラル側からペリフェラル側に向かってLCコマンドを発行した時の結果を示します。

ペリフェラルのサービスを確認

左の画面がセントラル側からペリフェラル側のサービス内容を確認した結果です。同じ設定をしてあるのでLSコマンド(自身のサービスを確認)と結果は同じですが、LCコマンドに対して正常に終了しています。ちなみに、先ほどは「SUR」コマンドで自身のUUIDの中身を読みましたが、「CURV」と言うコマンドを使うと相手方のUUIDの中身が読めます。2A25と言うUUIDがシリアル番号を格納しているUUIDになりますので、これを読んでみましょう。

シリアル番号読み出し結果
シリアル番号読み出し結果

「SUR,2A25」がセントラル自身のシリアル番号読み出し結果で、「CURV,2A25」が相手方(ペリフェラル)のシリアル番号読み出し結果です。F/Wバージョンと同様にキャラクターコードで書かれているので解読すると、
セントラル:6827190AEA6E
ペリフェラル:6827190AEE04
と、解読されます。
1.設定~接続の所で表示されている画面(BTA=xxxの所)を見れば分かるように、セントラル/ペリフェラルのアドレスが正しく表示されていることが判ると思います。

この様にして相手方の内容を読み出す事が出来ますのでBluetoothSIGで決められたUUIDを利用すると、もしメーカーが違っている場合でも正しい値を読む事が出来ます。(書き込みのコマンドも有りますので、キャラクタリスティックスが書き込みに対応していれば相手方に通知する事も出来ます。)

6.F/Wの書き換え

買ってきたモジュールの中身が(F/Wバージョンが)1.33BECで有ったため、サービスがデバイス情報とバッテリ情報だけになっていましたが、F/Wを書き換えると、もっとサービスが増えるのか試してみたくなりました。
マイクロチップ社のサイトにはF/W書き換えツールが有りますので、これをダウンロードして試してみます。書き換えツールはこのページの下の方の「RN4020 Firmware Update v1.10-1.33BEC」のリンクに有ります。(zipファイルです。)
解凍して「RN4020_DFU_Utility_v110-133BEC.exe」を起動すると以下の画面になります。

DFU起動画面
起動画面

起動すると左の様な画面になります。接続しているCOMポートを選びますが、先ず「Scan」のボタンを押してから左のドロップダウンリストをクリックして選んでください。

COMポートスキャン後
COMポートスキャン後

今回使っているCOMポートはCOM11なので、それを選択し、書き込むファイルとして「RN4020_123_080715_DFU.bin」を選びました。(バージョン1.23?)
選択後、「Update」を押すと書き換えが実行されます。

書き換え成功画面
書き換え成功画面

書き換えが成功すると左の様な画面になります。OKを押してから書き換えアプリを終了します。(Close又は右上のバッテン)

書き換えが完了しましたので、もう一度マクロを実行してからLSコマンドを発行してみましょう。

LSコマンド確認結果(V1.23)
LSコマンド確認結果

古いバージョンのF/Wを書き込んでLSコマンドを発行したところ、左の画面の様に沢山のサービスが表示されました。この結果と設定内容を見比べると、確かにSSコマンドで設定した通りになっていました。
何でバージョンアップに伴ってサービスを削除したのでしょうかね?きっと何か都合の悪いことが有るのでしょう。サッサと最新バージョンのF/Wに戻しておきましょう。

最新バージョンではサービスが減ってしまっていますが、RN4020では独自のサービスを作る事が出来ますので悲観する事は有りません。「PS」「PC」コマンドで独自のサービスが設定できます。PSコマンドで独自サービスのUUIDを設定し、PCコマンドでキャラクタリスティックスの設定が出来ます。通信の相手方は、この独自のキャラクタリスティックスにアクセスする事によりデータのやり取りが出来るようになります。以下に手順を示します。

7.独自サービスの設定

独自サービス、キャラクタリスティックスを作るにはUUIDを何とかしなくてはいけません。勝手に適当な値を使うと誰かが使っているかも知れません。他人とUUIDが被らないようにUUIDを生成してくれるサイトが有りました。「Online UUID Generator」と言うサイトです。このサイトに行くとオリジナルのUUIDを生成してくれます。複数欲しい時は(サービスとキャラクタリスティックスを作るのですから複数必要ですが)生成されたUUIDの下の「Refresh」をクリックすれば次のUUIDを生成してくれます。生成されたUUIDの脇にコピーボタンも付いていますので、コピペのミスも防げます。では手順を追って説明します。

7-1.UUIDの確保
先のサイトでUUIDを必要数だけ確保します。

UUIDの生成
UUIDの生成

先に案内しましたサイトにアクセスするとUUIDが生成されています。ここで「Copy」のボタンを押すとPCの中に数字がコピーされます。

UUIDがPCにコピーされると数字の右側が「Copied!」の表示に変わります。新しいUUIDが必要な場合は数字の下の「Refresh」を押してください。
この様にして、サービス/キャラクタリスティックスに必要な数だけUUIDを取得してください。

7-2.マクロの改造
サービスを追加したい側のマクロを改造します。ここではペリフェラル側に独自サービスを追加する事とします。

①独自サービスを有効にする。
SSコマンドで各種サービスを設定しましたが、独自サービスを有効にするには一番下のビットをオン(“1”)にする必要が有ります。よって、現在
「send ‘SS,FF000000‘ $0D」となっている部分を「send ‘SS,FF000001‘ $0D」に変更します。

②サービスのUUID設定
PSコマンドを用いて独自サービスのUUIDを設定します。事前に取得したUUIDが「f6dff4e3510f41f79031e9b6005bd345」でしたので、コマンドとしては以下の様に記述します。
「send ‘PS,f6dff4e3510f41f79031e9b6005bd345’ $0D」
ここで注意して欲しいのは、先のサイトでUUIDを取得すると、途中にハイフン(-)が入っているのですが、これを削除して記述してください。また、コマンド送出後、「mpause 100」を入れて、次のコマンドとの間に少し待ち時間を取って下さい。

③キャラクタリスティックスのUUIDと属性の設定
サービスのUUIDは、単にサービスの番号としてUUIDを割り当てれば済みましたが、キャラクタリスティックスに関しては読むだけとか書くだけ、読み書き可、変更が有った時に相手方に通知(Notifyと言います)するなどの属性と、中身が何バイト有るのかなどを設定する必要が有ります。ここでは取得した二つのUUIDを使って以下の様に設定しました。
「send ‘PC,88b9575beec049e78c3ae3d34db55549,1A,02’ $0D」
「mpause 100」
「send ‘PC,c6183bcad98042388b7b39898b42cf63,1A,02’ $0D」
「mpause 100」
ここで、
「PC」がキャラクタリスティックスの設定コマンドを表し、
次の文字列がキャラクタリスティックスに対応するUUID、
次の「1A」が属性です。(この場合、Notify/読み出し/書き込みになっています。)属性の設定の仕方はマイクロチップ社の資料(DS70005191A_JP)に説明が有ります。
最後の「02」はキャラクタリスティックスの中身の大きさ(バイト数)になります。これはお使いになる機能に合わせて設定してください。

キャラクタリスティックスの属性
キャラクタリスティックスの属性(マイクロチップ社の資料から抜粋)

ここで、②と③のコマンドを追加する位置ですが、これらのコマンドは設定後に再起動しないと有効とならないので、
「send ‘R,1’ $0D」の前に追加してください。全体としては以下の様な形になります。

send ‘+’ $0D ;Echo ON
mpause 100

send ‘SF,1’ $0D ;Module Initialize
mpause 100

send ‘SS,FF000001‘ $0D ;Set SS
mpause 100

send ‘SR,32000000’ $0D ;Set MLDP Peripheral
mpause 100

send ‘PS,f6dff4e3510f41f79031e9b6005bd345’ $0D ;Set Original UUID
mpause 100


send ‘PC,88b9575beec049e78c3ae3d34db55549,1A,02’ $0D ;Set Original Characteristics1
mpause 100


send ‘PC,c6183bcad98042388b7b39898b42cf63,1A,02’ $0D ;Set Original Characteristics2
mpause 100


send ‘R,1’ $0D ;Reboot
pause 5

send ‘+’ $0D ;Echo ON
mpause 100

send ‘D’ $0D ;Device Information Display
mpause 300

ちなみに、このマクロを2回目以降実行すると、PCの設定部分でエラーが出ます。これは初期化コマンド「SF,1」ではPCの設定がクリアされないため、既に設定されている物を上書きしようとしてエラーになります。マクロ中の「SF,1」を「SF,2」に変更すればエラーは出なくなりますが、全ての設定が初期化されるため、デバイス名などを意図的に変更している方はこれも元に戻ってしまいますので注意してください。

7-3.独自サービスが追加されたかの確認
上記マクロを実行し、「LS」コマンドを使って独自サービスが設定されたかを確認します。

マクロ実行後LSコマンドで確認

上記マクロを実行し、LSコマンドを使ってサービスを確認した結果です。サービスに元々有った180A、180Fに加えてマクロで組み込んだ独自サービスが追加されている事が確認出来ました。今回作ったキャラクタリスティックスは、「Notify」の属性を持たせたため、同じUUIDで二つのハンドルを持った形になっています。一方のハンドルは値そのものを入れる為のもので、もう一方はNotifyをするかどうかの設定用です。具体的にはハンドルが「001C」のものと「001F」のものが設定用のハンドルです。この中身が「0000」だとNotifyが無効で「0100」に設定すると有効になります。

LCコマンドで相手方からサービスを確認

セントラル側と接続し、LCコマンドを使ってペリフェラル側のサービスを確認しました。追加した独自サービスが見えています。これで自由に中身を確認したり書き込んだりすることが出来るようになりました。

8.独自サービスを使ってみる

作成したサービスを実際に使ってみましょう。電源オンからマクロを実行し、セントラル側からペリフェラル側のサービスをLCコマンドで調べ、独自サービスのキャラクタリスティックスの内容をCHRコマンドで調べた結果です。

独自サービスの初期内容
独自サービスの初期内容

LCコマンドで独自サービスのハンドルを調べ、CHRコマンドを使って各キャラクタリスティックスの中身を調べた結果です。値を入れるキャラクタリスティックスは中身がカラなので何も出てきません。Notifyの設定を入れるハンドル(001Cと001F)は中身が「0000」でNotifyが無効となっています。

この状態でペリフェラル側の値を書き換えるとどうなるか試してみます。

ペリフェラルに書く
ペリフェラルに書く
セントラルは変化なし

ペリフェラル側からハンドルの001Bに「4142」と言うデータを書きましたが、セントラル側には変化有りません。Notifyが無効になっているので内容が変化しても通知が来ない為です。但し、積極的に読み出せば変化した値が読めます。

セントラル側から積極的に読み出した結果
読み出し結果

左の結果は、セントラル側からCHRコマンドを使って読み出した結果です。きちんとペリフェラル側で変更した内容が入って居る事が確認出来ます。ただ、通知が来ないのでイチイチ確認しなくてはならないので面倒です。そこで、Notifyを有効にするためにセントラル側からCHWコマンドを使って有効にします。

Notify有効化
セントラル側
Notify有効化時のペリフェラル側
ペリフェラル側

セントラル側からCHWコマンドでNotifyを有効にすると(CHW,001C,0100)、先ほど通知されなかった「4142」が通知されると共に、ペリフェラル側にはハンドル001Cの内容が変更された旨の通知(WC,001C,0100)が出ます。それからペリフェラル側でSHWコマンドを使ってハンドル001Bの内容を「6566」に書き換えるとセントラル側には自動的に通知が為されました。(Notify,001B,6566)

以上の様に、独自に作成したサービスが使える事が確認出来ました。今までのBLEの実験では、データを通すだけのものが多かったですが、今回はもう一段BLEの中身に近づいたような実験になりました。先にも説明しましたが、BluetoothSIGで策定したサービス/キャラクタリスティックスのUUIDはSIGの資料を参照すれば判ります。RN4020のUUIDの読み出し/書き込み又はキャラクタリスティックスの読み出し/書き込み機能を使えば他メーカーのBLEモジュールであってもSIGが決めたサービス/キャラクタリスティックスは読み出し/書き込みが出来ます。

無線モジュール.comでは無線モジュールを利用した様々な提案・開発を行っております。こちらのページには無線化の際のヒントを載せています。

また、是非開発実績もご覧になってください。

次の記事

ESP32を使ってみた