IoTハンズオン勉強会
~センサーデータをクラウドに蓄積してみよう~
2015年1月期AITCオープンラボ
2015/01/24
1
自己紹介
•菅井康之     
•株式会社イーグル所属
•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 IDE
http://arduino.cc/en/Main/Software
• Node.js
http://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経由で電力を供給しているだけなので、
コードやセットアップなどは不要、つなげばOK
32
+ー
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 3
int 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 0
void 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.usbmodemXXXX
var sp = new serialport.SerialPort(portName, {
baudRate: 9600,
dataBits: 8,
parity: 'none',
stopBits: 1,
flowControl: false,
parser: serialport.parsers.readline("rn")
});
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
https://plot.ly/streaming/
79
★まずは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("rn")
});
// helper function to get a nicely formatted date string
function 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/2
2/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("rn")
});
// data from Serial port
var lastData = 0;
sp.on('data', function(input) {
console.log(input);
lastData = input;
});
// helper function to get a nicely formatted date string
function 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-five
http://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

IoTハンズオン勉強会 「センサーデータをクラウドに蓄積してみよう」