1. 概要
    1. Go言語 + GOBOT がBLE経由でmicro:bitを入出力デバイスとして利用できると知りRaspberry Pi配下で実験して見たがBLEがリンクしない(…BLEリンクして制御できるようになりました 2018.01.25)
    2. 上記1でmicro:bitを入出力デバイスとして利用するためのファームウェアはmicro:bitをNode.jsの入力デバイスとして使うためのファームの流用だった。
    3. Node.js + Johnny-five から入出力デバイス化micro:bitにBLE接続する実験は2017年8月に実験してBLEリンクはするもののデータの送受ができなかったので放置していた。
    4. これを機にもう一度 Raspberry Pi + Node.js + Johnny-five からBLE接続で入出力デバイス化micro:bitを使う実験をやってみたら簡単にリンクしデータの送受ができた。
      2017年8月の段階と同じ手順で環境をセットアップしてできたので8月の実験で何が悪かったのか不明
    5. Raspberry Pi だけでなくmac でもうまく動いた。
    6. セットアップ手順を備忘として残す
  2. nodeモジュール bbc-microbit-io をインストールする。
    1. 実験環境のNode.jsのバージョン
      $ node -v
      v8.9.4
    2. sandeepmistry/node-bbc-microbit-ioに従ってインストールする。

      $ npm install bbc-microbit-io johnny-five (Johnny-fiveが未インストールのとき)
      
      >インストール経過が表示される
      >エラーが多数表示されるが無視
      
      $
    3. micro:bitへのファームウェア書き込み
      (Go言語を使った連携のためにmicro:bitにファームウェアを書き込んでいる場合はそのファームウェアがそのまま使えます)

      1. micro:bitをRaspberry Pi にUSB接続する。
      2. リムーバブルストレージとしてマウントするか聞いてくるのでマウントする。
      3. ~/node_modules/bbc-microbit-io/node_modules/bbc-microbit/firmware/ に収容されている node-bbc-microbit-v0.1.0.hex をリムーバブルストレージ /media/pi/MICROBIT にコピーすることで書き込みを行う。
    4. サンプルの実行
      1. 当該ファームウェアはペアリングなしでBLEリンクできる設定になっている模様。このため事前のペアリングの操作は不要。
      2. ~/node_modules/bbc-microbit-io/examples/に移動
      3. led_matrix.jsを実行
        $ sudo node led-matrix.js 
        1516667927765 Available BBC micro:bit  
        1516667930689 Connected BBC micro:bit  
        1516667930782 Repl Initialized  
        >> clearing matrix
        drawing: 5
        drawing: !
        drawing: square
        
        LED Matrixに 5 ! □ が表示されれば動作OK
        
        sudo を付けず実行したい場合は次を1回実行しておけばよい。
        (https://github.com/sandeepmistry/noble#running-on-linux を参照)
        $ sudo setcap cap_net_raw+eip $(eval readlink -f `which node`)
    5. 自前のプログラムで動かしたい
      1. sandeepmistry/node-bbc-microbit-ioのBoilerplateプログラムを下敷きにして
      2. sandeepmistry/node-bbc-microbit-ioのAPIとJohnny-fiveのAPIを併用してプログラムを書けば良い
    6. I2CデバイスをコネクタのPin19,Pin20に接続して制御することはできない。
      1. micro:bitには2系統のI2Cライン(0と1)があってI2C0はmicro:bit内蔵センサー接続用に使われI2C1がコネクタに出ている。
      2. bbc-microbit-ioとjohnny-fiveはI2C0を制御対象としI2C1は単なるデジタル入出力ピン(Pin19,Pin20)としてしか利用できない。
      3. このため,I2C1(Pin19,Pin20)にI2CデバイスをつないでもNode.jsで制御することができない。
    7. 複数のmicro:bitをコントロールしたい(実験途上)
      サンプルのソースコードを見るとmicro:bitのID又はアドレスを指定してリンクできるようだが,うまく行っていない。

      var board = new five.Board({
        io: new microbitio({
          // id: '<id of micro:bit>', // optional
          // address: '<address of microbit>' // optional
        })
      });
      
      address: 'FD:3E:2C:36:AF:3F' のようにmicro:bitのアドレスを指定したがリンクしなかった。
      idとaddressの両方を設定しなければならないのかも知れない。
  3. 今後
    1. nRF51系用のFirmataBLEをビルドし,Node.jsとmicro:bitをダイレクトに(sandeepmistry/node-bbc-microbit-ioを使わないで)接続して連携させたい。