【micro:bit 2019】#obniz と micro:bit で obniz-noble を使った BLE通信 （26記事目）

この記事は 12/27 に執筆して、後から 「[micro:bit Advent Calendar 2019 - Qiita](https://qiita.com/advent-calendar/2019/microbit)」の 23日目 へと登録した記事です。

今年のアドベントカレンダー用に書いた記事の 26記事目で、micro:bit Advent Calendar に登録した記事としては 7記事目になります。

## はじめに

今年の 22日目の記事として、以下の記事を書いていました。

▼記事1） 【IoTLT 2019】新しい obniz で obniz-noble を試す（2019/12/22） - Qiita
　https://qiita.com/youtoy/items/1a2e92ae7a83df7e9a82

この記事で、obniz と toio を使ってますが、当初は toio ではなく micro:bit を使っていました。
しかし、PC上で動作させた noble との間でうまく通信させられず、toio に差し替えて試行錯誤して、最終的にうまくいきました。ただ、後から振り返ると「micro:bit も obniz-noble を使えば問題なく通信できたのでは？」という考えが頭をよぎりました。

そこで当初、試そうと思っていた内容を obniz-noble であらためてやってみたのが今回の内容です。
用いたプログラムは、以下の記事のものをほとんどそのまま使わせていただいてます。

▼記事2） micro:bitのBLEのA・BボタンイベントをNode.js nobleで取得してみるメモ – 1ft-seabass.jp.MEMO
　https://www.1ft-seabass.jp/memo/2018/02/19/microbit-ble-a-b-button-catch-nodejs-noble/

## micro:bit側の準備
まず、MakeCode のプロジェクトの設定で、以下の手順での設定を行い、ペアリングが不要となるようにします。

<img width="500" alt="Microsoft_MakeCode_for_micro_bit.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/da5b4313-15d8-c3a7-69f1-85749aff2f9b.jpeg">

<img width="478" alt="Microsoft_MakeCode_for_micro_bit2.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b83707c9-c5f3-57b0-9cc8-44d03fa0aab2.jpeg">

あとは、Bluetooth を使うための拡張機能を読み込み、以下のプログラムを作って micro:bit に書き込みます。
<img width="437" alt="Microsoft_MakeCode_for_micro_bit3.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/221bfcc4-ea4f-3878-be6b-ecea9cb03eca.jpeg">
これで、micro:bit側の準備は完了です。

## obniz側の準備

obniz-noble を使うための前準備については、[上記の記事1）](https://qiita.com/youtoy/items/1a2e92ae7a83df7e9a82)をご覧ください。

準備が整ったら、[上記の記事2）](https://www.1ft-seabass.jp/memo/2018/02/19/microbit-ble-a-b-button-catch-nodejs-noble/)のプログラムを少しだけ書きかえたものを準備します。
変更した部分は、以下のとおりです。

【変更箇所 1】
noble を使うよう指定していた部分を、obniz-noble を使うよう指定し、obniz ID を指定する行を追加しました（```"OBNIZ_ID_HERE"```の部分は、ご自身の obniz の ID を設定してください）。

```JavaScript
var noble = require('noble');
```

　　　　↓

```JavaScript
var obnizNoble = require('obniz-noble')
var noble = obnizNoble("OBNIZ_ID_HERE")
```

【変更箇所 2】
以下のボタンA が押されたときのログ表示の部分と、以下と同じ処理でボタンB に関連したログを表示させる部分とを、動画で動作の様子を見たときに分かりやすくなるようにテキストを書きかえました。具体的には（"ボタンAが押されたよ！" などという文言を表示するようにしました）。

```JavaScript
console.log("BUTTON_A_CHARACTERISTIC");
console.log(data);
```

## 試した結果
無事に、micro:bit の 2つのボタンが押されたときの状態を、BLE通信経由で obniz で取得できました。
ちなみに、このプログラムだと「ボタンを押した際」と「ボタンを押した後に話した際」でイベントが発生するようです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/obniz?src=hash&amp;ref_src=twsrc%5Etfw">#obniz</a> と micro:bit の BLE通信！<a href="https://twitter.com/1ft_seabass?ref_src=twsrc%5Etfw">@1ft_seabass</a> さんのソースコードをほぼそのままに、obniz-noble を使う部分とログ表示を少し改変して試しました。 <a href="https://t.co/MvIpfqpKJY">pic.twitter.com/MvIpfqpKJY</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1210235108323540992?ref_src=twsrc%5Etfw">December 26, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## おわりに

思ったとおり、obniz-noble を使うことで、簡単に obniz と micro:bit の BLE通信を試せました！
（PC で noble を使った場合に、micro:bit の BLE通信ができない理由は不明のままですが・・・）