micro:bit では無線を使ったプログラムを作成できます。
- micro:bit オリジナルの 2.4GHz 帯プロトコル
- Bluetooth プロトコル
使いやすいのは micro:bit Radio プロトコルですが、ここでは BLE デバイスとして micro:bit を使う実験をします。
cf., micro:bit Radio プロトコル
今回の実験には使用しませんが、オリジナルプロトコルについても付記しておきます。
オリジナルプロトコルについての詳細はこちら
https://lancaster-university.github.io/microbit-docs/ubit/radio/
オリジナルプロトコルは micro:bit Radio プロトコルと呼ばれていますが、正式な用語定義やプロトコル定義は見つかりませんでした。
micro:bit に搭載されている nRF52822 チップの開発元である Nordic 社独自の「Gazell」という2.4GHzプロトコルに関連しているらしいです。
https://devzone.nordicsemi.com/f/nordic-q-a/41770/how-can-i-make-nrf52832-talk-to-microbit-by-radio-gazell
Bluetooth プロトコルでの実験
ここでは一般的な BLE と同じように使用する方法を示します。
micro:bit に搭載されている温度センサーを、スマホなどで取得できるようにします。
環境
- micro:bit v1.5
- Ubuntu 20.04 LTS
- Android 10 ( moto g(8) power
- Makecode 開発環境
ハードウェア
- micro:bit を USB ケーブルで PCに接続します。
- その他の工作は今回の実験では行いません。
ソフトウェア
Nordic の 「nRF Connect」を使用します。
スマホアプリおよび Desktop アプリとして提供されており、Desktop アプリは WindowsやMac、Linux、で使えます。しかしながら Desktop アプリは利用準備に手間がかかりますので、今回は Android で動作する「nRF Connect」を使用します。
なお、 iOS 版については今回は動作確認はしていません。
cf., iOS 版は以下のように開発されているようです。
「NordicSemiconductor / IOS-nRF-Connect」
https://github.com/NordicSemiconductor/IOS-nRF-Connect
BLEを使わずに micro:bit の動作を確認
「新しいプロジェクト」で「TEST1」などの名前を付けてプログラムを以下のように作ります。
左下のアイコンからダウンロードします。
「Hello!」と表示されます。
BLEプログラムを作る
「硬度なブロック」-「拡張機能」
micro:bit は接続のための方法を3種類備えています。
- ペアリングなし接続
- パスキーペアリング経由の接続
- Just Worksペアリング経由の接続
ON時にアドバタイズを行ったうえで、ペアリング動作無し接続で試すために、
右上の歯車アイコン→「プロジェクトの設定」から、設定を変更してください。
以下のように配置します
「Bluetooth 温度計サービス」を追加するだけで、温度の送信に対応した機能が追加されます。
Android 版の nRF Connect を使用する
「nrf connect 」で検索、インストールします。
実行します。
BBC micro bit を選択します。
micro:bit Temperature Service の下にいくつかキャラクタリスティックが出ています。micro:bit Temperature の横にある連続受信のアイコン(下矢印が3つ重なっているヤツ)を選択します
温度が表示されるようになります。
この温度表示機能は
TEMPERATURE SERVICE
として
E95D6100251D470AA062FA1922DFA9A8
として128ビットの ServiceUUID で定義、
また
TEMPERATURE SERVICE - CHARACTERISTICS
として
E95D9250251D470AA062FA1922DFA9A8
として128ビットの CharacteristicsUUID での定義が
「2021/5/2Bluetooth Developer Studio Level 3 Profile Report」
https://lancaster-university.github.io/microbit-docs/resources/bluetooth/bluetooth_profile.html
によってなされています。
Bluetooth の 温度センサといえば 16ビットのUUID で定義されている 「0x0543 Temperature Sensor」
https://specificationrefs.bluetooth.com/assigned-values/Appearance%20Values.pdf
ですが、 今回使用したものは micro:bit の専用の ServiceUUID/CharacteristicsUUID となっているようです。
さて、この Temperature Service はオンボードの温度センサの値となっていて、そのままでは簡単に自由なデータを送受信はできないです。
例えば、外部にセンサーをつなげてそのセンサーの値を温度として送るときにはどうしたらいいでしょうか?
Bluetooth UART サービス
Bluetooth の 「その他」のアイコン中に Bluetooth UART サービスがあります。
これを使って、任意の値を送ることができます。
UART でテスト
Bluetooth UART サービスに先立ち、一般的な UART通信をつかって、USBで接続しているパソコンに任意の値を送ってみます。
先程のプログラムを以下に変更します。
PC側でシリアル通信ソフトを起動して、数字が来ていることを確認してみます。ここでは Arduino 開発環境のシリアルモニターで確認してみました。
出力が確認できたら、これと同じものを Bluetooth で取得するようにしてみましょう。
Bluetooth UART でデータを受けてみる
以下のようにプログラムを書き換えます。
nRF Connect で見てみると、6E400001-B5A3-F393-E0A9-E50E24DCCA9E としてサービスUUIDが見えることがわかります。
RX Characteritic を開けるとデータが更新されていきます。
さて、サービス UUID やキャラクタリスティック UUID は、定義済
https://www.bluetooth.com/specifications/assigned-numbers/
のものと vendor-specific のものとがあります。
そして、この 6E400001-B5A3-F393-E0A9-E50E24DCCA9E の サービス UUID および 6E400002-B5A3-F393-E0A9-E50E24DCCA9E のキャラクタリスティック UUID は vendor-specific のものとなります。この値は、Nordic Semiconductor 社が独自に定めた Nordic UART Service あるいは NUS と言われているもの
https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/include/bluetooth/services/nus.html
と一致します。
そして、先にも挙げた
「2021/5/2Bluetooth Developer Studio Level 3 Profile Report」
https://lancaster-university.github.io/microbit-docs/resources/bluetooth/bluetooth_profile.html
によると、「UART SERVICE」に「UUID6E400001B5A3F393E0A9E50E24DCCA9E」の値と共に
This is an implementation of Nordic Semicondutor's UART/Serial Port Emulation over Bluetooth low energy.
See https://developer.nordicsemi.com/nRF5_SDK/nRF51_SDK_v8.x.x/doc/8.0.0/s110/html/a00072.html for the original Nordic Semiconductor
documentation by way of background.
とあり、micro:bit Bluetooth UART サービスは Norduc UART Service と同じものと考えていいことになります。
さて現時点で USB 経由の UART と同じものが BLE に出ています。それを UART っぽくデータを受信するには、スマホ側で、 Nordic UART に対応したソフトをインストールします。本来であれば、 Nordic 謹製の 「nRF UART」 が望ましいのですが・・・
https://qiita.com/nanbuwks/items/7c448837eedf439b8ee9
Android 10に対応できていないらしく、デバイスのスキャンができませんでした。これでなくても Nordic UART に対応したアプリは多くあるのですが、以下の記事で使用しているアプリを代わりに使ってみました。
「【micro:bit 2019】micro:bit で BLE + UART による文字列の送受信(29記事目)」
https://qiita.com/youtoy/items/46502b9bd17fad16d427
Serial Bluetooth Terminal をインストールしてみました。
上記の画面で「Devices」を選び、「Bluetooth LE」を選び、画面上の「SCAN」を押します。
受信できました。
この、変数にセンサーの値を入れるようにしておくと、外部センサーなどの値を送信できることになります。
参考資料
「gatttool を使って NUS( Nordic UART Service ) とつなぐ実験」
https://qiita.com/nanbuwks/items/7c448837eedf439b8ee9