Spark CoreにはデフォルトでTinkerファームウェア がインストールされています。前回 はAndroidなどのTinkerアプリ などから操作するために使いました。TinkerファームウェアはArduinoのFirmata ファームウェアと異なり、インターネット上のSpark Cloudを経由して通信します。そのため直接ホストマシンと接続する必要がありません。リモートにあるSpark CoreをREST APIなどから操作することができます。自分のクラウド上の仮想マシンからNode.jsのプログラムを実行することも可能です。
ブレッドボードとLEDの準備 Spark-Core-LED を参考にしてブレッドボードにLEDと抵抗を配線します。
D0のGPIOを使ってLチカします。
spark-cli spark-cli を自分のクラウド上にデプロイしてSpark CoreをLチカしてみます。
Dockerコンテナの用意 適当なクラウドに仮想マシンとDockerをインストールしてプロジェクトを作成します。今回はIDCFクラウドの仮想マシンを使いました。最初にプロジェクトを作成します。
$ mkdir ~/docker_apps/spark_apps/my-spark-cli $ cd !$
spark-cliはグローバルインストールするので、package.jsonには依存パッケージとして定義しません。
package.json { "name" : "my-spark-cli" , "version" : "0.0.1" , "private" : true }
Dockerfileを作成してイメージをビルドします。ベースイメージにはgoogle/nodejs-runtime を指定します。
$ cat <<EOF > Dockerfile FROM google/nodejs-runtime RUN npm install -g spark-cli ENTRYPOINT ["/bin/bash"] EOF $ docker pull google/nodejs-runtime $ docker build -t my-spark-cli . $ docker run --rm --name spark-cli -it my-spark-cli
ログイン CLIを使ってSpark Cloudにログインします。テンポラリのaccess_tokenを取得できるので以下の操作で使います。
$ spark cloud login Could I please have an email address? ma6ato@gmail.com and a password? ********* Got an access token! xxx logged in ! { '0' : 'xxx' } Using the setting "access_token" instead
CLIからLチカ spark cloud listを実行すると接続しているSpark Coreの一覧を取得できます。xxxのところに実際にはdevice_idが入っています。
$ spark cloud list Checking with the cloud... Retrieving cores... (this might take a few seconds) ninja_mighty (xxx) is online Functions: int digitalread(String args) int digitalwrite(String args) int analogread(String args) int analogwrite(String args)
このデバイスで使える関数の一覧が表示されます。digitalwriteを使いLチカしてみます。
D0のLEDを点灯(HIGH)します。成功すると1が返ります。
$ spark call ninja_mighty digitalwrite D0,HIGH 1
D0のLEDを消灯(LOW)します。
$ spark call ninja_mighty digitalwrite D0,LOW 1
REST APIからLチカ spark-cliで確認した{access_token}と{device_id}を使ってREST API を試してみます。
D0のLEDを点灯(HIGH)します。
$ curl https://api.spark.io/v1/devices/{device_id}/digitalwrite \ -d access_token={access_token} \ -d params=D0,HIGH { "id" : "xxx" , "name" : "ninja_mighty" , "last_app" : null, "connected" : true , "return_value" : 1 }
D0のLEDを消灯(LOW)します。
$ curl https://api.spark.io/v1/devices/{device_id}/digitalwrite \ -d access_token={access_token} \ -d params=D0,LOW { "id" : "53ff6d066667574821362467" , "name" : "ninja_mighty" , "last_app" : null, "connected" : true , "return_value" : 1 }
Cylon.jsでLチカ Cylon.js のcylon-spark アダプタを使い、Node.jsのプログラムからLチカします。
Dockerコンテナの用意 Dockerをインストールした仮想マシンにプロジェクトを作成します。
$ mkdir ~/docker_apps/spark_apps/led-blinking $ cd !$
package.jsonに必要なパッケージを定義します。
~/docker_apps/spark_apps/led-blinking/package.json { "name" : "spark-led-blinking" , "version" : "0.0.1" , "private" : true , "dependencies" : { "cylon-spark" : "0.18.0" }, "scripts" : {"start" : "node app.js" } }
app.jsのメインプログラムを書きます。access_tokenとdevice_idはDokerコンテナの起動時に環境変数として渡します。
~/docker_apps/spark_apps/led-blinking/app.js var Cylon = require ('cylon' );Cylon.robot({ connections: { spark: { adaptor : 'spark' , accessToken: process.env.ACCESS_TOKEN, deviceId: process.env.DEVICE_ID } }, devices: { led: { driver : 'led' , pin : 'D0' } }, work: function (my ) { every((1 ).second(), function ( ) {my.led.toggle()}); } }).start();
Dockerfileを作成してイメージをビルドします。
$ echo FROM google/nodejs-runtime > Dockerfile $ docker pull google/nodejs-runtime $ docker build -t spark-led-blinking .
Lチカの実行 Dockerコンテナを起動します。{device_id}はspike-cliで取得した値と同じですが、{access_token}の値はテンポラリのようです。Spark Build にログインして、Settingsメニューからアクセストークンを確認します。
{device_id}もSpark BuildのCoresメニューから確認できます。
docker runの-eフラグに{access_token}と{device_id}を指定してコンテナを起動します。package.jsonのscriptsディレクティブに指定したapp.jsを実行してLチカが始まります。
$ docker run --rm --name led-blinking \ -e ACCESS_TOKEN={access_token} \ -e DEVICE_ID={device_id} \ -it spark-led-blinking > spark-led-blinking@0.0.1 start /app > node app.js I, [2015-03-02T05:03:37.022Z] INFO -- : [Robot 57708] - Initializing connections. I, [2015-03-02T05:03:37.229Z] INFO -- : [Robot 57708] - Initializing devices. I, [2015-03-02T05:03:37.232Z] INFO -- : [Robot 57708] - Starting connections. I, [2015-03-02T05:03:38.186Z] INFO -- : [Robot 57708] - Starting devices. I, [2015-03-02T05:03:38.186Z] INFO -- : [Robot 57708] - Working.