iotハンズオン勉強会 「センサーデータをクラウドに蓄積してみよう」
TRANSCRIPT
IoTハンズオン勉強会~センサーデータをクラウドに蓄積してみよう~
2015年1月期AITCオープンラボ
2015/01/241
自己紹介
•菅井康之
•株式会社イーグル所属
•AITC運営委員会
• &クラウドテクノロジー活用部会 サブリーダー
•
https://www.facebook.com/yasuyuki.sugai
よろしくお願いしまーす
2
はじめに・・・基本的にはスライドに沿って説明しながら進行していきますが、内容無視して自由にセンサー繋いだり、色々試していただいてもOKです!ガチの人は 後にこんなの作ってみたと発表してください!
何より楽しんでやりましょー!3
ハンズオンの目的★簡単なセンサーを用いてArduinoを使用した電子工作を体験します
★電子工作ということで、普段聞きなれない用語なども出てきますが、なるべく説明していく予定(つもり)です★複雑なことをやるよりも、理解を優先しています
★電子工作ってどんなものか、IoTも含めて雰囲気だけでもつかんでいただければと思います
4
今日の目標・・・★Arduinoのセンサー値をPCに取り込み、 終的にクラウドサービスにセンサー値を蓄積することを目標とします
★Arduinoから直接クラウドサービスに接続したい、という考えもありますが、Arduinoはセンサー値の収集に注力し、クラウドサービスとの通信はPCから行うことを予定しています★何でもかんでもArduinoで、、というわけではなく・・・★ センサーネットワーク(後述)をイメージした構成となります★割とArduinoからRaspberryPiなどのPCを経由する
構成にするケースが多いです★ PC(プログラム)でセンサー値を取り扱えれば、後は何とでも・・・
5
と、言い訳が多いですが一番の理由は・・・
6
ネットワーク系の部品の用意が難しい(高い)・・・ ボソッ
7
環境について★このスライドでは、以下のソフトウェアがインストールされていることを前提としています
• Arduino IDEhttp://arduino.cc/en/Main/Software
• Node.jshttp://nodejs.org/
8
Node.jsは安定板でお願いします2015年1月現在、開発版(v0.11)では動作しません安定板(v0.10)をインストールしてください
そもそもIoTって・・・★ IoTとは何ぞや・・・という部分については過去の勉強会資料を
ご参照ください!
★ 第一回 IoT勉強会★ IoT概論:
http://www.slideshare.net/dsuket/iotvol1-iot★ IoTを実現する技術:
https://www.dropbox.com/s/385fw858ep3wh31/IoT%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B%E6%8A%80%E8%A1%93.pdf
★ 国内外の事例紹介: http://www.slideshare.net/yasuyukijinnouchi/aitc-open-labiot20141117
★ とりあえずIoT的なものを作ってみた:http://www.slideshare.net/yasuyukisugai/iot-41780126
★ 第二回IoT勉強会★ IoTデバイス Intel Edison編
http://www.slideshare.net/yasuyukisugai/iotiot-intel-Edison★ littleBitsとIFTTTで超お手軽IoTクッキング
http://www.slideshare.net/yasuyukisugai/iot-42756830
9
電子工作入門
10
電子工作入門とりあえずやってみよう
プログラムで読み込もう
クラウドに蓄積しよう リモート通信 自由時間
電子工作って?★大量生産を目的としない電子機器の設計や製作のことである(by Wikipedia)★小規模の実験・試作を行う、プロトタイピング的なもの (or 趣味)
★要は、アイデアを形にする★画面などの制約にとらわれず、現実のモノや
出来事に干渉できるようなアイデアを実現可能とする
11
どうやって作るの?★電子機器を繋いで回路を組み立てる★回路は電源の+から始まり、機器を経由して-に戻ってくる★輪っかを作成するようなイメージ
★Arduinoの登場により、複雑な回路を組まなくてもプログラムで制御することが可能になり、電子工作の敷居が下がった★ある程度の知識は必要だが、ネット上に回路が
アップされていることも★ブレッドボードによって、ハンダ付けが
必須じゃなくなったことも
12
Arduinoって?★マイコンの一種
http://www.arduino.cc/
★オープンソースハードウェア★2005年にイタリアで安価なプロトタイピング・システムを
製造することを目的にスタート★センサーなどによる環境の感知、アクチュエーターを
使用した環境への働きかけを行う★シリアル通信(UART)によって多くのソフトウェアと
連動可能★Makerブームの火付け役
13
プログラムが書けるって?★Arduino IDE
http://arduino.cc/en/Main/Software
★Windows, Mac, Linuxで動作(Javaで作成)★エディター, コンパイラ, 基盤への転送機能を
有する★ その他、シリアルポートによる基盤との双方向の通信が可能
★独自の言語(Arduino言語)★ Wiringから派生した、C言語風の構文で
基盤向けに 適化
★デバイスドライバーも含まれているので、まず 初にインストール
14
Arduino IDE
15
Arduinoで電子工作
★輪っかを作るように部品をつなぐことで、電子回路を組み立てる★基本的には・・・5V(or3.3V)から始まり、センサーを繋いでGNDに戻ってくる★5V(or3.3V)★ 常に5V(or3.3V)の電圧を出力するピン★ 電気の+側
★GND(グランド)★ 0V(終着点)のピン★ 大地に電気が流れていく(捨てられる)イメージ★ 電気の-側
16
どうやって回路は組み立てるの?★ ユニバーサル基盤★ 基板上に部品のピンをハンダによって接続する★ 部品と部品を繋ぐ(回路)のも、ハンダ(orスズメッキ線)で
一つ一つ繋いでいく★ 用途:製品用
★ プリント基板★ 基盤上に部品のピンをハンダによって接続する★ あらかじめ回路がプリントされているため、部品を接続するだけでOK★ ただし、自分で自由に回路を作成することは出来ない★ 用途:製品用
★ ブレッドボード★ 部品のピンを差し込むだけで接続できる★ 縦、横に回路がひかれているため、直線状にピンを接続することで、
回路を組み立てていく★ ハンダ付けが不要であるため、容易にトライ&エラーを
繰り返すことが出来る★ 実験やプロトタイピング用
Wikipedia:基盤
Wikipedia:プリント基板
Wikipedia:ブレッドボード
17
ブレッドボード★縦、または横一方向に回路が繋がっている★回路上にピンを刺して行くことで回路を組み立てる★一般的には・・・★ 横に繋がる赤い側に+を、青い側にーを刺す★ 縦に繋がる所にセンサーなどの部品を刺す★ 横のラインからジャンパーワイヤで電源を供給
★
省略・・・
18
ミニブレッドボード★縦一方向に回路が繋がっている★回路上にピンを刺して行くことで回路を組み立てる★ブレッドボードと出来ることは同じ
★
この辺りは実際に使って行くと感覚が分かります
19
とりあえずつないでみればいいのね?
★注意:部品が耐え切れない電流を流すと、壊れる可能性がある
★LEDが焼けきれてしまったり、Arduino側にも影響を及ぼすことも
•
20
抵抗★電流が強すぎる場合には、抵抗を入れることで電流を下げる
★抵抗は4色の色を見ることで、抵抗値が判別可能★ 1桁(1本目) + 2桁(2本目) * 桁数(3本目) 4本目:誤差
★オームの法則に従い、抵抗値を計算して抵抗を入れる★抵抗値ピッタリの抵抗を使用するのではなく、下記に示す抵抗
値で近いものを使用するのが一般的★良く使う抵抗値:E6系列 (1, 1.5, 2.2, 3.3, 4.7, 6.8, 820) *
(1Ω, 10Ω ... 1MΩ)★ 4本目(誤差)は金色が一般的?
21
オームの法則★電流I (A) = 電圧E (V) / 抵抗R (Ω)★電圧E (V) = 抵抗R (Ω) * 電流I (A)★抵抗R (Ω) =電圧E (V) / 電流I (A)
22
色 1桁(1本目) 2桁(2本目) 桁数(3本目) 誤差(4本目)黒 0 0 * 1Ω -
茶 1 1 * 10Ω ±1%
赤 2 2 * 100Ω ±2%
橙 3 3 * 1KΩ ±0.05%
黄 4 4 * 10KΩ -
緑 5 5 * 100KΩ ±0.5%
青 6 6 * 1MΩ ±0.25%
紫 7 7 - ±0.1%
灰 8 8 - -
白 9 9 - -
金 - - * 0.1Ω ±5%
銀 - - * 0.01Ω ±10%
無色 - - - ±20%
抵抗カラーコード
23
抵抗 読み方
24
赤 赤 茶 金
2 2 10Ω ±5%
抵抗値: 220Ω誤差: ±5%
センサーの値ってどうとるの?★Arduinoでプログラムが書けるといっても、部品とのインタフェースは基本的には電圧となる
★0~5Vの電圧を変化させるor読み取ることで、制御することが可能★センサーへの入力として電圧を変化★センサーの出力を電圧で読み取る
★センサーの特性によって、デジタル値やアナログ値として扱う
25
デジタル?アナログ?★ デジタル★ 0/1の2値を入出力で扱う★ 0V or 5V / LOW or HIGH / TRUE or FALSE
★ 入力★ 0V~3V未満: LOW、3V以上:HIGH として扱う★ タクトスイッチなどを利用した回路の接続状態による、スイッチングなどで利用
★ 出力★ LOW: 0V、 HIGH: 5V★ 電圧のON/OFF制御など、スイッチングなどで利用
★ アナログ★ 入力★ 0~1023の1024段階の値を扱う(電圧の0V~5Vを1024分割)★ センサ値(温度、照度、音量)などの読み取りで利用
★ 出力(PWM)★ 0~255の256段階の値を扱う(電圧の0V~5Vを256分割)★ LEDの明るさや、部品の値調整などで利用
★ Arduinoがアナログ値<-->数値の変換をしてくれる(ADコンバータ)
26
必要なもの★ジャンパワイヤー★ 部品の結線で使用
★ブレッドボード★ 部品の接続で使用
★抵抗★ 100Ω, 150Ω, 220Ω, 1KΩ 辺りがあれば大体事足りそう
★あった方がいいもの★LED★ 通電の確認で良く使用するので、あった方が良い
★ハンダ付けセット★ ピンヘッダがついていない部品もたまにあるので、
ハンダ付けが出来た方が良い★ トランジスタやコンデンサは慣れてきてから・・・
27
LEDや抵抗、ジャンパワイヤーはたくさん用意してあります※流行りの青色LEDはちょっとしかありません。。
28
他にも色々・・・念のためハンダ付けセットも
足りないものがあれば秋葉まで走ります29
とりあえずやってみよー
30
電子工作入門とりあえずやってみよう
プログラムで読み込もう
クラウドに蓄積しよう リモート通信 自由時間
LED接続★まずはArduinoにLEDを繋いで
光らせてみましょう
★線を繋ぐ前に・・・抵抗値を計算★ LEDは割と簡単に焼け切れてしまいます・・・
★LEDを電圧:2V, 電流:20mAとして、オームの法則から抵抗値を計算 ★ ※LEDはモノによって違うけど。。。
★抵抗R (Ω) = (Arduino:5V - LED:2V) / 0.02 = 150Ω★ ※Arduinoが5V、LEDが2Vなので、3Vの電圧で計算
•
31
LED接続★150Ωとジャンパ、LEDをブレッドボードにつないでいきます(次スライド参照)
★抵抗には向きは無いけど、LEDは向きがあるので注意★足の長い方が+側、足の短い方が-側
★ArduinoをUSBに接続して、5Vを流してみましょう★USB経由で電力を供給しているだけなので、
コードやセットアップなどは不要、つなげばOK32
+ー
LED接続
ブレッドボード ミニブレッドボード
33
LED接続
回路図
34
★スライドに記載している回路図や配線図はFritzingというアプリケーションを使用しています
http://fritzing.org/
★オープンソースの回路図作成アプリ★プリント基板のパターン図を作成し、実際に発注まで出来る★回路図やパターン図を公開したり、他の人が公開しているのを参照出来たり
回路図の作成について
35
Lチカ★LEDがついたら、次はLEDの照明をArduinoから制御してみましょう★通称:Lチカ
★ArduinoIDEのセットアップを行う必要があります★USB経由でシリアル通信でArduinoと通信するための設定
•
36
Lチカ何もセットアップしていないと、ArduinoIDEは真っ白な画面が表示されています
37
LチカまずはArduinoを認識させるため、シリアルポートを設定します 「ツール」 > 「シリアルポート」
※環境によって異なります Windowsの方は、デバイスマネージャーなどを ご確認ください
38
Windows: 'COMX'Mac: /dev/tty.usbmodemXXXX
LチカArduinoが正しい製品を指定されているか、確認します 「ツール」 > 「マイコンボード」
39
Lチカ★ Arduinoに書き込むプログラムを作成します★基本的にArduinoのコードは、setupメソッド、loopメソッドを
実装することで動作する★ setup: 初の一回のみ実行される、初期処理用★ loop: 繰り返し実行される、メイン処理用(delayを入れないと大変なことに)
★プログラムは次スライド参照
•
←白い所にプログラムを 書いて行きます
40
Lチカ
•
#define LED_OUTPUT 8
void setup() { pinMode(LED_OUTPUT, OUTPUT);}
void loop() { digitalWrite(LED_OUTPUT, HIGH); delay(1000); digitalWrite(LED_OUTPUT, LOW); delay(1000);}
•#define LED_OUTPUT 8•変数の定義•8という数字に変数名割り当て
•pinMode(LED_OUTPUT, OUTPUT); •Digitalの8Pinを出力に設定•デフォルトでは入力となるため、モードの切り替え
•digitalWrite(LED_OUTPUT, HIGH);•Digitalの8Pinから5Vを出力•HIGH = ON
•digitalWrite(LED_OUTPUT, LOW);•Digitalの8Pinから0Vを出力•LOW = OFF
サンプルプログラム
41
Lチカ★ Arduinoにプログラムを書き込みます★左上の→ボタンを押下すると、Arduinoにプログラムの書き込み
が行われます★プログラムを書き込んだ後は、PCは電力供給用でしかなくなる★電源さえあれば動作可能
(ただし、シリアル値を読み込む場合は別)
•
42
Lチカ★Arduinoは電源が供給されるとプログラムが
自動的に動き出す★前に書いた謎のプログラムが動いている可能性が
あるため、注意★久しぶりに使うデバイスや人のを借りた場合は、
プログラムを書き込んでから配線しましょう
★5Vの接続をやめて、デジタルピン(今回は8ピン)から電圧のON/OFF(5V/0V)を切り替えてみましょう•
5
43
Lチカ
ブレッドボード ミニブレッドボード
44
Lチカ
回路図
45
Lチカ アナログ出力編★ついたり消したりではなく、照明の明るさを
変えてみましょう
★5Vを全て流すのではなく、アナログ出力で流す電圧を調整します
★Arduinoでは、デジタルピンの3,5,6,9,10,11がアナログ出力(PWM)として使用可能(チルダでPWMの対応が示されている)★ PWM出力: HIGHとLOWを交互に繰り返すことで電圧を制御★ 通常のデジタルピンでも、交互にHIGH/LOWを繰り返すことで電圧を
制御することも可能(先ほどのLチカのdelayの間隔を短くするとLEDの明るさ調整が可能) ※ただ、正確にやるのは難しい・・・
46
Lチカ アナログ出力編
•
#define LED_OUTPUT 3int value = 0;
void setup() {
}
void loop() { if(value > 255) { value = 0; } analogWrite(LED_OUTPUT, value); value += 50;
delay(1000);}
•#define LED_OUTPUT 3•変数の定義•3という数字に変数名割り当て
•int value = 0;•LEDに出力するアナログ値用の変数
•if(value > 255) {•アナログ出力は255までなので、255を超えたら0に戻る
•analogWrite(LED_OUTPUT, value);•3ピンからアナログ出力•valueの所を0から255の数字に変えてみてもOK
•value += 50;•valueの値を50増加
サンプルプログラム
47
Lチカ アナログ出力編
デジタル3ピンに差し替えるだけ
ミニブレッドボード 回路図
48
Lチカ まとめ★ここまでで配線をつなぎ、デジタル出力やアナログ出力を行ってきました
★アナログ出力とGNDが理解出来れば、カラーLEDなども容易に使いこなせます!★3ピンのLEDや4ピン(RGB)のLED(GND+2or3)
★次はセンサー値を読み取る前に、色々遊べるスイッチングをやってみます★プルダウン抵抗はたまに嵌りますので
49
参考:フルカラーLED
★ GND以外のピンに電流を流すとRGBに対応した色が発色する
★流す電流をアナログ出力にすると、RGBで(255,255,255)のカラーコードを指定できる
★情報の視覚的なアウトプットとして有効★ 赤:危険、エラー、青:正常 など
50
タクトスイッチ★タクトスイッチは、通常は片側のピンのみ回路が繋がっていますが、ボタンを押すことで全てのピンの回路が繋がります
★ボタンを押すと、LEDがつくタクトスイッチ版のLチカをやってみましょう
★ボタンが押されるとデジタルピンに電圧がかかるような回路を作って行きます•
51
タクトスイッチ★どうやってつなげば良いか?★なんとなくいけそうな回路★回路が繋がれば5Vが入力されるはず
•ミニブレッドボード 回路図
52
タクトスイッチ★回路が繋がっていないときが問題★入力ピンが何も繋がっていない(=オープン)状態では、電圧は安定しません★ノイズ的なものとか・・・
★繋がっていない場合の電圧が安定するよう、入力ピンをGNDに繋げる必要があります★入力ピンとGNDの間に抵抗を入れておけば、電流は流れやすい方に流れるので、回路が繋がったときに入力ピンに5V流れます•
53
タクトスイッチ
★いけてる回路★ちなみに、プルダウン抵抗と呼びます★同じ目的でプルアップ抵抗もありますが、今回は割愛
•ミニブレッドボード 回路図
54
タクトスイッチ★ここまで理解出来たら終わったも同然
★ボタンを押したときにLEDを光らせてみましょう
★ ちなみに、Arduinoでは内部にプルアップ抵抗を持っていますが、これまた割愛
•55
タクトスイッチ
•
void setup() { pinMode(8, INPUT); pinMode(3, OUTPUT);}
void loop() {
digitalWrite(3, digitalRead(8));
//same as... //if(digitalRead(8) == HIGH) { // digitalWrite(3, HIGH); //} else { // digitalWrite(3, LOW); //} delay(10);}
•pinMode(8, INPUT);•8ピンを入力用にモード切り替え
•pinMode(3, OUTPUT);•3ピンを出力用にモード切り替え
•digitalWrite(3, digitalRead(8));•8ピンがHIGHの場合、3ピンをHIGHに•8ピンがLOWの場合、3ピンもLOWに
サンプルプログラム
56
タクトスイッチ
一見複雑そうに見えるけど、単純な回路
ミニブレッドボード 回路図
57
タクトスイッチ まとめ
★電圧は安定させるに限るという話でした
★人の行動をトリガーとしたインタラクションがあると色々遊べそうですね
★そろそろ次はセンサー値を扱っていきます•
58
照度センサー(フォトレジスタ)
★センサーは照度センサーのCdSセルを使用します★CdSセルは上面に照射される光の強さに応じて抵抗値が変化します★暗いと抵抗が高くなり、明るいと抵抗が低い★抵抗値の変化を読み取ることで、光の強さを識別
★センサー値はアナログ値として読み取ります★ ON/OFFのようなものではなく、値に意味があるため
★センサー値をシリアル出力で確認していきます59
照度センサー(フォトレジスタ)
•
#define CDS_INPUT 0void setup() { Serial.begin(9600);}
void loop() {
int value = analogRead(CDS_INPUT); Serial.println(value); delay(1000);}
•Serial.begin(9600)•シリアル通信用の設定•9600: bitの送信レート(BaudRate)
•int value = analogRead(CDS_INPUT);•アナログの0ピンからアナログ値を読み込み
•Serial.println(value);•センサー値をシリアル出力(改行含む)
サンプルプログラム
60
照度センサー(フォトレジスタ)
ブレッドボード ミニブレッドボード
61
CdSセルの向きは気にしないでOK
照度センサー(フォトレジスタ)
回路図
ちなみに、5Vと入力ピンの間にCdSセルを挟むだけでいけそうな気がしますが、それだけでは抵抗値が大きすぎて電圧が取れません。。。
この辺りは抵抗分割の法則による分圧回路を利用していますhttp://ja.wikipedia.org/wiki/%E5%88%86%E5%9C%A7%E5%9B%9E%E8%B7%AF
GND側に抵抗を設けて、入力ピンに分圧した電圧が流れるように大きめの抵抗を入れときます
62
照度センサー(フォトレジスタ)Arduinoから出力したシリアル値は、USBを経由してArduinoIDEのシリアルモニタで確認出来ます 「ツール」 > 「シリアルモニタ」
63
照度センサー(フォトレジスタ)シリアルモニタでは、Arduinoからの出力を確認する他に、Arduinoへシリアル入力を行うことも出来ます
シリアルモニタの右下のbaudの値はArduinoと合わせます
64
照度センサー まとめ★センサー値が取れましたか?
★CdSセルはレイヤーが低い部品のため、分圧とか若干めんどくさい話が出て来ましたが。。★ 近のセンサーは3ピンのものが増えてきたので、
接続するだけでセンサー値が取れるようになってきました★VDDピン, GNDピン, DATAピン(センサー値出力)★5VとGNDとアナログピンにつなぐだけ
★他のセンサーつないだり、照度センサーの値によってLEDを変化させるような回路を作ってみてください•
65
★Arduinoでは、Arduinoにかぶせて使うシールドというものもあります★回路を組まなくてもつなぐだけで使えるので、
とっても便利
★今日もサンプルでいくつか持って来てます★ XBeeシールド★ Xbee用(後述)
★ イーサネットシールド★ 有線LAN接続用
★ Groveシールド★ これとっても便利、Grove製のセンサーつけ放題
★ プロトタイプシールド★ Arduinoにハンダ付け
66
Arduino シールド
プログラムで読み込んでみよー
67
電子工作入門とりあえずやってみよう
プログラムで読み込もう
クラウドに蓄積しよう リモート通信 自由時間
★シリアル出力でセンサー値を確認することは出来たけど、Arduinoにだけ値があってもしょうがない・・・
★せっかくセンサー値が取れるなら利用したい★どこかに蓄積したり・・・★センサー値を分析したり・・・★閾値を設けたり・・・
センサー値とれたけど・・・
68
★Arduinoとシリアル通信するプログラムを書いて、センサー値を取り扱えるようにしよう
まずは・・・
69
★今回はNode.jsを使って、Arduinoからセンサー値を読み込みます
★シリアル通信が簡単に出来れば何でも良いのですが・・・★Node.jsにしたのは、比較的環境構築がしやすいのと、使えるライブラリが多い、という点もあり・・・★Node.jsからArduinoを操作することも可能になってきたので・・・
何を使おう?
70
★まず作業用のディレクトリを適当に作成します★例)★Windows: c:/iot★Mac: /User/xxx/iot
★Node.jsを操作する際には、黒い窓を触ります★Windows: コマンドプロンプト★Mac: ターミナル
Node.jsでシリアル通信
71
★必要なライブラリのインストール★Node.jsでシリアル通信するために「serialport」をインストールします
★コマンドプロント(or ターミナル)で作業ディレクトリに移動し、npmコマンドを実行します
•
Node.jsでシリアル通信
> cd 作業ディレクトリ> npm install serialport Windowsでエラーが発生した場合、
エラーメッセージに記載されているnpmフォルダを作成してから再実行してみてください
72
Node.jsでシリアル通信
•
var serialport = require('serialport'); var portName = 'COMXX'; //Windows// Mac: /dev/tty.usbmodemXXXXvar sp = new serialport.SerialPort(portName, { baudRate: 9600, dataBits: 8, parity: 'none', stopBits: 1, flowControl: false, parser: serialport.parsers.readline("\r\n")});
sp.on('data', function(input) { console.log(input);});
•テキストエディタ(メモ帳など)でプログラムを作業ディレクトリに保存•とりあえずファイル名は「step1.js」
•portNameのところは、環境に合わせて書き換える•Arduinoが接続しているポート•ArduinoIDEのシリアルポートと同じ値
•改行コードもたまに違うかも。。•駄目な場合、\nに修正
サンプルプログラム
73
★Node.jsのプログラムを実行します★コマンドプロント(or ターミナル)で作業ディレクトリにいる状態で、下記コマンドを実行します
• ※シリアルモニタを閉じてから実行してください• シリアルポートが使われているとエラーになります
Node.jsでシリアル通信
> node step1.js
74
★簡単な手順でシリアル通信を行うプログラムを作成しました
★プログラムでセンサー値を読み込んだ後、何をするかはあなた次第!
まとめ
75
クラウドサービスに蓄積してみよー
76
電子工作入門とりあえずやってみよう
プログラムで読み込もう
クラウドに蓄積しよう リモート通信 自由時間
★センサーデータをクラウド上で永続化★センサーデータは膨大な量になるため、クラウドサービスを
利用して蓄積する★クラウド上に蓄積しておくと、後で分析するときにも楽★センサーデータ以外のデータとも組み合わせたり
★クラウドサービスも豊富に★センサーデータやストリーム通信を目的とした
クラウドサービスの増加
★センサーデータはストリーム通信が必須★センサーデータは毎秒発生するため、
いちいちコネクションはれない
クラウドへの蓄積(再掲)
77
★Plot.ly(https://plot.ly/)★ Web上でデータの可視化(グラフ描画など)を行えるサービス★ Streaming APIが用意されているため、
センサーデータをストリームでサーバ上にアップ出来る
★ Streaming APIでは、Web上でリアルタイムにグラフ描画が行われるので、センサーデータを単純にグラフ化したい場合はこれで充分かも
★永続性は無いので注意★ Rなどでデータを取り出すことも可能★無料なので、とりあえず使ってみましょ
今回使うのは・・・
78
★まずはPlot.lyでアカウント作成します★アカウントの作成に抵抗がある場合は、用意したアカウントを使用していただきます
Plotly
80
★アカウントを作成し、ログイン後の右上のユーザ名のメニューから、「Subscription」を選択するとAPI Keyなどが表示されます
Plotly
81
★Streaming APIを使用する場合はTokenの発行も行います★ここで表示される内容を後のプログラムで書き換えて使用します
★必要なライブラリのインストール
★Node.jsでPlotlyと通信するために「plotly」をインストールします
★コマンドプロント(or ターミナル)で作業ディレクトリに移動し、npmコマンドを実行します
•
> cd 作業ディレクトリ> npm install plotly
82
Plotly
•
var serialport = require('serialport') , plotly = require('plotly')('Username','API Key') , token = 'Streaming API Your token'; var portName = '/dev/tty.usbmodemfd121'; var sp = new serialport.SerialPort(portName, { baudRate: 9600, dataBits: 8, parity: 'none', stopBits: 1, flowControl: false, parser: serialport.parsers.readline("\r\n")});
// helper function to get a nicely formatted date stringfunction getDateString() { var time = new Date().getTime(); // 32400000 is (GMT+9 Japan) // for your timezone just multiply +/-GMT by 36000000 var datestr = new Date(time + 32400000).toISOString().replace(/T/, ' ').replace(/Z/, ''); return datestr;}
サンプルプログラム
var initdata = [{x:[], y:[], stream:{token:token, maxpoints:500}}];var initlayout = {fileopt : "extend", filename : "sensor-test"};
plotly.plot(initdata, initlayout, function (err, msg) { if (err) return console.log(err)
console.log(msg); var stream = plotly.stream(token, function (err, res) { console.log(err, res); });
sp.on('data', function(input) { if(isNaN(input) || input > 1023) return; var streamObject = JSON.stringify({ x : getDateString(), y : input }); console.log(streamObject); stream.write(streamObject+'\n'); });});
1/22/2
※一つのファイルです83
Plotly
★前スライドのプログラムを作業ディレクトリに保存「step2.js」★ UsernameやAPI Key, Tokenは自分のアカウントの情報を・・・★あとportNameは前回同様に・・・
★コマンドプロント(or ターミナル)で作業ディレクトリにいる状態で、下記コマンドを実行します
•
> node step2.js
84
Plotly
•
Macintosh:iot sugawi$ node step2.js{ streamstatus: 'All Streams Go!', url: 'https://plot.ly/~sugai/33', message: '', warning: '', filename: 'sensor-test', error: '' }{"x":"2015-01-23 22:52:01.385","y":"49"}{"x":"2015-01-23 22:52:02.384","y":"31"}{"x":"2015-01-23 22:52:03.383","y":"33"}{"x":"2015-01-23 22:52:04.386","y":"35"}{"x":"2015-01-23 22:52:05.385","y":"34"}{"x":"2015-01-23 22:52:06.384","y":"32"}:(省略)
サンプルプログラム 実行イメージ
PlotlyのサイトからWorkspace(https://plot.ly/plot)を確認するか、
実行結果に出力されるurl先を見ると、リアルタイムに変化する様子が確認出来ます
実行結果のurlは他人と共有することも出来ます
85
Plotly
★センサーデータがWeb上にリアルタイムに可視化出来るようになりました★外出先から家の温度などをモニタリングすることが出来ます
★蓄積したデータはプログラムで読み出すことも出来るので、Rなどで分析してみましょう
★色々構想が膨らみそうですね
まとめ
86
リモートでセンサー値を取得してみよー
87
電子工作入門とりあえずやってみよう
プログラムで読み込もう
クラウドに蓄積しよう
リモートで取得しよう 自由時間
おわび
88
部品が一つしかないので、全員は試せないかと思います。。。予めご了承ください。。。
89
★USB経由でセンサーデータを取得していたけど、PCが無いと計測できないなんて、そんなのセンサーじゃない
★センサーネットワーク★センサーデータを近距離の無線通信で収集する★ワイヤレスにすることで、センサーの設置場所の制約を軽
減出来る★なるべく省電力なものを採用★電力は貴重なリソースなので、通信部にあまり費やしたく
ない★近距離無線通信★ BLE, Zigbee, MQTT
センサーデータの収集(再掲)
90
★Xbeeモジュール (Zigbee規格)★省電力(データ量も少量)★スケーラブルなネットワーク構成★スター型、メッシュ型、ツリー型
★多くの機器がネットワークに参加可能
★通信するモジュールの情報を予め書き込んでおくことで、該当するモジュールへ情報の送信を行う★デバイスタイプ:★coodinator: 親機★router: 子機
今回使うのは・・・
91
★Xbeeのセットアップでは、X-CTUというアプリケーションから設定します
http://www.digi.com/support/productdetail?pid=3352★ USBでXbeeモジュールを接続し、セットアップする
★今回は予めモジュール設定済みのものを使用★ PCにUSB接続するモジュール側の設定★ Coodinator AT/透過モード
★ Arduinoモジュール側★ Router AT/透過モード•
Xbee
92
★ArduinoはXbeeのシールドをかぶせる形で接続
★PCはUSBでXbeeモジュールと接続★デバイスドライバはArduinoIDEに含まれています★Windowsの場合、自動認識ではインストール
されないので、個別にドライバの設定★そして何故か2回やらないと認識しない。。。。
★AT/透過モードに設定しているため、シリアル通信がそのままリモート通信となる★特別なプログラムを記述する必要がない
Xbee
93
★リモート通信や近距離無線と難しそうな単語が出て来ましたが、予想以上に簡単にリモート化を体感出来たかと思います
★シリアル通信を透過的に行っているため、USBで動作確認したものをプログラムそのままでリモート化できます
★これまた色々構想が膨らみそうですね
まとめ
94
番外編
95
★センサーデータをリアルタイムに分析したい★閾値を超えたら何かしたり・・・★より本格的な利用
★AWS Kinesis (http://aws.amazon.com/jp/kinesis/)★AWS上のリアルタイムデータ処理サービス★データの受け付けとデータを処理するための
ストリームがAWS上で提供されている
★あくまでストリーム基盤の提供であり、ストリームの受け付け先のサービスは自分で実装する
•
リアルタイムに処理がしたい
96
https://www.gosquared.com/blog/kinesis-demo-aws-reinvent-2013
97
★Node.jsからAWSのKinesisを利用するサンプル★AWSの課金が発生するので、気をつけて使用してください
★1ヶ月ストリーム使うと・・・★ $0.0195 per provisioned shard-hour 744 ShardHour $14.51★ ※一ヶ月使用した実際の請求金額
•
Kinesisのサンプル
98
★必要なライブラリのインストール
★Node.jsでAWSのサービスを利用するために「aws-sdk」をインストールします
★コマンドプロント(or ターミナル)で作業ディレクトリに移動し、npmコマンドを実行します
•
Kinesisのサンプル
> cd 作業ディレクトリ> npm install aws-sdk
99
Kinesisのサンプル
•
{ "accessKeyId": "XXXXXX", "secretAccessKey": "XXXXXX", "region": "ap-northeast-1" }
config.jsonを用意
※自分の環境に合わせて、AWSのアカウント情報を設定
100
•
var serialport = require('serialport') , AWS = require('aws-sdk');
var portName = 'XXXXXX';var sp = new serialport.SerialPort(portName, { baudRate: 9600, databits: 8, parity: 'none', stopBits: 1, flowControl: false, parser: serialport.parsers.readline("\r\n")});// data from Serial portvar lastData = 0;sp.on('data', function(input) { console.log(input); lastData = input;});// helper function to get a nicely formatted date stringfunction getDateString() { var time = new Date().getTime(); // 32400000 is (GMT+9 Japan) // for your timezone just multiply +/-GMT by 36000000 var datestr = new Date(time + 32400000).toISOString().replace(/T/, ' ').replace(/Z/, ''); return datestr;}
サンプルプログラムAWS.config.loadFromPath('./config.json');var kinesis = new AWS.Kinesis();var kinesisloop = setInterval(function () { if(lastData == 0) { return; }
var dt = new Date(); var params = { Data: new Buffer(JSON.stringify({ x : getDateString(), y : lastData })).toString('base64'), PartitionKey: 'test_key', StreamName: 'sensor-test' };
kinesis.putRecord(params, function(err, data) { if(err) console.log(err, err.stack); else console.log(data); }); }, 5000);
1/2
2/2
※一つのファイルです
101
Kinesisのサンプル (書き込み)
•
var AWS = require('aws-sdk') , base64_decode = require('base64').decode;
AWS.config.loadFromPath('./config.json');var kinesis = new AWS.Kinesis();var describeParams = { StreamName: 'sensor-test', Limit: 1000};
kinesis.describeStream(describeParams, function(err, data) { if(err) console.log(err, err.stack); else console.log(data);
var shardParams = { ShardId: data.StreamDescription.Shards[0].ShardId, ShardIteratorType: 'LATEST', StreamName: data.StreamDescription.StreamName };
var getRecords = function(shardIterator) { var getParams = { ShardIterator: shardIterator, Limit: 1000 };
サンプルプログラム kinesis.getRecords(getParams, function(err, data) { if (err) return console.log(err, err.stack); // an error occurred
console.log(data); if (data['Records'].length > 0) { for (var i in data['Records']) { var js = JSON.parse(base64_decode(new Buffer(data['Records'][i]['Data'] || '', 'base64').toString('utf8'))); console.log(js.y); } }
getRecords(data['NextShardIterator']); });};
kinesis.getShardIterator(shardParams, function(err, data) { if(err) console.log(err, err.stack); else console.log(data);
getRecords(data.ShardIterator);
});
1/2
2/2
※一つのファイルです
102
Kinesisのサンプル (読み込み)
★Node.jsから直接Arduinoを操作することも可能★ブラウザからの操作も可能に★Web of Things??
★johnny-fivehttp://www.instructables.com/id/Javascript-robotics-and-browser-based-Arduino-cont/?ALLSTEPS
★ここまで資料作成が手がまわらず。。。
Node.jsからArduinoを操作
103
104
好きなセンサーや、LEDなどを組み合わせて何か作ってみてください
後に出来た作品を是非発表してください
電子工作入門とりあえずやってみよう
プログラムで読み込もう
クラウドに蓄積しよう
リモートで取得しよう 自由時間
☆★自由時間☆★
•Let’s have Fun!! :)
•105
•fin...Zzz...zzz...
106