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