Node.js
bluetooth
Scratch
Electron
microbit

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)」をご確認ください。<まとめ編>では、この調査編を受けた実装の詳細を解説しています。

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

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

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

方針1(今回断念)

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

Micro:bit は Bluetooth の UART が使えるので、s2m を bluetooth 対応にするには、Windows であれば仮想ポートを作ればよいのかと思いました。それに、MicroPython では RAM の問題で Bluetooth UART は対応していないようなので、MicroPython ではなく JavaScript 側で micro:bit 用のコードを書けばよいのかもしれません。

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

方針2(今回採用)

始めに紹介した ScratchX 用の jaafreitas による拡張を改造する方向で考えてみます。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 にします。以下の記事も参考にします。

解決方法

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

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

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

具体的な実装は、こちらの<まとめ編>にまとめます。

ひとまず作ってみる

リポジトリ

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

上記のリポジトリを(たまに)更新していくことにします。ビルド方法はちょっと厄介(node_modulesの中をいじる)なところがあるので、このあたりはビルド編1ビルド編2で説明しています。ひとまず Release にビルドしたものをおいておきます。

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

制限

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

不具合

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

つづく:ビルド編1