BBC micro:bit を Scratch 2 + Bluetooth で使う（調査編）

# BBC micro:bit を Scratch 2 (offline) + bluetooth で使う

＊Scratch (スクラッチ) 2 から一般のBluetooth（4.0以上対応）アダプタで micro:bit (マイクロビット) を使うための拡張ブロック<調査編>です。Scratch 3 まで待つという選択肢もあるのですが、待てないので作ることにしました。（Scratch 3 における micro:bit のサポート詳細が発表されましたが、それによると入出力ピンがサポートがまだのようです。）まずは使ってみようという場合は、[Scratch2用ヘルパー「スマイビー (Smi:be, s2microbit-ble)」](http://memakura.github.io/s2microbit-ble)をご確認ください。[<まとめ編>](https://qiita.com/memakura/items/1acab55a37651e9081b4)では、この調査編を受けた実装の詳細を解説しています。

まず、ScratchX（オンライン）+ Bluetooth や、Scratch 2（オフライン）+ シリアル通信で micro:bit を使う方法をまとめておきます。

1. ScratchX（オンライン） + Mac
    - ScratchX では Mac から使うための拡張が[ScratchXのページ](https://llk.github.io/microbit-extension/)で紹介されています。
2. ScratchX（オンライン） + Windows, Linux
    - Windows や Linux から使う場合には、[jaafreitas による拡張](https://github.com/jaafreitas/scratch-microbit-extension)が使えます。
        - ScratchX 側でブロック拡張用 js を読み込み、一方でヘルパーアプリケーション を別途ローカルで Node にて立ち上げ、両者が [Socket.io](https://socket.io/) で（PC ローカル内で）やり取りします。
        - Windows 10 + Chrome, Ubuntu 16.04 + Firefox and Raspberry PI 3 Raspbian + Chromium で動くそうです。
        - [Noble (Node.js Bluetooth LE)](https://github.com/sandeepmistry/noble) を利用した [node-bbc-microbit API](https://github.com/sandeepmistry/node-bbc-microbit) を使っています。
        -  Windows では [Noble for Windows 10](https://github.com/jasongin/noble-uwp) を使います。ということで、Windows 10 build 10.0.15063 以上が必要です。
3. Scratch 2 (オフライン) + Windows, Mac, Linux
    - [s2bot](http://www.picaxe.com/BBC-microbit/)を使う方法がありますが、BLED112 というBluetoothドングルが必要とのことです。 
    - 特定のドングルなしに、PC内臓、もしくはその辺にある汎用Bluetoothモジュールをそのまま使いたいところ。**今回の記事はここがターゲットです。**



# Scratch 2 (オフライン) + bluetooth 方針

## 方針1（今回断念）

Bluetooth を使わないのであれば、MrYsLab (Alan Yorinks) による [s2m](https://github.com/MrYsLab/s2m) を利用できます。（脱線しますが、この Alan Yorinks は [s2a_fm](https://github.com/MrYsLab/s2a_fm) や [s2aio](https://github.com/MrYsLab/s2aio) など、Arduino を Scratch 2 offline から使うための拡張も作られていて、これまでもかなり参考にさせてもらっています。）s2m では、micro:bit と PC 間は USB でシリアル通信 (UART) です。[mu エディタ](https://codewith.mu/)を使って Python コードを micro:bit へ書き込みます。つまり [microbit-MicroPython](https://microbit-micropython.readthedocs.io/en/latest/) を使っています。

[Micro:bit は Bluetooth の UART が使える](https://makecode.microbit.org/reference/bluetooth/start-uart-service)ので、s2m を bluetooth 対応にするには、Windows であれば仮想ポートを作ればよいのかと思いました。それに、[MicroPython では RAM の問題で Bluetooth UART は対応していない](https://microbit-micropython.readthedocs.io/en/latest/ble.html)ようなので、MicroPython ではなく JavaScript 側で micro:bit 用のコードを書けばよいのかもしれません。

でも Windows 10 の仮想ポートからしてどうにもうまく作れません・・・今回はこの方針は断念しました。環境によってはできるのかもしれません（BLED112などがいる?）。


## 方針2（今回採用）

始めに紹介した ScratchX 用の [jaafreitas による拡張](https://github.com/jaafreitas/scratch-microbit-extension)を改造する方向で考えてみます。s2m も参考にできそうです。

### 設計方針

1. 簡易HTTPサーバ
    - Scratch 2 オフラインの HTTP拡張はGETポーリングなので WebSocket は使えないはず。
    - Socket.io は使わず、代わりに Express を使うことにします。
2. ブロックの設計
    - Scratch 2 オフラインの HTTP拡張ではハットブロック（「・・が押されたとき」のようなブロック）が使えないはず。
    - ハットブロックの代わりにブール型のレポーターブロック（角がダイヤ型のブロック）を使います。
    - できるだけ s2m 互換とし、s2m のブロックで作成したプロジェクトをそのまま使えるようにします。
3. パッケージ化
    - 使う側のPCに Node.js や Python 2.7 や Visual C++ の環境も必要ですが、インストールしておくのは面倒です。
    - 上記の環境がインストールされていない PC でも使えるように、ヘルパーアプリケーションを実行形式にしておきます。(それでも VC++ の再頒布可能パッケージはインストール必要だと思います。）
    - zeit/pkg も試してみましたがどうも noble-uwp の場合はネイティブモジュールをうまく見つけてくれないようです（他のネイティブモジュールは見つかりますが・・）。というわけで、今回は [Electron](https://electronjs.org/) にします。以下の記事も参考にします。
        - [Electronでアプリケーションを作ってみよう](https://qiita.com/Quramy/items/a4be32769366cfe55778)
        - [Electronの環境構築（for Windows）](https://qiita.com/TigRig/items/64d55b5fc5483b01c3b5)

### 解決方法

- 1 の Express を利用した拡張ブロックは[こちらの記事](https://qiita.com/memakura/items/ca1fff4d7dd33164bb7e)の方法でできそうです。
- 2 については、ボタンが押されたときの判定の書き方が ScratchX とは少し変わります。
    - つまり Scratch 側で、「もし<ボタンAが押されている>ならば」をループで回してポーリングし、「押されたとき」を判定する必要が出てきます。
    - 一方で、ScratchX の micro:bit 拡張で使われているハットブロックは JavaScript 内部でポーリングしてくれているので、Scratch側ではポーリングを書かずにいきなり「ボタンAが押されたとき」から処理を書くことができます。
    - まあ、でもハットブロックではなく単に true/false を返すブール値のレポーターブロックの方が、押しっぱなしの時は処理を変えるなどもできて使い勝手がいいかもしれず、良しとします。（実際にデモプログラムで使ってみます。）
- 3 の electron 環境のパッケージ化は [electron-builder](https://www.electron.build/) で解決できそうです。

以上の方針2に従って、ひとまず Windows で試してみます。おそらくわずかな変更で他のOSでも動くと思われます。

ひとまずはゲームコントローラとして使えることを考え、ボタン、温度、加速度センサ、磁気センサとテキストスクロールあたりから作り始めてみます。各LEDの制御はピン周りは徐々に加えていきます。

具体的な実装は、[こちらの<まとめ編>](https://qiita.com/memakura/items/1acab55a37651e9081b4)にまとめます。



# ひとまず作ってみる

## リポジトリ

https://memakura.github.io/s2microbit-ble/ 
https://github.com/memakura/s2microbit-ble


上記のリポジトリを（たまに）更新していくことにします。ビルド方法はちょっと厄介（node_modulesの中をいじる）なところがあるので、このあたりは[ビルド編1](https://qiita.com/memakura/items/11a0426f9060da1ded7e)、[ビルド編2](https://qiita.com/memakura/items/dc5cf2ff39d24ceb53ff)で説明しています。ひとまず Release にビルドしたものをおいておきます。

いろいろ制限や既知の不具合もあります。

## 制限
- Windows 10 はある程度アップデートされている必要があります。
- ~~Mac OS でもビルドできると思いますが未確認です。~~
    - MacOSでもビルドできました。

## 不具合

- ~~複数台の microbit がオンになっていると、うまく接続できないかもしれません。~~
複数台見つかった場合は選べるようにしました。
- テスト不足なので途中で止まることがあるかもしれません。


つづく：[ビルド編1](https://qiita.com/memakura/items/11a0426f9060da1ded7e)