LoginSignup
2
2

More than 5 years have passed since last update.

Spark CoreのTinkerファームウェアでREST API/spark-cli/Cylon.jsでLチカする

Posted at

Spark CoreにはデフォルトでTinkerファームウェアがインストールされています。前回はAndroidなどのTinkerアプリなどから操作するために使いました。TinkerファームウェアはArduinoのFirmataファームウェアと異なり、インターネット上のSpark Cloudを経由して通信します。そのため直接ホストマシンと接続する必要がありません。リモートにあるSpark CoreをREST APIなどから操作することができます。自分のクラウド上の仮想マシンからNode.jsのプログラムを実行することも可能です。

ブレッドボードとLEDの準備

Spark-Core-LEDを参考にしてブレッドボードにLEDと抵抗を配線します。

Spark-Core-Led-01.jpg

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.jscylon-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メニューからアクセストークンを確認します。

spark-ide-access-token.png

{device_id}もSpark BuildのCoresメニューから確認できます。

spark-ide-device-id.png

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.
2
2
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
2