はじめに
Node-RED MCUでBluetoothが使えるようになったので、まずはシンプルに試してみた内容を紹介します。Node-RED MCUの情報はこちら:
Bluetoothノードのインストール
フローエディタ上ではBluetoothを扱うノードとして下記を使用しますので、パレットの管理からインストールしておきます。
・node-red-contrib-noble-bluetooth
このノードでフローを作成してNode-RED MCUでBuildすることによって、MCUで動作するコードに変換されます。
ターゲット
今回試すのは、教育用のマイコンデバイスとして普及しているBBC micro:bitと接続して、micro:bitに搭載された温度センサーの値をNode-RED MCUで取得してみたいと思います。他にもいろいろな応用ができると思いますので試してみてください。
おもな手順
- micro:bit側には、Microsoft MakeCode for microbitを使用してBluetoothを有効化して、temperatureサービスを開始するように設定します。その際に、Connect/Disconnectの際にLED表示とサウンド再生を行うようにもします。
- Bluetoothの情報を取得するユーティリティを使用して、micro:bitのボード固有の識別子とTemperature ServiceのUUIDを調べます。
私の場合はiPhoneアプリの”nRF Connect”が使えました。 - Node-REDとNode-RED MCUでxiao ESP32S3側のフローを作成して動かします。
1. micro:bit側でTemperature Serviceを開始する
Microsoft MakeCode for microbitを使ってmicro:bit側の設定を行います。micro:bitの場合、初期状態ではBluetoothが有効になっておらず、代わりに”Radio”モジュールが有効になっています。両者は同時に利用することはできず、どちらかの選択になっています。Radioのほうは子供たちのプログラミングには使いやすい面もありますが、今回はこれをBluetoothに入れ替えて使います。
・パレットにRadioがある場合、Extensionsを押してBluetoothエクステンションをインストールします。Radioを削除してBluetoothをインストールするか確認ダイアログが表示されます。エクステンションが入れ替わるとパレットにBluetoothが表示されます。
・micro:bit側のブロックプログラム
Temperature サービスを開始するため、on startにBluetooth内のtemperature serviceブロックを配置します。また、connectとdisconnectが分かりやすいように、Bluetooth内のon bluetooth connectedブロックと、on bluetooth disconnectブロックに適当なアイコン表示とサウンドを割り当てます。
これでmicro:bit側の準備はOKですので、[Download]ボタンを押してボードに書き込んでおきます。
2. micro:bitのボード固有の識別子とTemperature ServiceのUUIDを調べる
micro:bitでは各ボードを識別するための識別子が付けられており、複数のmicro:bitが動作している場所でも特定のボードにアクセスすることができます。また、先ほど有効化したTemperature Serviceに接続するためのUUIDを後述のMCU側のフローに設定する必要があるため、これらを調べる必要があります。
・nRF Connect(Nordic Semiconductor社)を使用する
今回はiPhone版をインストールして調べてみました。

-Scannar画面を開き、Nameフィルターに「BBC microbit」をセットすると、先ほど準備したmicro:bitが表示されているはずです。「BBC microbit」に続く5文字の識別子がここで確認できるので控えておきます。(下記の例では[tevev]がそれにあたります。)
-リストのデバイスをクリックすると開きますが、connectしていないので情報は取得できていません。
-[Connect]ボタンを押して接続すると、Attribute Tableの内容を確認できるようになります。ここで目的のサービスを探します。
(注)もし複数のmicro:bitがあるとリストには全部表示されるため、
Connectしてmicro:bit側の反応を見ることで識別できます。
-Attribute Table をスクロールしてTemperature Serviceの内容を見つけます。ここのアイテム:micro:bit TemperatureのUUIDを控えておきます。このUUIDはあとでノードにセットします。
これでフローに設定する情報を取得できました。
3.Node-RED MCUのフローを作成する
ようやくフローの作成です。今回はシンプルに温度データを確認する下記のようなフローを作ります。
・フローの構成
下段のchangeノード「set flow.identifier」では、接続するmicro:bitの識別子をflowコンテキストに格納し、「BLE scanner」ノードに続くファンクションノード
「search」で使用しています。識別子を設定しやすくするためにこの構成を取りましたが、「search」内で直接設定しても構いません。
フロー起動時にインジェクトノード「Start Scan」からmsgが出て「BLE scanner」をトリガします。micro:bitではadvertiseしているサービスはないのでServicesは空欄とし、continuous scanningのチェックボックスだけONにしています。
これに続くファンクションノード「search」でターゲットのmicrobitが存在するか確認して、次の「BLE device」ノードに送ります。
const targetId = flow.get("identifier");
const name = (msg.name || "").toString();
if (!name.includes("BBC micro:bit")) {
return null;
}
if (!name.includes(targetId)) {
return null;
}
node.status({ fill: "green", shape: "dot", text: `Found: ${name}` });
msg = {
topic: "connect",
peripheral: msg.peripheral,
name: name
};
return msg;
「BLE device」で接続を行い、接続が確認できたらmsgを次のノードに送ります。
次に、「BLE in」ノードでは先ほど調べたmicro:bitのtemperatureサービスをサブスクライブする設定を行います。CharacteristicのフィールドにUUIDをセットします。
・ここで設定するUUIDは、PC上のNode-REDではハイフンなしで動作しますが
Node-RED MCUで使用する場合はハイフン「あり」でセットします。
基本の構成は以上ですが、Node-RED MCUでの「BLE in」ノードの動作はオリジナルとは異なり、出力が「ArrayBuffer」になっています。

そのため、「BLE in」ノードの後段にファンクションノードを設けて、このArrayBufferをデコードします。
let buffer = new Uint8Array(msg.payload);
msg.payload = {
"temperature" : buffer[0]
}
return msg;
これでmsg.payload.temperatureに温度データが取得できました。
接続が成功すると、各ノードにステータスが表示されます。
さいごに
今回試したのは温度データを取得するシンプルなフローでしたが、MCU上のメモリの制約が厳しいのかxiao esp32c3では動作せず、xiao esp32s3を使用しました。
ハードウェア上の制約が多いMCU上ではなかなか厳しい面があるのを実感しました。










