micro:bit で標準的な BLE 動作するテストプログラム

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 の動作を確認

https://makecode.microbit.org/#

にアクセスします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/bab20989-a5fb-5945-4181-ec0dc9983929.png)

「新しいプロジェクト」で「TEST1」などの名前を付けてプログラムを以下のように作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/40fbd289-af9e-096a-8d2e-8440051c0847.png)

左下のアイコンからダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/50fde6d3-c301-e09c-9f08-f28a143b01e1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/4ba15cc0-1a20-06ac-a10e-ee72807f0aa0.png)

「Hello!」と表示されます。

# BLEプログラムを作る

「硬度なブロック」-「拡張機能」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/aa2ca859-91b0-c4a9-4e2d-c57033890609.png)

「bluetooth」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/858c7331-fd15-06ec-8fdc-7807a8a52fbe.png)


「一部の拡張機能を削除してbluetoothを追加する」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d76b29a7-c4fe-69de-1663-d13779f9c1ba.png)


Bluetoothブロックが増えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/601796bf-40f9-3dd7-a364-882fd5f99890.png)

micro:bit は接続のための方法を3種類備えています。

- ペアリングなし接続
- パスキーペアリング経由の接続
- Just Worksペアリング経由の接続

https://lancaster-university.github.io/microbit-docs/ble/profile/#pairing

ON時にアドバタイズを行ったうえで、ペアリング動作無し接続で試すために、
右上の歯車アイコン→「プロジェクトの設定」から、設定を変更してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/0d9569e9-9173-c13e-8424-42aaa52312e9.png)

以下のように配置します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/2e09d7ff-24d5-70e6-38a4-2deeb43c362c.png)

「Bluetooth 温度計サービス」を追加するだけで、温度の送信に対応した機能が追加されます。

# Android 版の nRF Connect を使用する

「nrf connect 」で検索、インストールします。


![Screenshot_20210501-165641.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/a542f60c-6c60-810e-4c51-c4b056bf636e.png)


実行します。


![Screenshot_20210501-165618.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/fa13ba58-c80a-f7c3-2ea3-24d74cb33494.png)

BBC micro bit を選択します。

![Screenshot_20210501-170559.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/b7ae78b8-0049-366a-5a02-8656805cbac4.png)

micro:bit Temperature Service の下にいくつかキャラクタリスティックが出ています。micro:bit Temperature の横にある連続受信のアイコン(下矢印が3つ重なっているヤツ)を選択します



![Screenshot_20210501-170735.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/054995cf-3e58-bfda-fa5b-eb382e9ef5e8.png)



温度が表示されるようになります。

![Screenshot_20210501-170753.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/42b4ce52-832d-743b-278c-71ecded57c1e.png)


この温度表示機能は
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 サービスがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/06dcb4ba-6cdf-8f39-210d-1073757b98d1.png)

これを使って、任意の値を送ることができます。

# UART でテスト

Bluetooth UART サービスに先立ち、一般的な UART通信をつかって、USBで接続しているパソコンに任意の値を送ってみます。

先程のプログラムを以下に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/2acaa5a3-fc8b-a7d1-b1e9-3eb48e7c8bc3.png)


PC側でシリアル通信ソフトを起動して、数字が来ていることを確認してみます。ここでは Arduino 開発環境のシリアルモニターで確認してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/dbaa7766-903f-299b-a2ae-6b6bd757dc81.png)

出力が確認できたら、これと同じものを Bluetooth で取得するようにしてみましょう。

# Bluetooth UART でデータを受けてみる

以下のようにプログラムを書き換えます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/af294e0c-c047-e1c9-df0b-37a416e4c29b.png)

nRF Connect で見てみると、6E400001-B5A3-F393-E0A9-E50E24DCCA9E としてサービスUUIDが見えることがわかります。

![Screenshot_20210502-182825.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/562744c5-c7cd-c0eb-757b-d474492ed3a3.png)

RX Characteritic を開けるとデータが更新されていきます。

![Screenshot_20210502-190847.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/167e83f2-6cdf-7173-6a2a-d82093894f9f.png)

さて、サービス 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
![Screenshot_20210502-182939.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/59360f28-503f-48f9-12c6-68363369da08.png)

![Screenshot_20210502-183002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/af022392-c891-2fff-0d03-2d35b5d8acc5.png)

Android 10に対応できていないらしく、デバイスのスキャンができませんでした。これでなくても Nordic UART に対応したアプリは多くあるのですが、以下の記事で使用しているアプリを代わりに使ってみました。

「【micro:bit 2019】micro:bit で BLE ＋ UART による文字列の送受信（29記事目）」
https://qiita.com/youtoy/items/46502b9bd17fad16d427

![Screenshot_20210502-183525.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d78d7b89-4d48-d816-2597-480dde78df96.png)
Serial Bluetooth Terminal をインストールしてみました。
![Screenshot_20210502-184801.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/60f0d64f-e84a-edc2-63f8-fa25b7937a9c.png)
上記の画面で「Devices」を選び、「Bluetooth LE」を選び、画面上の「SCAN」を押します。
![Screenshot_20210502-184112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/914f6ae9-814d-f228-1208-d985bee15518.png)

BBC micro:bit を選びます
![Screenshot_20210502-184808.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/60d5dbb9-6a69-5957-308e-086570c20c4c.png)

![Screenshot_20210502-184818.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/de75a82a-edda-5b35-3103-972237c6b23d.png)

受信できました。

この、変数にセンサーの値を入れるようにしておくと、外部センサーなどの値を送信できることになります。


# 参考資料

「gatttool を使って NUS( Nordic UART Service ) とつなぐ実験」
https://qiita.com/nanbuwks/items/7c448837eedf439b8ee9