Mac上の Node-RED での BLE利用について調べてみて toio との組み合わせを少し試す（2台の toio のモーター制御を行う）

記事の内容は表題の通りです。
いろいろ前置きを書いてある部分があるので、試した内容をすぐに読みたいという方は、[記事の中の「node-red-contrib-generic-ble を試す」の部分](https://qiita.com/youtoy/items/91965e8cc8f12b7ee528#node-red-contrib-generic-ble-%E3%82%92%E8%A9%A6%E3%81%99)からご覧ください。

## はじめに
これまで、自分がやってきた BLE関連の内容だと Web Bluetooth API や noble（＋ それを利用した別ライブラリ）を利用する形の、JavaScriptベースの内容でした。例えば、以下の記事がそれに該当します。

- [SwitchBot温湿度計のデータを Web Bluetooth API で取得する【完結編】 - Qiita](https://qiita.com/youtoy/items/8e3cca2172e2c4806846)
- [toio を音で制御してみた（Audio用の Teachable Machine でベルやタンバリンの音を機械学習） - Qiita](https://qiita.com/youtoy/items/37f70bb4ce630e6cbd92)
- [Web Bluetooth API を使い micro:bit とブラウザの間で BLE通信【 #GWアドベントカレンダー 2021/4/30 】 - Qiita](https://qiita.com/youtoy/items/c98c0996458a21fc1e67)
- [Web Bluetooth API で toio を 6台同時に制御する - Qiita](https://qiita.com/youtoy/items/2fae3f4365788810215d)
- [あらためて noble でガジェットを扱う話に着手する： toio と micro:bit を複数混在させてスキャン、toio の複数制御（6台分） - Qiita](https://qiita.com/youtoy/items/15a743d692f348327ff9)

そして、Node-RED 関連の話もいくつか過去に記事を書いたりしたのですが、これらを組み合わせた話 ＝ 「Node-RED で BLE を扱う話」は気になりつつも手をつけたことがない部分でした。
そこで、今までの記事を書くときにも利用してきた Mac＋Node-RED の環境で BLE を使ってみる話が今回の内容です。

## Qiita の記事・Web上の記事を調べてみる
### Qiita の記事
とりあえず先行事例を見てみようかと、Node-RED で BLE を扱った話について新しめな記事を Qiita 上で探してみました。
具体的には、検索をする際のキーワードで「Node-RED BLE」というシンプルなものを設定し、検索結果に関して時間順に並べ直しました。そして、直近のものから見ていきました。

そうすると、例えば以下のような記事がありました。

- [node-red-contrib-generic-ble（notifyでデータ読み込みを行う） - Qiita](https://qiita.com/takanorimutoh/items/9d37bfbba7c5918b3229)
- [EnOcean BLE環境センサー(STM550B)とスイッチ(PTM215B)を試してみた - Qiita](https://qiita.com/kitazaki/items/968cef7fc5add591d461)
- [ビーコンのManufactureDataを取得できるノードを作成しました。 - Qiita](https://qiita.com/yossihard/items/455ec04881a746e80476)
- [自宅の環境センサーを「EnOcean STM 550B」に入れ替えた話 - Qiita](https://qiita.com/Y-Shikase/items/8ae5e5c492b022348b53)

### Web上の記事
また、Web上でも記事を探してみました。
キーワードは上記と同じ「Node-RED BLE」で、検索結果を過去 2年間にしぼって見ていきました。

出てきた記事として、例えば以下の記事がありました。

- [チュートリアル：ラズパイにNode-REDを入れてEnOcean(BLE)の環境センサーを接続する2/2｜デジタルライト(Digital-light.jp)](https://digital-light.jp/2020/08/17/tutorial-install-node-red-to-raspberry-pi-and-make-flow-with-enocean-sensor-2/)
- [Raspberry PiでBLEビーコンのデータをNode-REDを使って受信する | Tech Note Meeting](https://tech-note-meeting.com/2021/01/17/post-531/)
- [Make: Japan | ［蓼科の工房から］micro:bit＋Raspberry Piで隣の小屋の室温をスマートスピーカーで聞けるようにする](https://makezine.jp/blog/2019/09/microbit_rasp-pi_alexa.html)

## 調査した記事の中に出てきた主なノード
先行事例を見ていくと、主に以下のノードが利用されているようでした。
　●node-red-contrib-generic-ble (node) - Node-RED
　　https://flows.nodered.org/node/node-red-contrib-generic-ble
　●yossihard/node-red-contrib-blebeacon-scanner: Repository for BLE Beacon scanner node of Node-RED
　　https://github.com/yossihard/node-red-contrib-blebeacon-scanner

今回は、この 2つのうち「node-red-contrib-generic-ble」のほうを試してみようと思います。

## node-red-contrib-generic-ble を試す
### node-red-contrib-generic-ble を使ってできること
セットアップをして利用してみる前に、このノードを使ってできることに何があるか確認するために[公式ページ](https://flows.nodered.org/node/node-red-contrib-generic-ble)を見てみます。
公式ページの以下の部分に書かれているとおり、BLEスキャン・デバイスとの接続・データの読み書き・通知の受信といった、基本的な処理が一通り行えそうです。
![BLE用のノードでできること.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/f1bd83c7-61fd-04e2-e457-c61f74facd13.jpeg)

### ノードを追加する
それでは node-red-contrib-generic-ble を追加してみます。

Node-RED を立ち上げて、右上のメニューの「パレットの追加」から「ノードの追加」へと進み、「node-red-contrib-generic-ble」を追加します。
ノードの追加を完了させると、以下のノードが使えるようになっていました。
![BLE用のノード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/9eea174b-0643-e61c-3cde-85d704866728.jpeg)

### toio を BLE経由で扱ってみる（データの書き込み）
#### toio の BLE関連の仕様
それでは、実際に BLE経由でデバイスへの書き込みを試してみます。

利用するデバイスは、過去に何度も利用したことがあるのと、電源を入れれば BLE での情報の読み書き等ができる状態になるのが試すのに都合が良いので、[toio](https://toio.io/) を使います。

toio を公式の開発環境・ライブラリを用いずに BLE経由で利用する場合は、以下の公式の仕様を見て利用する流れになります。
　●通信概要 · toio™コア キューブ 技術仕様
　　https://toio.github.io/toio-spec/docs/ble_communication_overview.html
今回は、その中の「[時間指定付きモーター制御](https://toio.github.io/toio-spec/docs/ble_motor#%E6%99%82%E9%96%93%E6%8C%87%E5%AE%9A%E4%BB%98%E3%81%8D%E3%83%A2%E3%83%BC%E3%82%BF%E3%83%BC%E5%88%B6%E5%BE%A1)」を利用してみます。

#### Node-RED で toio に接続する下準備
[公式ページ](https://flows.nodered.org/node/node-red-contrib-generic-ble)に書かれた使い方の手順を見て、toio との接続等を行っていきます。

使い方の手順の説明というのは、以下の「How to use」と書かれた項目の内容です。
![公式の使い方手順.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/c483db6e-6585-cc8f-c798-80c7c5279990.jpeg)
説明は英語で書かれてますが、画像キャプチャ付でやり方が掲載されているので、画像を見るだけでも進めていけるのではないかと思います。

まずは toio との接続を進めます。そのために、公式の説明の「How to configure a new BLE peripheral device」の部分を順番に進めていきます。
node-red-contrib-generic-ble のノードは 2つありますが、以下では「Generic BLE out」を使います。なお自分の環境の場合、接続のための手順を進める途中の、スキャン後に情報が出てくる画面は以下のようになりました。
![スキャン結果.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/f5f265ad-b571-ab3f-60aa-602a9714b35e.jpeg)

なお、公式のサンプルもあるらしく、右上のメニューから「読み込み ＞ サンプル ＞ node-red-contrib-generic-ble」とたどっていくとサンプルをインポートできるようです。
![公式サンプルについての説明.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/bf8c57e7-90d6-158a-9e9f-59bf66ece271.jpeg)

#### Node-RED で toio にデータを書き込む
それでは、BLE経由での書き込みを行っていきます。

公式ページの「Characteristics Value Write」の部分に、書き込むデータを指定する方法が書かれていました。具体的には以下の部分です。
![書き込みを行うためのJSON.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/71ead3ad-e76c-4b90-ce62-275184916377.jpeg)

上記の説明を見ると、ハイフンなしの UUID と `0x` をつけない 16進数の値を JSON として渡してやれば良いようです。

過去に toio へのデータ書き込みを BLE経由で行った話がいくつかあるのですが、その中の以下の記事の内容を利用して進めてみます。
　●Web Bluetooth API で toio を 6台同時に制御する - Qiita
　　https://qiita.com/youtoy/items/2fae3f4365788810215d

この時は、JavaScript で UUID と送信するバイナリデータを以下のように指定していました。
ちなみに書き込んでいるバイナリは、toio の左右のモーターそれぞれを前・後ろ方向の向きで一定時間だけ動かすようなもので、その場で toio が回転する動きをするものです。

```javascript
      const MOTOR_CHARACTERISTIC_UUID = "10b20102-5b3b-4571-9508-cf3efcd7bbae";
      const motorBuf = new Uint8Array([0x02, 0x01, 0x01, 0x32, 0x02, 0x02, 0x32, 0x78]);
```

上記を元にした、以下の JSON を利用して試してみます。

```json
{
    "10b201025b3b45719508cf3efcd7bbae": "0201013202023278"
}
```

上記の JSON をインジェクトノードにセットして、BLE用のノードにつなげます。
複数の toio とつなげられるかも試そうかと、最終的には BLE用のノードを 2つ用意して 2台の toio に紐付けてみました。その 2つのノードに、上記の JSON を共通で送る形にしたのが以下になります。
![Node-REDのフロー（2台分）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/aa54ace8-e8c3-75e9-d1d9-ef189d20bd65.jpeg)

実際に動作させた時の様子は以下のとおりです。
無事に、Node-RED で BLE経由での書き込みが行えました！

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Node-RED の BLE を扱えるノード（node-red-contrib-generic-ble）を利用して、 <a href="https://twitter.com/hashtag/nodered?src=hash&amp;ref_src=twsrc%5Etfw">#nodered</a> から <a href="https://twitter.com/hashtag/toio?src=hash&amp;ref_src=twsrc%5Etfw">#toio</a> を動かしてみた！<a href="https://twitter.com/hashtag/noderedjp?src=hash&amp;ref_src=twsrc%5Etfw">#noderedjp</a> <a href="https://t.co/vmUsJt3oRk">pic.twitter.com/vmUsJt3oRk</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1396055416254046211?ref_src=twsrc%5Etfw">May 22, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 【追記】 Read と Notify を試しました
この記事の内容を試したあと、toio を使った Read と Notify も試して記事にしました。
　●Mac上の Node-RED で BLE を利用して toio の制御（Read、Notify で値を受け取る） - Qiita
　　https://qiita.com/youtoy/items/3db10e1042a5f2af27a0

## 【追記】 接続と切断の処理について
node-red-contrib-generic-ble を使った際の接続・切断処理に関する情報を、上記の Read と Notify の話を書いた記事の「[接続/切断処理](https://qiita.com/youtoy/items/3db10e1042a5f2af27a0#%E6%8E%A5%E7%B6%9A%E5%88%87%E6%96%AD%E5%87%A6%E7%90%86)」という部分で書きました。