2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

micro:bit を Scratch 2 + Bluetooth で使う(ビルド編1:noble-uwp)

Last updated at Posted at 2018-04-05

micro:bit を Scratch 2 + Bluetooth で使う(ビルド編1)

以下のような話題についてまとめます。

  1. ネイティブアドオンを使う Electron アプリケーションのビルドと配布可能なパッケージ化の方法
  2. Scratch2(オフライン版)から Bluetooth Low Energy 経由で BBC micro:bit を使うためのヘルパーアプリケーション作成方法

前半は node-gyp の環境準備とネイティブアドオンのビルドの話、後半は electron-builder を用いたビルドと配布用パッケージの作り方です。長いので2つに分け、ここでは前半をビルド編1としてまとめておきます。後半のビルド編2はこちら

動機

Scratch 2 のヘルパーアプリケーションを https://github.com/memakura/s2microbit-ble で公開していますが、このコンソール版のビルド方法が前半(ビルド編1)、Electron版のビルド・パッケージ化の方法が後半(ビルド編2)に対応します。Scratch 2 で子供にビジュアルプログラミングをしてもらうときに、Node や Python などの環境を準備してもらうのは大変なので、ビルド編2のまとめにあるような実行形式で配布したいのです。Github 上の s2microbit-ble(-console) を clone して使うだけなら、前半、後半いずれも「まとめ: ... 」と書かれたセクションを確認してください。

あと、なぜ Node + Electron でパッケージ化することにしたかは、micro:bit を Scratch 2 + Bluetooth で使う(調査編) にまとめています。また、s2microbit-ble の中身の話はまとめ編でまとめる予定です。

noble-uwp モジュールのインストール

noble-uwp と bbc-microbit

Node で Bluetooth を扱うには noble というモジュールがよく使われます。Windows 10 でも、以前は特定のBluetooth USBドングルやドライバを用意する必要がありましたが、2017年春ごろのバージョン1703・ビルド15063(いわゆるCreators Update)からは、多くのUSBもしくはPC内臓のBluetoothアダプタでも動くようになりました。ただし、これには noble を入れた後にその一部を noble-uwp (Windows 10 UWP binding) にアップデートする必要があります。なお、UWP は異種デバイスの動作プラットフォームを共通化するために Windows 10 から導入されたもので、 Universal Windows Platform の略です。

Bluetooth + JavaScript というと、Web Bluetooth API とどっちにするかという話もありますが、Windows で動作実績があるので noble API にしています(Web Bluetooth API も wrapping されると期待)。

以下ではこの noble-uwp のインストールと注意点をまとめます。具体的には、noble から Bluetooth Low Energy 経由で BBC micro:bit を使うための bbc-microbit というモジュールのインストールを行い、これに依存してインストールされた noble を差し替えることで noble-uwp を使えるようにします。

node-gyp には実行環境が必要

ここでは以下のバージョンを使います。

> node -v
v8.10.0
> npm -v
5.6.0

まずは bbc-microbit をインストールします。

> npm init(適当に答えて package.json を作成する)
> npm install --save bbc-microbit

こうすると node-pre-gyp install --fallback-to-build が実行され、必要なバインディング(ネイティブモジュール)をビルドしようとします。node-gyp や node-pre-gyp は Node でネイティブアドオンモジュールをビルドするための、クロスプラットフォームのコマンドラインツールで、GYP (Generate Your Project) とは、Google Chrome の元になった Chromium の開発チームで使われていた(メタ)ビルドシステムらしいです。

しかし、いくつかのモジュール(usb モジュールなど)はビルドされず、以下のようにリモートからダウンロードされます。

[usb] Success: "<現在のフォルダ>\node_modules\usb\src\binding\usb_bindings.node" is installed via remote

リモートにビルド済みバインディングがすでにあり、Node用についてはローカルではビルドしなくてよい ということです。(ビルド編2で述べるように、Electron用にはビルドは必要になります。)

一方、bluetooth-hci-socket は node-gyp rebuid で怒られます。リモートからダウンロードできないときは、ローカルでビルドが必要ですが、node-gyp でのビルドに必要な Python 2.7 もしくは VC++ 2015 の環境がないためです。詳しくは node-gyp のページ の Installations > On Windows あたりを見ながら設定しておきます。(後々 Electron を使うときには、noble-uwp もビルドが必要です。)

node-gyp の実行環境の準備

node-gyp のページ の Option 1: windows-build-tools を、管理者権限のコンソール(Cmd)から入れてしまうのが楽です。VC++ Build Tools 2015 と Python が自動でダウンロード、インストールされます。

  • Python は c:\Users\.windows-build-tools の下に入ります。
  • Pythonへのパスはデフォルトでは npm の globalconfig に追加されるだけのようです。自分は Python (Anaconda) や Visual Studio 2017 は入っていましたが、これならコンフリクトはしなさそう。
  • 通常はこの作業は不要かもしれないですが、自分は Python 環境をいくつも入れたくないため、windows-build-tools で入った Python は c:\Users\.windows-build-tools\python-2.7.14.amd64.msi を実行してアンインストールし、npm config -g delete python で npm のパスからも消してしまいました。

