ネコと和解せよ

mbedJS beta版をリリースしました

WebブラウザからJavascriptでmbedを制御できる次世代フィジカルコンピューティングソフトウェア(?)エェェェェンベッドJS (mbedJS)をリリースしました。*1

f:id:nyatla:20140625203440p:plain

これは何?

エェェェェンベッドJSは、mbed単体で稼働するネットワークフィジカルコンピューティングの用のWebサービスソフトウェアです。


HTMLとJavaScriptでHTMLを書く知識があれば、特に新しいことを覚えなくてもフィジカルコンピューティングを始めることができます。


f:id:nyatla:20140625203623p:plain


mbedをネットワーク経由でリモート制御するためのファームウェア、及びJavascriptAPIで構成されています。Websocket上のJSON RPC 2.0を用いた高速なRPCと、mbedSDKライクなJavascriptAPIが特徴です。


例えば、よくあるLチカプログラムは次のようなJavascriptで書くことができます。

function start()
{
  var mcu=new mbedJS.Mcu(location.host,{
    onNew:function(){
      var v=1;
      var pin=new mbedJS.DigitalOut(mcu,mbedJS.PinName.LED1,{
      onNew:function(){
        pin.write(1);
      },
      onWrite:function(){
           setTimeout(function(){pin.write((v++)%2);},100);
      }});
    },
    onError:function(){alert("Error!");}
    });
}

mbedJSを始める準備

ハードウェアの準備

mbedJSを始めるには、次のハードウェアの何れかを準備する必要があります。
*2


mbedにイーサネットコネクタを接続し、操作するPC/またはタブレットなどと同じネットワークに接続してください。



ファームウェアの書き込み

mbedJSのファームフェアは、mbed.orgから取得できます。
mbedJS - a mercurial repository | mbed

ファームウェアをダウンロードして書き込んでください。


設定

mbedJSのIPアドレスの初期値は、192.168.0.39です。
IPアドレスを変更するには、mbedのルートディレクトリに設定ファイルmimic.cfgを作り、IPアドレスを指定します。
f:id:nyatla:20140625200438p:plain

*3

mbedをリセットして、指定したIPアドレスにアクセスすると、mbedJSのトップページが開きます。
準備はこれで完了です。

mbedJSの使い方

ブラウザで開発

mbedJSには、オンチップのJavascriptエディタが搭載されています。Javascript Editorを開くと、すぐに開発を始めることができます。
作成したコンテンツは、mbedに直接保存する事が出来ます。((現在はmbed1768のみ可能です。))

f:id:nyatla:20140625214123p:plain

Onchip Javascript Editor

f:id:nyatla:20140625214200p:plain

APIの種類

使用できるAPIの一覧とその説明は以下のURLから閲覧できます。
http://mimic.sourceforge.jp/doc/mbedjs/current/JsDoc Reference - Index

現在は、mbedSDKに含まれる以下のクラスと同等のAPIが整備されています。

  • AnalogIn
  • AnalogOut
  • BusIn
  • BusOut
  • BusInOut
  • DigitalIn
  • DigitalOut
  • PortIn
  • PortOut
  • PwmOut
  • SPI
  • SPISlave

Javascriptの書き方

mbedJSのAPIには、コールバックとGeneratorの2つの使い方があります。
コールバックはどのブラウザでも動作しますが、複雑なコンテンツを製作する場合にコードが難しくなります。(よく問題になるコールバック地獄です。)

Generatorを用いると、以下の様なスッキリとしたコードでmbedを制御することができます。
ただし、ES6をサポートしたブラウザ(FireFox,Chrome)でしか動作しません。

Generatorを使った記法
function start()
{
    var g=function*(){
    try{
        var mcu=new mbedJS.Mcu(location.host,g);
        yield mcu.waitForNew();
        var pin=new mbedJS.DigitalOut(mcu,mbedJS.PinName.LED1,g);
        yield pin.waitForNew();
        for(var v=1;;v++){
          yield setTimeout(function(){g.next();},100);
          yield pin.write(v%2);
        }
    }catch(e){
        mcu.shutdown();
        alert(e);
        throw e;
    }
    }();
    g.next();
    return;  
}

設定方法の詳細など

JavascriptAPI以外の機能は前作のMiMicRemoteMCUと同一です。設定方法などの詳細は、以下のマニュアルを参考にできます。

  1. http://sourceforge.jp/projects/mimic/docs/MiMicRemoteMCU_manual/ja/MiMicRemoteMCU_manual.pdf

その他の遊び方

高速なJSON-RPCを使った直接制御

mbedJSのRPCはWebSocketとJSON-RPC/2.0で実装されており、高速に動作します。
従来のHTTPベースのRPCでは不可能だった、細かい単位でハードウェアの直接制御ができます。

一般的なmbedJS APIは、1~5msで応答することができます。

複数台のmbedを同時に制御

mbedJSは複数台のmbedを1つのコンテンツから操作することができます。上限はありません。(ネットワークに接続できる最大台数が上限です。)

例えば、1台のmbedで取得したアナログ値を、ブラウザを経由して別のmbedに転送するといった使い方もできます。

オンラインコンテンツと連携した新しいフィジカルコンピューティング

mbedJSはブラウザに対しては一般的なWebサーバと同じように振る舞います。制御用のコンテンツも特殊なものではなく、普通のHTML5です。

例えば、mbed取得したデータをオンラインの他のWebサーバに転送したり、逆にオンラインのコンテンツからmbedを操作することが可能です。

従来のようにファームウェアを変更する必要はなく、Javascriptとコンテンツの実装のみで実現することができます。

独自のRPC関数の追加

割と簡単にできます。rpctbl.cpp、libMiMic/mbed/jsonrpc/あたりを見ると多分仕組みは・・・ご理解いただけるかと。需要があれば解説記事書きます。

技術的な資料とか

http://sourceforge.jp/projects/mimic/scm/svn/tree/head/trunk/

  • 無圧縮のmbedJS.all.js

http://nyatla.jp/mimic/js/current/mbedJS.all.js

http://sourceforge.jp/projects/mimic/scm/svn/tree/head/trunk/misc/mbedJS/mbddJS.API/


mbed NXP LPC1768

mbed NXP LPC1768

サッポロ ヱビスビール 350ml×24本

サッポロ ヱビスビール 350ml×24本

*1:以前リリースしたMiMicRemoteMCUの後継品です。

*2:mbed1768以外のプラットフォームでは、mbedのローカルファイルシステムが使用できません。

*3:mbed1768以外の場合はファイル設定が利用できないため、一度PC側のIPアドレスを変更してmbedJSのSetupページから変更する必要があります。