「AmbientでIoTをはじめよう」、第13回、第14回はmicro:bitを使って温度データをBluetooth Low Energy (BLE) で発信し、 ゲートウェイ経由でAmbientに送って、記録し、グラフ化(可視化)します。 第13回はmicro:bitとゲートウェイをBLEコネクトモードで通信する方法を説明します。 ブロードキャストモードでの通信は第14回「micro:bitで温度データをAmbientに送りグラフにする(ブロードキャストモード編)」をご覧ください。
micro:bitはイギリスBBCが教育用に開発したシングルボードコンピューターです。 プロセッサーとしてARM Cortex-M0をベースにしたNordic nRF51822を搭載し、Bluetooth Low Energy (BLE) で通信できます。
ボード上に25個のLED、2個のボタンスイッチ、加速度センサ、磁力センサが搭載されており、照度や温度を測ることもできます。 温度はプロセッサー内蔵の温度センサを使っています。
今回はmicro:bit本体とケース、電池ボックスなど、始めるのに便利な部材が入った「micro:bitをはじめようキット」を使いました。
プログラミング言語としては、Microsoft Block Editor、MicroPython、JavaScriptなどが使えます。 Block Editorはビジュアルに機能ブロックを組み合わせてプログラムが書けます。 micro:bitとの親和性がいいので、今回はBlock Editorを使ってプログラミングします。
プロセッサー内蔵の温度センサを使って温度を測り、データをBluetooth Low Energy (BLE) で発信します。 Raspberry Pi Zero WHをゲートウェイにしてBLEでデータを受信し、IoTデータ可視化サービス「Ambient」に送って、グラフ化します。
プロセッサー内蔵の温度センサはプロセッサーの発熱の影響を受けます。 その影響を避けるため、ブロードキャスト編ではBME280を使って温度などを測るバージョンも開発します。
Block EditorでBLEを使うために、機能ブロックの中の「高度なブロック」 > 「拡張機能」を選択し、bluetoothを追加します。 Bluetoothはradio機能と同居できないので、radioを削除します。
これでbluetoothが追加されます。 さらに「プロジェクトの設定」で「No Pairing Required: Any One can connect via Bluetooth.」を選択します。
Bluetooth機能ブロックには、加速度、ボタン、温度計などのサービスと、「接続されたとき」、「接続が切断されたとき」といった条件、 「UIDをアドバタイズ」、「URLをアドバタイズ」、UARTでの文字の送受信などがあります。
BLEデバイスの通信にはコネクトモードとブロードキャストモードがあります。 詳細は「BLE環境センサ・ゲートウェイ(Raspberry Pi編)」をご覧ください。
コネクトモードは双方向通信なので、ゲートウェイからセンサ端末のデータを取得するだけでなく、センサ端末のモード設定をおこなうこともできます。 センサ端末は常にゲートウェイからのコネクトを待つため、消費電力が多くなりがちです。
ブロードキャストモードは一方向通信です。センサ端末からデータを発信するには適した方式ですし、 5分に1回、10秒間だけブロードキャストするといった間欠動作をおこなうことで消費電力を低く抑えることも可能です。
「最初だけ」に「Bluetooth 温度計サービス」ブロックを入れると、温度計サービスが組み込まれます。 プログラムをダウンロードして動かせば、アドバタイズが始まります。 ゲートウェイなどのセントラル側でスキャンしてmicro:bitを見つけ、接続して温度データを読めます。 一般的にBLE通信では、サービスとキャラクタリスティクスを定義して、UUIDを付与し、 キャラクタリスティクスにread要求があった場合にセンサデータを返す処理を書く必要があります。 micro:bitで予め用意された温度、加速度などのサービスは、機能ブロックを「最初だけ」に入れるだけで必要な処理がすべて組み込まれます。
これだけだとmicro:bitの動作が見えないので、「接続されたとき」に温度をLEDに表示し、「接続が切断されたとき」に悲しい顔マークを表示してみます。
このプログラムのhexファイルを作り、micro:bitにダウンロードします。ダウンロードが終わると、プログラムが動きます。
動作確認にはスマホアプリ「BLE Scanner」が便利です。
BLE Scannerでスキャンすると、デバイスリストに「micro:bit [puzup]」が表示されます。 [puzup] の部分は端末によって異なるようです。
Connectすると、DEVICE UUIDなどの情報が表示され、micro:bitのLEDは温度の表示に変わります。
micro:bitのBLEプロファイルによれば、サービスとキャラクタリスティクスのUUIDは次のようになっています。
ベースUUID | E95D0000-251D-470A-A062-FA1922DFA9A8 |
温度計サービスのサービスUUID | E95D6100-251D-470A-A062-FA1922DFA9A8 |
温度のキャラクタリスティクスUUID | E95D9250-251D-470A-A062-FA1922DFA9A8 |
UUIDの5桁目から8桁目までがサービスやキャラクタリスティクスによって固有の値に変わります。
BLE Scannerで温度計サービスとその先の温度のキャラクタリスティクスを見ると、値が0x17(23℃)で、LEDにも同じ値が表示されています。
これでmicro:bit側の動作は確認できました。次はゲートウェイ側です。
ゲートウェイは「BLE環境センサ・ゲートウェイ(Raspberry Pi編)」で開発したものをベースにします。 Raspberry PiへのBLEライブラリのインストールなどはこの資料をご覧ください。 ゲートウェイはRaspberry Pi Zero WHを使いました。
大まかな流れは次のようになります。
まずスキャンしてmicro:bitを見つけます。 micro:bitのアドバタイジングデータはAdTypeが「Complete Local Name」、値が「BBC micro:bit [xxxxx]」です。 [xxxxx]の部分はボードによって変わるようです。そこで、[xxxxx]の部分を無視し、値が「BBC micro:bit」に前方一致したものを見つけます。
端末を見つけたら、スレッドを起動し、端末にコネクトして、周期的にデータを読み出します。 温度のキャラクタリスティクスUUIDを指定してgetCharacteristics()し、read()すると温度データが取得できます。
ゲートウェイプログラムはGithubに公開しました。
micro:bitとゲートウェイのプログラムを動かすと、温度を測定し、ゲートウェイ経由でAmbientに温度データが送信され、グラフ表示されます。
ブロードキャストモードは「micro:bitで温度データをAmbientに送ってグラフにする(ブロードキャストモード編)」をご覧ください。
この記事はアンビエントデーターの下島が担当しました。