nRF Connect のマクロ機能で Philips Hue をLチカする

ファームウェアエンジニアの中林 (id:tomo-wait-for-it-yuki) です。 BLE 製品開発者の100割が使用していることで有名な nRF Connect ですが、BLE 通信のマクロ機能があることはご存知でしょうか? 本エントリでは nRF Connect のマクロ機能を使って、組込み界の Hello, World であるLチカをやっていきます。 エントリ内ではリファレンスデバイスとして、スマートライトの Philips Hue を使用します。

Philips Hue でLチカ!

実は、この nRF Connect のマクロ機能を使って Nature Remo から BLE マクロをリモート実行する機能のベータテスターを絶賛募集中です。 もしこのエントリを読んで興味を持った方は、ぜひご応募ください。

engineering.nature.global

nRF Connect

play.google.com

BLE の SoC nRF シリーズを開発していることで有名な Nordic Semiconductor 社が提供しているツールです。 BLE デバイスのスキャナーとして使ったり、GATT 通信のデバッグに活用している方も多くいらっしゃるかと思います。

for Mobile と for Desktop があるのですが、今回紹介するのはスマートフォンアプリの for Mobile です。

最初に注意点ですが、同じ nRF Connect for Mobile でも Android 版と iPhone 版とは全く別物です (見た目から違います) 。 本エントリで紹介する BLE マクロ機能は Android 版にしか存在しないため、iPhone ユーザーの方はご注意ください。

nRF Connect で GATT 通信

さて、早速 nRF Connect の BLE マクロを使っていきましょう、と言いたいところなのですが、まず前提となる nRF Connect で GATT 通信する方法を簡単に紹介します。 BLE の GATT 通信についての解説は Web 上にもたくさんあるため、省略します。

リファレンスデバイスPhilips Hue はあらかじめ、公式アプリでセットアップを済ませておき、消灯状態にします。 nRF Connect だけで Philips Hue を点灯してみます。

操作手順

手順は簡単です。

  1. リファレンスデバイスに接続する
  2. キャラクタリスティック (UUID: 932c32bd-0002-47a2-835a-a8d455b859dd) に 0x01 を書き込む

これを nRF Connect で操作していきます。

nRF Connect での操作

公式アプリでリファレンスデバイスをセットアップした状態で、nRF Connect を起動し周囲の BLE デバイスをスキャンすると、該当デバイスBONDED な状態で検出されます。 アイコンがクリスマス仕様になっていますね。 メリークリスマス!

ここで、 CONNECT ボタンを押してリファレンスデバイスと接続します。

リファレンスデバイスが BONDED 状態で見つかることを確認

接続が完了すると、リファレンスデバイスが搭載している GATT サービスの一覧が表示されます。 そのうち、赤枠で囲ったサービス (UUID: 932c32bd-0000-47a2-835a-a8d455b859dd) がリファレンスデバイスを操作するためのサービスになっているので、タップします。

リファレンスデバイスGATT サービス一覧

すると、サービスが持つキャラクタリスティクスが表示されます。 上から2つ目のキャラクタリスティック (UUID: 932c32bd-0002-47a2-835a-a8d455b859dd) がリファレンスデバイスを点灯 / 消灯するためのキャラクタリスティックとなっています。

キャラクタリスティックに書き込むときは上矢印のアイコンをタップします (補足: 読み込みは下矢印1つのアイコン、通知の有効化は下矢印3つのアイコンを、それぞれタップします) 。

On / Off キャラクタリスティック

該当のキャラクタリスティックに1バイトだけ書き込みたい場合は、BYTE を選択します。

1バイト書き込む

書き込みたいデータ 0x01 を入力して、SEND ボタンをタップすると、キャラクタリスティックへの書き込みが実行されます。

0x01 を書き込む

無事リファレンスデバイスが点灯しました。

ピカーン

nRF Connect のマクロ

それでは、本題のマクロ機能です。 対象機器に接続したあとのサービスやキャラクタリスティクスが表示されている画面の右下に、マクロの記録やマクロの実行を開始するためのメニューボタンがあります。

マクロメニューボタン

赤い○ボタンをタップすれば、マクロの記録がはじまります。 上でリファレンスデバイスを点灯したように、キャラクタリスティックにデータを書き込んだり、データを読み込んだりして、目的の操作を実行します。 目的の操作を終えたら、■ ボタンで終了し、名前とアイコンを選んで保存します (なぜかアイコンにピカチュウがあります) 。

マクロの記録開始

保存したマクロは ▶ ボタンで実行できます。 マクロををタップすると、どのようなオペレーションが記録されているか詳細を見ることができ、マクロのステップ実行も可能です。 実行時に失敗したオペレーションには ! マークがつきます。

マクロの詳細

れっつ L チカ!

では、マクロ機能を使って、リファレンスデバイスを点滅させてみましょう。 マクロの記録を開始して、次のマクロを作ります。

  1. リファレンスデバイスを点灯する
  2. 500[ms] スリープする
  3. リファレンスデバイスを消灯する
  4. 500[ms] スリープする

スリープは砂時計アイコンから、スリープする期間を選ぶことで挿入できます。

スリープオペレーションの追加

マクロを保存したら、マクロ詳細を開いて、リピート実行ボタンをタップした上で、マクロを実行します。

マクロのリピート実行

すると本エントリ冒頭の gif のように無事チカチカします。

マクロのインポートとエクスポート

保存したマクロは XML 形式でエクスポートすることができます。 また、XML 形式のマクロをインポートすることもできます。

先ほど作った L チカのマクロは XML 形式だと下記の内容になります。 最初に、使用するサービスやキャラクタリクスがターゲットデバイスに存在するかどうかチェックする assert-service が自動的に挿入されます。 それ以外は素直にサービスとキャラクタリスティックを指定して、データを書き込む内容ですね。

<macro name="blink" icon="PLAY">
   <assert-service description="Ensure 932c32bd-0000-47a2-835a-a8d455b859dd service" uuid="932c32bd-0000-47a2-835a-a8d455b859dd">
      <assert-characteristic description="Ensure 932c32bd-0002-47a2-835a-a8d455b859dd characteristic" uuid="932c32bd-0002-47a2-835a-a8d455b859dd">
         <property name="WRITE" requirement="MANDATORY"/>
      </assert-characteristic>
   </assert-service>
   <write description="Write 0x01 to 932c32bd-0002-47a2-835a-a8d455b859dd" characteristic-uuid="932c32bd-0002-47a2-835a-a8d455b859dd" service-uuid="932c32bd-0000-47a2-835a-a8d455b859dd" value="01" type="WRITE_REQUEST"/>
   <sleep description="Sleep 500 ms" timeout="500"/>
   <write description="Write 0x00 to 932c32bd-0002-47a2-835a-a8d455b859dd" characteristic-uuid="932c32bd-0002-47a2-835a-a8d455b859dd" service-uuid="932c32bd-0000-47a2-835a-a8d455b859dd" value="00" type="WRITE_REQUEST"/>
   <sleep description="Sleep 500 ms" timeout="500"/>
</macro>

マクロの構文

マクロの構文は下記リポジトリで公開されています。 このリポジトリではさらに adb からマクロを実行して自動テストする方法も紹介されています。 自動テストはまだ試したことがありませんが、こちらも便利そうですね。

github.com

Nature Remo BLE マクロベータテスター募集中です

このようなマクロ機能を遠隔地から実行できると素敵だと思いませんか? 実は Nature Remo の新機能として、開発を進めており、現在ベータテスターを募集中です。

募集要項はこちらです。

engineering.nature.global

応募はこちらのフォームからどうぞ!

forms.gle