以下では、Python 2.7 は Anaconda の仮想環境で py27という名前で設定してあるとします。つまり、

> conda info -e
# conda environments:
#
py27                  *  C:\Program Files\Anaconda3\envs\py27
root                     C:\Program Files\Anaconda3

のような環境です。

> activate py27
(py27)> npm install --save bbc-microbit

これで bluetooth-hci-socket のビルドが成功します。(windows-build-tools で入れた Python をそのまま使うなら activate 不要です。)

noble-uwp のビルド

まずはインストールしてみます。

(py27)> npm install --save noble-uwp

すると、

Installing NodeRT UWP adapter for Windows.Foundation
[windows.foundation] Success: "<現在のパス>\node_modules\noble-uwp\uwp\windows.foundation\binding\node-v57-win32-x64\binding.node" is installed via remote

のようなメッセージがいくつも出てきます。usb と同様、node-uwp のバインディングもリモートからダウンロードされるため、ローカルでビルドしなくてよいようです。ビルド編2で説明する Electron のときには変わってきます。

noble の代わりに noble-uwp を使うように設定

noble-uwpのリポジトリのREADMEにあるように、noble-uwp を使うには、モジュールインストール後に、node_modules/noble-device/lib/util.jsrequire('noble')require('noble-uwp') に差し替えるようです。
これは忘れそうです。このページを参考に、以下のように postinstall のスクリプトを設定しておきます。

package.json(該当部)
  "scripts": {
    "postinstall": "node noble-uwp-replace.js"
  },
noble-uwp-replace.js
const os = require('os');

if (os.platform() === 'win32') {
  // https://github.com/jasongin/noble-uwp
  console.log("### noble is replaced by noble-uwp");
  var fs = require('fs');
  var f = 'node_modules/noble-device/lib/util.js';
  fs.writeFileSync(f, fs.readFileSync(f).toString().replace('require(\'noble\')', 'require(\'noble-uwp\')'));
}

これで npm install とした際にスクリプトが走るようになります。

まとめ: s2microbit-ble-console の使用方法

要件

Windows 10 バージョン1703・ビルド15063 以降

インストール方法

noble-uwp + bbc-microbit を使ったアプリケーションのインストール方法を、こちらで公開している s2microbit-ble-console (BLE 経由で BBC microbit を使う Scratch 2 のヘルパー(コンソール版))を例にまとめておきます。

  1. インストールに先立って、上で述べたような node-gyp のビルド環境(VC++ Build Tools 2015 と Python 2.7)を用意しておきます。
  2. 以下のように npm install します。
> git clone https://github.com/memakura/s2microbit-ble-console.git
> cd s2microbit-ble-console
> activate py27 (npm config のpython にパスがあればこれは不要)
(py27)> npm install

py27 はAnacondaの環境名ですが、あくまで例です。windows-build-tools でインストールした場合など、すでに Python 2.7 にパスが通っていれば activate の部分は不要です。

### noble is replaced by noble-uwp というメッセージが最後の方に出て、noble-uwp のバインディングが使えるようになれば成功です。

使用方法

  1. s2microbit-ble-console のリポジトリにある hex ファイルを micro:bit に書き込んでおきます。
  2. 同じくリポジトリにある Scratch 2 のプロジェクト (.sb2) をダウンロードして開いておきます。(Scratch 2 を開き、シフトを押しながらファイルを押して「実験的なHTTP拡張を読み込み」から拡張ブロックの定義ファイル (.s2e) ファイルを開いても使えます。
  3. npm start とすると node で s2microbit.js を実行します。
  4. micro:bit 側はLEDマトリクスが「ハート」を経て「チェックマーク」に変わり、Scratch 2 側は「その他」のs2microbit-ble の横にある赤丸が緑色になれば接続完了で使用できます。

補足

bbc-microbit のパッチ

bbc-microbit のモジュールはそのままだと scanning に失敗するとすぐにエラーで終了してしまうため、見つかるまで scanning し続けるように、postinstall で node_modules\bbc-microbit\lib\bbc-microbit.js を一部書き換えています。

Scratch 2 ヘルパーの作成方法

Scratch 2 オフライン版のヘルパーアプリケーションは、Scratch 2 側のGETリクエストに答えるようなHTTPサーバです(詳細はこちらの記事)。s2microbit-ble では、LED の点灯やセンサー情報の取得(GETポーリング)を Express サーバで受け、noble を使って micro:bit 側と通信します。詳しくはまとめ編で説明します。

Electron版へ

以上から分かるように、この s2microbit-ble のコンソール版を使うには環境構築が大変です・・
次回は Electron版のビルド方法を述べて、実行形式をインストーラで配布できるようにします。

つづく:ビルド編2

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?