Intel Edisonからのセンサデータをお手軽にグラフプロットするIoT Analyticsの使い方
このエントリの概要
Intel Edison にくっつけたセンサのデータを, IoT AnalyticsというIntelのサービスへPublishし,リアルタイムにグラフとしてプロットする方法について説明します.
以下の様なグラフを簡単に作ることができます.
IoT Analyticsの利点
まだ開発段階だと思うので,全ての機能が正常に動作してるかがわかりません(というかそもそもHow to 的なものが整備されていない……).手探りで触ってみて感じた利点は以下.
Edisonを使ってデータを収集するまでのハードルがめちゃくちゃ低い
ネットワーク越しのセンサデータをリアルタイムにグラフにプロットして確認できる
- CSVもリアルタイムに得られるから他の分析ツールへ移行しやすい
- 閾値などを使ってルールを記述して,マッチするときにアラートをメールで送れる?(と思うんだけどエラーが出ていて利用できてない……説明もない)
- サーボとかもこれを通して操作できる??(と思うんだけどエラーが出て利用できていない……説明もない)
手順
- IoT Analytics アカウントをつくる
- EdisonをIoT Analyticsに登録する
- Edisonで取得したデータをPublishするためにEdisonのセットアップを行う
- dataをPublishする
- Publishされたデータを閲覧する
- CSVで取得してExcelでプロットしてみる
- CSVで取得してPythonでSciPy, matplotlibを使ってプロットしてみる
1. IoT Analytics アカウントをつくる
IoT Analyticsへアクセスする.OAuth使うと問題が起きるみたいなコメントがどっかにあった気がするけど実際どうなんだろう.不安だったのでメルアドで登録した.
2. EdisonをIoT Analyticsに登録する
下図を参照.AccountメニューのDetailsタブにアクティベーションキーがあるのでメモしておく.更新ボタンを押してから1時間アクティベーションキーが有効になる.目のボタンを押すとキーが見えるようになる.
アクティベーションキーを取得したら,そのキーを用いてEdisonをIoT Analyticsへ登録するためにEdison上で下記コマンドを実行する.
# [activation-key]は先ほどメモしたアクティベーションキーに置き換える $ iotkit-admin activate [activation-key]
以下の様な表示がされたら登録は完了.
2014-11-02T14:40:07.571Z - info: Activating ... 2014-11-02T14:40:09.146Z - info: Saving device token... 2014-11-02T14:40:09.159Z - info: Sending attributes...
以下の様なエラーが出るときはアクティベーションキーが間違ってます.
ぼくはI(大文字アイ)とl(小文字エル)を間違えてました.フォント的に見難い.
2014-11-02T14:39:58.188Z - error: Activation Rejected: {"code":1410,"message":"Invalid Activation Code"} --> error 2014-11-02T14:39:58.194Z - error: Error in the activation process ... 300
3. Edisonで取得したデータをPublishするためにEdisonのセットアップを行う
iotkit-agentを有効にして起動します.
$ systemctl enable iotkit-agent $ systemctl start iotkit-agent
4. dataをPublishする
iotkit-commを使ってClientアプリケーションを記述します.iotkit-commについて分からなければ,以前のエントリを参考にしてください.
4-1. Service Specificationを記述する
まず,IoT Analyticsを使ったService Specificationを作ります(enableiot-cloud-spec.json)
//enableiot-cloud-spec.json { “type”: { “name”: “enableiot-cloud”, “protocol”: “tcp”, }, “address”: “127.0.0.1”, “port”: 1844 }
4-2. データをPublishするコードを書く
次に,データをIoT AnalyticsへPublishするためのコードを書きます.
公式のチュートリアルはデータを1回送って終わりだからグラフにした時におもしろくないので,5秒ごとにランダムなデータを送信するように修正します.
//temperature_sensor.js var iotkit = require(‘iotkit-comm’); var spec = new iotkit.ServiceSpec(“enableiot-cloud-spec.json”); var sensor_value; iotkit.createClient(spec, function(client){ client.comm.registerSensor(“garage”, “temperature.v1.0”); setInterval(function(){ sensor_value = 40 + Math.floor(Math.random() * 31); client.comm.publish(JSON.stringify({“n”: “garage”, “v”: sensor_value})); }, 5000); });
コードを書いたら,node.jsを使って実行します.
node temperature_sensor.js
ここでのポイントは2つです.
- client.comm.registerSensor() を使って利用するセンサの種別と名前(ID)を登録する.
- cilent.comm.publish() を使ってデータをPublishする.データの形式は,client.comm.registerSensor()で登録した名前と,valueのペアで構成されるJSONです.
つまり,IoT Analytics側でセンサの持つ意味を判別するためのニックネーム(ID)をセンサ種別(温度,湿度など)と合わせて保持しておき,Publishする際にはどのセンサからのデータなのかということをIDを使ってIoT Analyticsへ教えてあげるということになります. ここで,センサのことをComponentと呼び,ひとつのデバイスは複数のComponentを持つことができます.
補足:接続確認
IoT Analyticsへ接続できているかを以下のコマンドで確認できる.うまくいかない場合の切り分けに.
$ iotkit-admin test
補足:Componentの初期化
センサを登録していくと,そのうち使わないやつばっかりになってくることがある.そんなときはデバイスに登録しているComponentを初期化してやる.個別に削除する方法は分かってない.
iotkit-admin initialize iotkit-admin reset-components
4-3. 補足:センサ種別について
デフォルトで定義されているセンサーは,以下の3つです. - 温度センサ:temperature.v1.0 - 湿度センサ:humidity.v1.0 - 電源状態:Powerswitch.v1.0
4-4. 補足:独自センサをIoT Analyticsへ登録する
もし,上記の3つ以外のセンサを扱いたい場合,事前に登録をしておく必要があります.ここでは距離データ(mm)を得ることができる距離センサを登録してみましょう.
AccountページのCatalogタブを開くと,そのアカウントの中で定義されているセンサ種別が表示されます(正確にはアクチュエータも含まれますが,今回はセンサに絞って話を進めます).画面下部にあるAdd a new Catalog Itemというボタンをクリックします.
すると,下図のように新しいComponentを定義するための画面が表示されます.ここでは図にあるように,mm単位で距離を出力する距離センサを定義してみます.
Saveをボタンを押すとComponentが保存されます.確認のためにもう一度アカウントメニューのCatalogタブを開いてみます.さきほど作成した距離センサが作成されました.
定義した距離センサをさきほど4-2で作成したコード中で以下のように記述すれば,距離センサから取得したデータをIoT AnalyticsへPublishすることができます.
client.comm.registerSensor(“living_tv”, “distance.v1.0”); client.comm.publish(JSON.stringify({“n”: “garage”, “v”: distance_value}));
5. Publishされたデータを閲覧する
ChartメニューからグラフへプロットするDeviceとComponentを選択すると,取得したデータのグラフが表示されます.グラフ上部のボタンと,グラフ下部のスライダーを使って表示する時間幅を調整することができます.自動更新はされないので更新ボタンを押すことで新しいデータを確認する必要があります.リフレッシュボタンを押すと呼ばれる関数を定期的にコールするJavascriptを実行すれば良いでしょう.
6. CSVで取得してExcelでプロットしてみる
グラフ上部のshareボタンを押すとCSVでエクスポートすることができます.
これをExcelで読み込んで線グラフとしてプロットしてみます.
7. CSVで取得してPythonでSciPy, matplotlibを使ってプロットしてみる
今度はPythonを使ってプロットしてみる.scipyとmatplotlibを使う.
>>> import scipy as sp >>> data = sp.genfromtxt("data.csv", delimiter=",") >>> x = data[:, 5] >>> y = data[:, 6] >>> x = x[~sp.isnan(y)] >>> y = y[~sp.isnan(y)] >>> import matplotlib.pyplot as plt >>> plt.plot(x, y, 'bo-') [<matplotlib.lines.Line2D object at 0x109f73bd0>] >>> plt.grid() >>> plt.show()
確認中のこと.
Controlメニューから,デバイスのアクチュエータを操作する方法
例えばサーボとかの動作角度を指定してサーバから動作させるとかができると思うんだけど,全然使い方がわからない…
Rulesメニューからルールを登録する方法
デバイスのComponentのデータを監視して,設定しておいた閾値以上になるとアラートをメールで送るとか,そういうルールが記述できると思うんだけど,最後の登録のところでエラーがでる…
Intel Edisonで iotkit-commを使うその3:Service SpecificationsとService Queriesについて.
前回のエントリの続き.
前回の説明ではJSONのサンプルとしてしか触れていなかった,Service SpecificationsとService queriesについてのもう少し詳しい説明.
もっと詳しいことを学ぶその3. Service Specifications と queriesについて
Service Specifications と queriesは,分散アプリケーションの開発をシンプルにするiotki-commライブラリの使い方を理解するためのキーだ.iotkit-commで記述された分散アプリケーションは,基本的にサーバとクライアントで構成される.
開発者はService を以下のステップで開発する.
- service specification を記述する
- specification に基づいたServiceを生成するために,iotkit-commライブラリへリクエストを行う
また,開発者はClientを以下のステップで開発する.
- Service query の記述
- queryに記述されたAttributesにマッチするServiceの発見と接続をiotkit-commへリクエストする
Service Specifications と queriesはとてもよく似ています.コードについて言えば,Service Specificationsオブジェクトは,Service queryの子となっています.しかし,これらの2つには,根本的な違いが2つあります.
- queryはClientによってのみ利用されるのに対して, specificationsはClient,Serverの両者で利用される.Specificationsが初期化や,Serviceへの接続に利用されるが,queryはServiceの発見のみに利用される.
- queryはIPアドレスやPortを含むことができないが,対して,Service Specificationは含むことができる.なのでこれらの情報は事前に共有されていないと考えたほうが良い.
ここで,少し脱線するけど,ネットワーク上のServiceを発見することが,どういうことなのかについて詳しく説明をする.
Service発見の機能にともなって,nameやProtocolによる検索を行い,IPアドレスやポート番号を獲得する.Serviceはネットワークでの最初のAdvertiseによってのみ発見される.Service Specificationsのうちの1つがService queryにマッチした時,Serviceを発見した,と言う.Service SpecificationsのAdvertisingとService Queryとのマッチングを管理するプロトコルは,mDNS(Multicast DNS)と呼ばれる.mDNSのコンセプトに基づくために,Service Specifications, query,それらのマッチングはiotkit-commによって抽象化されていることを覚えておいてください.
続いて,Service SpecificationsとQueryの書き方について説明します.これらはJSONで記述されます.
Service Specifications
以下はService Specificationsの例です. 例に続いて各Attributeの説明を行います.
Server Specificationsの例
{ "name": "/my/home/thermostat/temperature_sensor", "advertise": {"locally": true, "cloud": false}, "type": { "name": "zmqpubsub", "protocol": "tcp" }, "type_params": {"ssl": false}, "address" : "127.0.0.1", "port": 8999, "properties": {"dataType": "float", "unit": "F", "sensorType": "ambient"} }
各フィールドについての説明
name(例外を除いてオプション): 文字列.なるべくユーザフレンドリなものを.Service namesは他のアプリケーションでも表示される可能性がある.
※ nameは,もしネットワーク上でServiceがAdvertiseされる場合には設定しなければならない.advertise(オプション): このオプションが設定されない場合,ServiceはLAN内でAdvertiseを行います. ※ 現在のiotkit-commはクラウドでのAdvertising Serviceをサポートしていません.そのため現在は,”cloud”フィールドは無視されてしまいます.
type(必須): メッセージの送信受信方法は typeフィールドによって設定されます.typeフィールドは通常,”name”と,”communication plugin”を含みます.iotkit-commでは,プラグインがどのようにメッセージが送信されるかを抽象化するので,開発者はメッセージの内容にフォーカスすることができる.
type_params(オプション): 通信プラグインがサポートできる設定パラメータ.iotkit-commはこのパラメータをそのまま通信プラグインに引き渡す.
- port(必須): サーバが動作するポート番号.
- properties(オプション): Serviceが持つユーザプロパティ.各プロパティは,”name”: valueのペアで記述されなければならない.この場合の例では,センサが周囲の温度を華氏で,FloatでPublishする,という設定を行っている.
- address(オプション): サーバが動作するアドレス.記述しなければlocalhostが利用される.
このSpecificationはmodule:main.createServiceに渡すことができ,最終的には指定されたアドレスとポートで動作しているServiceのインスタンスを返します.
Service Query
以下にService queryの例を示し,続いて各Propertyの説明を行います.
Server Queriesの例
{ "name": ".*temperature_sensor", "type": { "name": "zmqpubsub", "protocol": "tcp" } }
このqueryは,Service Specificationセクションで示したSpecificationsと一致していることが大事です.さらに,このqueryはzmqpubsubプロトコルを利用して通信を行う,LAN内の全ての温度センサを発見しに行きます.以上を念頭において各Attributeについて見てみましょう.
各フィールドの説明
- name(オプション): 正規表現を利用可能.
- type(必須)
このqueryはmodule:main.createClientに渡すことができ,最終的にはServiceに接続されたClientインスタンスが返されます.
Intel Edisonで iotkit-commを使うその2:ServerとClientについて.
前回のiotki-commチュートリアルの "4.もっと詳しいことを学ぶ" の続きです.
もっと詳しいことを学ぶその1. server(Service)の書き方
iotkit-commのチュートリアルその1,Clientについて
以下の3つのステップでService(Server)を作成する
- Service Specificationを記述する
- 1で決めたSpecificationにもとづいてServiceを作成する
- Serviceを実行する
以下でその例について述べる ※以下で示すサンプルコードは,/usr/share/iotkit-comm/examples/node/basic-client-serverに配置されています.
1. Service Specificationを記述する
Service SpecificationはJSONとして記述する.このJSONには,Serivceが動作するポート,Serviceの名前,通信時に利用するプロトコルといったAttributesを記述する.ここでは例として,以下の “server-spec.json”を記述してみる.
{ “name”: “/ndg/temperature/cpuTemp”, “type:”: { “name”:”zmqreqrep”, “protocol”: “tcp” }, “port”: 8333, “properties”: {“dataType”: “float”, “unit”: “F”}, “advertise”: {“locally”: true, “cloud”: false} }
2. 1で決めたSpecificationにもとづいてServiceを作成する
例として以下のServiceを作成する(server.js)
var iotkit-comm = require(‘iotkit-comm’); var path = require(‘path’); var spec = new iotkit.ServiceSpec(path.join(__dirname, “server-spec.son”); iotkit.createService(spec, function(service){ service.comm.setReceivedMessageHandler(function(client, msg, context){ cnosole.log(“received from client: “ + msg.toString()); service.comm.sendTo(client, “hi”); }); });
※Serviceでは,どのような内容のメッセージかのみを記述するため,そのメッセージが届くかどうかは気にする必要がありません. type.nameフィールドでの記述があれば,iotkit-commはどのようにメッセージを送信すればよいかを判断することができます.(今回の例でいうと”zmqreqrep”) ※ zmqreqrep: ZeroMQ is a high-performance asynchronous messaging library
通信の詳細は,通信プラグインによって処理されます.今回の例で言うと,通信プラグイン(service.comm)は, zmqreqrepプラグインのインスタンスです.通信プラグインの詳細は後述しますが,ここでは,通信プラグインは send や,sendTo といったファンクションを提供すると考えてください.
様々な通信プラグイン間の主な違いは,send や, sendTo といったファンクションのコールによって何が起こるかである(例えば,パケットフォーマットやヘッダが異なる).標準でいくつかの通信プラグインがiotkit-commにバンドルされているが,必要に応じて独自の通信プラグインを書くことも簡単にできる.
3. Serviceを実行する
これまでに記述した server-spec.json と, server.js を同じディレクトリに置き,以下のコマンドを実行すればServiceが起動します
node server.js
もっと詳しいことを学ぶその2. client の書き方
iotkit-commのチュートリアルその2,Clientについて
以下の3つのステップでClientを作成する
- Service queryを記述する
- ServiceのためのQueryにもとづいてClientを作成する
- Clientを実行する
以下でその例について述べる ※以下で示すサンプルコードは,/usr/share/iotkit-comm/examples/node/basic-client-serverに配置されています.
1. Service queryを記述する
Service QueryはJSONとして記述する.このJSONには,Clientが接続したいServerのAttributesが記述されている.ここでは例として,以下の “server-query.json”を記述してみる.
{ "name": "/ndg/temperature/cpuTemp", "type": { "name": "zmqreqrep", "protocol": "tcp" }, "properties": {"dataType": "float", "unit": "F"} }
2. ServiceのためのQueryにもとづいてClientを作成する
例として以下のclientを作成する(client.js)
var iotkit = require('iotkit-comm'); var path = require('path'); var query = new iotkit.ServiceQuery(path.join(__dirname, "server-query.json")); iotkit.createClient(query, function (client) { client.comm.setReceivedMessageHandler(function (message, context) { console.log("received from server: " + message.toString()); client.comm.send("hello"); }); client.comm.send("hello"); });
※ ServiceのIPアドレスや,Serviceとの通信方法をClientが知っている必要はありません.代わりに,Service queryがそのような詳細について管理してくれます.例えば,ClientではServiceの名前とServiceが利用するプロトコル(この場合zmqreqrep)を記述します.Serviceが見つかると,iotkit-commは適切に初期化された通信ハンドル(client.comm)をClientオブジェクトとともに返します.このハンドルは,Serviceに接続されたzmqreqrepプラグインのインスタンスです.
通信プラグインの詳細は後述しますが,ここでは,通信プラグインは send や,sendTo といったファンクションを提供すると考えてください.
様々な通信プラグイン間の主な違いは,send や, sendTo といったファンクションのコールによって何が起こるかである(例えば,パケットフォーマットやヘッダが異なる).標準でいくつかの通信プラグインがiotkit-commにバンドルされているが,必要に応じて独自の通信プラグインを書くことも簡単にできる.
3. Clientを実行する
これまでに記述した server-query.json と, client.js を同じディレクトリに置き,以下のコマンドを実行すればClientが起動します
node server.js
動作確認
Tutorial: Server で作成したServerと,このセクションで作成したClientを起動させると,以下のような実行結果が得られます.
Intel Edisonで iotkit-commを使う:サーモスタットサンプルによるGetting Started
IoTIoT言うとりますけども.
という感じでIntel Edisonに提供されているiotkit-comm.
いかにも!という感じがするライブラリ名だけど,解説記事が全然ないので,ひとまずGettingStartedを訳しながら試してみた.
というわけで,公式ドキュメントを参考にして,話を進めます.
iotkit-comm Getting Started
概要
iotkit-commは以下の様な機能を提供します.これを使うと,クライアント,サーバによって構成される分散アプリケーションの開発ができるようになります.
- ネットワークに接続されたデバイスの発見
- ネットワークに接続されたデバイス同士での通信
- ネットワークに接続されたデバイスとクラウド間での通信
Intel Edison向けのプラットフォームとして設計されていますが,他のプラットフォームでも同様に動作しています.
iotkit-commは,CとNode.js向けのライブラリが存在しますが,以下ではNode.js向けの説明をします.
このドキュメントの読み方
2つのセクションがあるので,目的に応じて利用します.
APIリファレンスを閲覧するためのセクションは,”Modules”セクションです.
- “main”モジュールから読み始めることをおすすめします
APIの利用方法についてのチュートリアルを閲覧するためのセクションは,”Tutorial”セクションです.
- “Start Here”チュートリアルから読み始めることをおすすめします.
※ このドキュメントは,Modulesが,Classes, Methods, Variablesのどのような論理構成により実現されるのかを示したものであり,あくまでドキュメントであることに注意してください.コードベースでiotkit-commを説明したものではありません.
このドキュメントでの前提条件
- Edisonがインターネットアクセス可能であること
- 前回のエントリを参考にWiFi設定を行いましょう.
- SampleプログラムやコマンドがEdison上で動作可能であること.
- 後で記述する,iotkit-commにおけるHelloWorldを試してみましょう.
iotkit-comm ドキュメント(Tutorial編)
Start Here
iotkit-commライブラリを使って開発を行うために,以下のように学習していきます.
- iotkit-commのインストール
- “hello world”プログラムを書いて実行する(オプション)
- 付属のサンプルプログラムを実行する(オプション)
- もっと詳しいことを学ぶ(オプション)
1. iotkit-commライブラリのインストール
Intel Edisonデバイスにはもうインストール済みだからこの手順は必要ないです.
- 他のプラットフォームへのインストール方法は後日公開予定.
ただし,以下の方法でIoT Developer Kit librariesに関するアップデートだけしておきましょう.
$ echo "src intel-iotdk http://iotdk.intel.com/repos/1.1/intelgalactic" > /etc/opkg/intel-iotdk.conf $ opkg update $ opkg upgrade
2. Write “hello world”プログラムを書いて実行する
- “helloworld.js”というJavascriptファイルを作成し,以下のプログラムを記述します.
var iotkit = require(‘iotkit-comm’);
console.log(iotkit.sayhello());
- 記述した”helloworld.js”の動作をターミナルで確認します.
$ node helloworld.js # 以下の文字が出力される >Hello Edison user!
3. サンプルプログラムの実行
- ※ 公式ページのディレクトリ構成は最新ファームと異なります.以下では,2014/10/26現在での最新ファームである,edison-weekly_build_68_2014-09-08_13-49-07 でのディレクトリ構成を基に話を進めます.
- この章ではサーモスタットプログラムを試してみましょう.
3-1. 利用するサンプルの概要と補足情報
いくつかの温度センサからのデータを受信するサーモスタットプログラムを試してみます.このプログラムは公式リファレンスでは以下のディレクトリにあるとされていますが,
- /usr/share/iotkit-comm-js/examples
現在のファームでは以下のディレクトリに移動しています.
- /usr/share/iotkit-comm/examples/node/distributed-thermostat
3-2. 温度センサの実行
$cd /usr/share/iotkit-comm/examples/node/distributed-thermostat # 温度センサの起動 $ node temperature-sensor.js # ターミナル上には特に何も出力されません.
3-3. サーモスタットの実行
$cd /usr/share/iotkit-comm/examples/node/distributed-thermostat # サーモスタットの起動 $ node thermostat.js
3-4. 動作の確認
サーモスタットと温度センサを同時に実行すると,温度センサ(temperature-sensor.js)から送信される温度データを,サーモスタット側(thermostat.js)で受信し,ターミナル上で以下の様な出力が得られます.
# 温度センサ1台数の時 Found new temperature sensor - 127.0.0.1:20408 Received sample temperature 90 from 127.0.0.1:20408 New average ambient temperature (cumulative): 45 Received sample temperature 79 from 127.0.0.1:20408 New average ambient temperature (cumulative): 56.333333333333336 Received sample temperature 67 from 127.0.0.1:20408 New average ambient temperature (cumulative): 59 Received sample temperature 83 from 127.0.0.1:20408 New average ambient temperature (cumulative): 63.8 Received sample temperature 72 from 127.0.0.1:20408 New average ambient temperature (cumulative): 65.16666666666667 Received sample temperature 62 from 127.0.0.1:20408 New average ambient temperature (cumulative): 64.71428571428571
新しいセンサが追加された際も,発見と通信が自動で行われます.
# 途中から温度センサを追加した時 # Found new temperature sensor という所で新しいセンサが検出されています eceived sample temperature 79 from 127.0.0.1:20408 New average ambient temperature (cumulative): 74.21212121212122 Received sample temperature 63 from 127.0.0.1:20408 New average ambient temperature (cumulative): 73.88235294117646 Received sample temperature 71 from 127.0.0.1:20408 New average ambient temperature (cumulative): 73.8 Found new temperature sensor - 127.0.0.1:54187 Received sample temperature 73 from 127.0.0.1:20408 New average ambient temperature (cumulative): 73.77777777777777 Received sample temperature 61 from 127.0.0.1:54187 New average ambient temperature (cumulative): 73.43243243243244 Received sample temperature 78 from 127.0.0.1:20408 New average ambient temperature (cumulative): 73.55263157894737 Received sample temperature 88 from 127.0.0.1:54187 New average ambient temperature (cumulative): 73.92307692307692
# 温度センサとサーモスタットプログラムをそれぞれ別のEdisonから実行した時. Received sample temperature 85 from 192.168.11.13:13304 New average ambient temperature (cumulative): 73.75862068965517 Received sample temperature 85 from 192.168.11.13:13304 New average ambient temperature (cumulative): 73.94915254237289 # さらにサーモスタットが動作するEdison上でも温度センサを動作させる Found new temperature sensor - 127.0.0.1:54453 Received sample temperature 90 from 192.168.11.13:13304 New average ambient temperature (cumulative): 74.21666666666667 Received sample temperature 64 from 127.0.0.1:54453 New average ambient temperature (cumulative): 74.04918032786885 Received sample temperature 87 from 192.168.11.13:13304 New average ambient temperature (cumulative): 74.25806451612904 Received sample temperature 71 from 127.0.0.1:54453 New average ambient temperature (cumulative): 74.2063492063492
4. もっと詳しいことを学ぶ
以下の様な手順で学んで行こう,とされています.後日追記予定.
- server の書き方
- client の書き方
- Service Specifications と queriesについて(重要)
- iotkit-commを使って分散アプリケーションを書く方法
- cloudにデータをPublishする方法
- iotkit-commを利用したソースのUnitテスト方法(未公開)
- iotkit-commアーキテクチャについて(未公開)
Intel EdisonのGetting startedその2.(Arduino IDEからの転送,Edison初期設定)
Getting Started Edison
このエントリは以下の2つの事項について説明します.
これも公式の訳+アルファです.
- 購入してからファームウェアを更新していない場合は,1つ前のエントリを参考にしてファームウェアの更新を行ってください.
step 1. Connectiong Edison
- 箱から出したedisonをボードに接続する.順番としては前回エントリのファームウェア更新よりも前ですね〜
step 2. Download Edison Arduino IDE
step 2-1. Edison 用Arduino IDEのインストール
step 2-2. テストとしてBlinkプログラムをEdisonへ書き込む
HWでのHello, World!であるBlink(LED点滅)プログラムを書き込みます.
- Arduino IDEを起動して,File -> Examples -> Basics -> Blink を開く
- Tools -> Board で”Intel Edison”を選択
Tools -> Serial Portで,”/dev/cu.usbmodemxxxx”を選択
- xxxx部分は各環境により異なります.
- ttyではなくcuのものを選択します.
IDE左上のチェックマークのアイコンをクリックしてビルドする
チェックマークアイコンの隣の矢印アイコンを押してEdisonへプログラムを転送する
- No, such file or directory というエラーが出たら指定しているSerial Portが間違っているので,3に戻ってSerial Portの選択を行います
Arduinoボード上のLEDが点滅すればOKです.
- Break out boardの場合は該当するGPIOにLEDつないで確認するのかな?未確認です!
Step 4. 初期設定(デバイス名,SSID名,パスワード,Wifi設定)
- edisonの設定を行うために,”configure_edison”というコマンドが提供されている.さらに,setupオプションを付けることで初期設定を一括でできる.
# 初期設定の実施 # configure_edison --setup # これで実行される設定は以下の3つ. # 1. デバイス名の設定.これはSSIDとしても利用されるようです. # 2. rootパスワードの設定.これはSSIDパスワードとしても利用されるようです. # 3. WiFiの設定.初回は失敗したけど,2回目でAPが見えるようになりました. # 最後に表示されるIPかURLを使ってブラウザからアクセスするとEdisonに関する情報が確認できます. # 各設定で間違えたら,以下の補足にあるようにconfigure_edisonコマンドのオプションを変えて実行しましょう.
補足
ちなみに,”configure_edison”コマンドのオプションは以下のようになっている.
# configure_edison --help usage: configure_edison [-h] [--server] [[--setup | --name | --password | --wifi] [--showWiFiIP | --version | --latest-version | --upgrade | --disableOneTimeSetup | --enableOneTimeSetup | --flash <version> [<release name> ...] | --showNames] optional arguments: -h, --help show this help message and exit --server Starts the server (testing only) --setup Goes through changing the device name, password, and wifi options --name Changes the device name --password Changes the device password --wifi Changes the wifi options --showWiFiIP IP address associated with the wireless interface --version Gets the current firmware version --latest-version Gets the latest firmware version --upgrade Downloads the latest firmware --disableOneTimeSetup Disable one-time setup and WiFi access point --enableOneTimeSetup Enable one-time setup and WiFi access point --flash <version> [<release name> ...] Downloads and flashes an image --showNames Show device name and SSID
wifi接続先を追加するときとか,Edisonの名前(SSID)変えたい時とかも使えますね.
例えばwifiの設定変更なら以下のようになります
# configure_edison --wifi
きたぞ!ぼくらのIntel Edison!けどファームが古いクソ野郎だったので更新する.
Edison,まあこういうデバイスの発売日としてはありがちで,ファームウェアが古い.
シリアルで送受信する文字のとりこぼしとかが気になる.
購入したらまずは新しいファームウェアを書き込むべきだと思う.
Edisonのファームをアップデートする.
- Intelのサポートページを参考にすれば良いです.
- 以下はサポートページの内容の訳.
step 1. Connecting Edison
step 2. Remove old images
- ターミナルを開き,以下のコマンドを順に実行します.
# Edisonのドライブを開く $ cd /Volumes/Edison # Edisonに入っている全てのファイルを削除(不可視ファイルも削除する). $ rm -rf * $ rm -rf \.* # lsして全てのファイルが消えていることを確認(何も表示されなければOK) $ ls
step 3. Download the latest image
step3-1. 下準備(ファイルシステムの変更)
出荷時にはEdisonのファイルフォーマットはFAT16に設定されています.MacではFAT16への書き込みができないため,ファイルシステムを変更します.
アプリケーションディレクトリ内のユーティリティディレクトリにある,ディスクユーティリティ.appを起動します.
- 左のカラムにある,”Linux File—CD Gadget Media”を選択.
- 右のカラムの,”消去(Partition)”タブの,”Format”を”MS-DOS(FAT)”に変更します
step3-2. イメージのダウンロードと展開
- Intel のサポートページから,”Edison Yocto complete image”をダウンロードし,解凍します.
- 解凍したディレクトリの中にある全てのファイルを,Edisonのドライブ(/Volumes/Edison)へコピーします.
step 4. Flashing Edison
- ターミナルを開き,以下のようにコマンドを入力し,実行します
# 以下のコマンドを入力し,Enterではなく,”tab”キーを押す. $ screen /dev/cu.usbserial # すると,以下のような形でコマンドの~usbserial以降が自動補完される # “A102GW3T”は各自の環境により異なります. $ screen /dev/cu.usbserial-A102GW3T # さらにボーレートをオプションとしてコマンドへ追加しEnterを押して実行. $ screen /dev/cu.usbserial-A102GW3T 115200 -L # screenコマンドを実行すると黒い画面が表示されるので,Enterを2回入力すると以下の様な文字が表示されます. > Poky (Yocto Project Reference Distro) 1.6 edison ttyMFD2 > edison login: # >edison loginの後に,”root”を入力しEnter > edison login: root # 再起動して,Edisonドライブへ展開したimageを書き込む(※ これを実行すると,以前に設定していた,userアカウント,パスワード,WiFiなどの設定は初期化されます) # 書き込みには3分くらいかかります.画面表示が止まっていても辛抱強く待ちましょう. # reboot ota
書き込みが成功すると,以下の画面のようにログイン画面が表示されます.
ちなみにバージョンの確認方法は以下
$ cat /etc/version > edison-weekly_build_68_2014-09-08_13-49-07 # 2014/10/26現在の最新ファームのバージョンです.
Punch Through の Light Blue Bean がようやっとやって来た!
タイトルのとおり,Punch Through のBeanがやって来た.
http://punchthrough.com/bean/
たぶんMakeかなんかを見て1年半くらい前に注文(投資)したと思うんだけど,ようやっと来た.
小さいしかわいい感じだし,スマホなんかのアプリと連携するシンプルなデバイスのプロトタイプ作るには良さそうだと思う.
で,こいつはArduino IDEからプログラム書き込めるんだけど,
その準備に微妙に手間取ってしまってだるい感じだった.
あとでまとめたい.
http://punchthrough.com/bean/getting-started/
注意点としてはざっくり3つあって,
1.Arduino IDEは1.0.5を使う
2.Arduino IDEを起動した状態でTeensyduinoとBean Loaderのプラグインを入れる.で,その後再起動
3.Bean Loaderは以下の写真のディレクトリにあるんだけど,特に気にする必要はなくて,ArduinoIDEで対象のマイコンボードをBeanにして,Verifyしてあげれば勝手に立ち上がる.
あと,Macから4台同時に見えることがなくって,どれか1台だけが見えてる状態が基本なんだけどこれなんなんだろう.
うちにはMacが3台あるんだけど,全部同じ状態.
こいつらBluetoothのヘッドホンも見えないし,Mac側のBluetoothが腐ってるんだろうか.
iPadからは全然問題なく4台同時に見えるし,ヘッドホンもつながる.
とてもだるい.