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

106
IoTハンズオン勉強会 ~センサーデータをクラウドに蓄積してみよう~ 2015年1月期AITCオープンラボ 2015/01/24 1

Upload: yasuyuki-sugai

Post on 16-Jul-2015

1.844 views

Category:

Technology


2 download

TRANSCRIPT

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

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

2015年1月期AITCオープンラボ

2015/01/241

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

自己紹介

•菅井康之     

•株式会社イーグル所属

•AITC運営委員会

•  &クラウドテクノロジー活用部会 サブリーダー

https://www.facebook.com/yasuyuki.sugai

よろしくお願いしまーす

2

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

はじめに・・・基本的にはスライドに沿って説明しながら進行していきますが、内容無視して自由にセンサー繋いだり、色々試していただいてもOKです!ガチの人は 後にこんなの作ってみたと発表してください!

何より楽しんでやりましょー!3

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

ハンズオンの目的★簡単なセンサーを用いてArduinoを使用した電子工作を体験します

★電子工作ということで、普段聞きなれない用語なども出てきますが、なるべく説明していく予定(つもり)です★複雑なことをやるよりも、理解を優先しています

★電子工作ってどんなものか、IoTも含めて雰囲気だけでもつかんでいただければと思います

4

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

今日の目標・・・★Arduinoのセンサー値をPCに取り込み、 終的にクラウドサービスにセンサー値を蓄積することを目標とします

★Arduinoから直接クラウドサービスに接続したい、という考えもありますが、Arduinoはセンサー値の収集に注力し、クラウドサービスとの通信はPCから行うことを予定しています★何でもかんでもArduinoで、、というわけではなく・・・★ センサーネットワーク(後述)をイメージした構成となります★割とArduinoからRaspberryPiなどのPCを経由する

構成にするケースが多いです★ PC(プログラム)でセンサー値を取り扱えれば、後は何とでも・・・

5

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

と、言い訳が多いですが一番の理由は・・・

6

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

ネットワーク系の部品の用意が難しい(高い)・・・ ボソッ

7

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

環境について★このスライドでは、以下のソフトウェアがインストールされていることを前提としています

• Arduino IDEhttp://arduino.cc/en/Main/Software

• Node.jshttp://nodejs.org/

8

Node.jsは安定板でお願いします2015年1月現在、開発版(v0.11)では動作しません安定板(v0.10)をインストールしてください

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

そもそも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

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

電子工作入門

10

電子工作入門とりあえずやってみよう

プログラムで読み込もう

クラウドに蓄積しよう リモート通信 自由時間

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

電子工作って?★大量生産を目的としない電子機器の設計や製作のことである(by Wikipedia)★小規模の実験・試作を行う、プロトタイピング的なもの (or 趣味)

★要は、アイデアを形にする★画面などの制約にとらわれず、現実のモノや

出来事に干渉できるようなアイデアを実現可能とする

11

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

どうやって作るの?★電子機器を繋いで回路を組み立てる★回路は電源の+から始まり、機器を経由して-に戻ってくる★輪っかを作成するようなイメージ

★Arduinoの登場により、複雑な回路を組まなくてもプログラムで制御することが可能になり、電子工作の敷居が下がった★ある程度の知識は必要だが、ネット上に回路が

アップされていることも★ブレッドボードによって、ハンダ付けが

必須じゃなくなったことも

12

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

Arduinoって?★マイコンの一種

http://www.arduino.cc/

★オープンソースハードウェア★2005年にイタリアで安価なプロトタイピング・システムを

製造することを目的にスタート★センサーなどによる環境の感知、アクチュエーターを

使用した環境への働きかけを行う★シリアル通信(UART)によって多くのソフトウェアと

連動可能★Makerブームの火付け役

13

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

プログラムが書けるって?★Arduino IDE

http://arduino.cc/en/Main/Software

★Windows, Mac, Linuxで動作(Javaで作成)★エディター, コンパイラ, 基盤への転送機能を

有する★ その他、シリアルポートによる基盤との双方向の通信が可能

★独自の言語(Arduino言語)★ Wiringから派生した、C言語風の構文で

基盤向けに 適化

★デバイスドライバーも含まれているので、まず 初にインストール

14

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

Arduino IDE

15

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

Arduinoで電子工作

★輪っかを作るように部品をつなぐことで、電子回路を組み立てる★基本的には・・・5V(or3.3V)から始まり、センサーを繋いでGNDに戻ってくる★5V(or3.3V)★ 常に5V(or3.3V)の電圧を出力するピン★ 電気の+側

★GND(グランド)★ 0V(終着点)のピン★ 大地に電気が流れていく(捨てられる)イメージ★ 電気の-側

16

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

どうやって回路は組み立てるの?★ ユニバーサル基盤★ 基板上に部品のピンをハンダによって接続する★ 部品と部品を繋ぐ(回路)のも、ハンダ(orスズメッキ線)で

一つ一つ繋いでいく★ 用途:製品用

★ プリント基板★ 基盤上に部品のピンをハンダによって接続する★ あらかじめ回路がプリントされているため、部品を接続するだけでOK★ ただし、自分で自由に回路を作成することは出来ない★ 用途:製品用

★ ブレッドボード★ 部品のピンを差し込むだけで接続できる★ 縦、横に回路がひかれているため、直線状にピンを接続することで、

回路を組み立てていく★ ハンダ付けが不要であるため、容易にトライ&エラーを

繰り返すことが出来る★ 実験やプロトタイピング用

Wikipedia:基盤

Wikipedia:プリント基板

Wikipedia:ブレッドボード

17

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

ブレッドボード★縦、または横一方向に回路が繋がっている★回路上にピンを刺して行くことで回路を組み立てる★一般的には・・・★ 横に繋がる赤い側に+を、青い側にーを刺す★ 縦に繋がる所にセンサーなどの部品を刺す★ 横のラインからジャンパーワイヤで電源を供給

省略・・・

18

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

ミニブレッドボード★縦一方向に回路が繋がっている★回路上にピンを刺して行くことで回路を組み立てる★ブレッドボードと出来ることは同じ

この辺りは実際に使って行くと感覚が分かります

19

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

とりあえずつないでみればいいのね?

★注意:部品が耐え切れない電流を流すと、壊れる可能性がある

★LEDが焼けきれてしまったり、Arduino側にも影響を及ぼすことも

20

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

抵抗★電流が強すぎる場合には、抵抗を入れることで電流を下げる

★抵抗は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

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

オームの法則★電流I (A) = 電圧E (V) / 抵抗R (Ω)★電圧E (V) = 抵抗R (Ω) * 電流I (A)★抵抗R (Ω) =電圧E (V) / 電流I (A)

22

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

色 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

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

抵抗 読み方

24

赤  赤  茶  金

2  2 10Ω ±5%

抵抗値: 220Ω誤差: ±5%

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

センサーの値ってどうとるの?★Arduinoでプログラムが書けるといっても、部品とのインタフェースは基本的には電圧となる

★0~5Vの電圧を変化させるor読み取ることで、制御することが可能★センサーへの入力として電圧を変化★センサーの出力を電圧で読み取る

★センサーの特性によって、デジタル値やアナログ値として扱う

25

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

デジタル?アナログ?★ デジタル★ 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

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

必要なもの★ジャンパワイヤー★ 部品の結線で使用

★ブレッドボード★ 部品の接続で使用

★抵抗★ 100Ω, 150Ω, 220Ω, 1KΩ 辺りがあれば大体事足りそう

★あった方がいいもの★LED★ 通電の確認で良く使用するので、あった方が良い

★ハンダ付けセット★ ピンヘッダがついていない部品もたまにあるので、

ハンダ付けが出来た方が良い★ トランジスタやコンデンサは慣れてきてから・・・

27

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

LEDや抵抗、ジャンパワイヤーはたくさん用意してあります※流行りの青色LEDはちょっとしかありません。。

28

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

他にも色々・・・念のためハンダ付けセットも

足りないものがあれば秋葉まで走ります29

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

とりあえずやってみよー

30

電子工作入門とりあえずやってみよう

プログラムで読み込もう

クラウドに蓄積しよう リモート通信 自由時間

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

LED接続★まずはArduinoにLEDを繋いで

光らせてみましょう

★線を繋ぐ前に・・・抵抗値を計算★ LEDは割と簡単に焼け切れてしまいます・・・

★LEDを電圧:2V, 電流:20mAとして、オームの法則から抵抗値を計算 ★ ※LEDはモノによって違うけど。。。

★抵抗R (Ω) = (Arduino:5V - LED:2V) / 0.02 = 150Ω★ ※Arduinoが5V、LEDが2Vなので、3Vの電圧で計算

31

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

LED接続★150Ωとジャンパ、LEDをブレッドボードにつないでいきます(次スライド参照)

★抵抗には向きは無いけど、LEDは向きがあるので注意★足の長い方が+側、足の短い方が-側

★ArduinoをUSBに接続して、5Vを流してみましょう★USB経由で電力を供給しているだけなので、

コードやセットアップなどは不要、つなげばOK32

+ー

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

LED接続

ブレッドボード ミニブレッドボード

33

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

LED接続

回路図

34

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

★スライドに記載している回路図や配線図はFritzingというアプリケーションを使用しています

http://fritzing.org/

★オープンソースの回路図作成アプリ★プリント基板のパターン図を作成し、実際に発注まで出来る★回路図やパターン図を公開したり、他の人が公開しているのを参照出来たり

回路図の作成について

35

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

Lチカ★LEDがついたら、次はLEDの照明をArduinoから制御してみましょう★通称:Lチカ

★ArduinoIDEのセットアップを行う必要があります★USB経由でシリアル通信でArduinoと通信するための設定

36

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

Lチカ何もセットアップしていないと、ArduinoIDEは真っ白な画面が表示されています

37

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

LチカまずはArduinoを認識させるため、シリアルポートを設定します 「ツール」 > 「シリアルポート」

※環境によって異なります Windowsの方は、デバイスマネージャーなどを ご確認ください

38

Windows: 'COMX'Mac: /dev/tty.usbmodemXXXX

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

LチカArduinoが正しい製品を指定されているか、確認します 「ツール」 > 「マイコンボード」

39

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

Lチカ★ Arduinoに書き込むプログラムを作成します★基本的にArduinoのコードは、setupメソッド、loopメソッドを

実装することで動作する★ setup: 初の一回のみ実行される、初期処理用★ loop: 繰り返し実行される、メイン処理用(delayを入れないと大変なことに)

★プログラムは次スライド参照

←白い所にプログラムを 書いて行きます

40

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

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

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

Lチカ★ Arduinoにプログラムを書き込みます★左上の→ボタンを押下すると、Arduinoにプログラムの書き込み

が行われます★プログラムを書き込んだ後は、PCは電力供給用でしかなくなる★電源さえあれば動作可能

(ただし、シリアル値を読み込む場合は別)

42

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

Lチカ★Arduinoは電源が供給されるとプログラムが

自動的に動き出す★前に書いた謎のプログラムが動いている可能性が

あるため、注意★久しぶりに使うデバイスや人のを借りた場合は、

プログラムを書き込んでから配線しましょう

★5Vの接続をやめて、デジタルピン(今回は8ピン)から電圧のON/OFF(5V/0V)を切り替えてみましょう•

5

43

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

Lチカ

ブレッドボード ミニブレッドボード

44

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

Lチカ

回路図

45

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

Lチカ アナログ出力編★ついたり消したりではなく、照明の明るさを

変えてみましょう

★5Vを全て流すのではなく、アナログ出力で流す電圧を調整します

★Arduinoでは、デジタルピンの3,5,6,9,10,11がアナログ出力(PWM)として使用可能(チルダでPWMの対応が示されている)★ PWM出力: HIGHとLOWを交互に繰り返すことで電圧を制御★ 通常のデジタルピンでも、交互にHIGH/LOWを繰り返すことで電圧を

制御することも可能(先ほどのLチカのdelayの間隔を短くするとLEDの明るさ調整が可能) ※ただ、正確にやるのは難しい・・・

46

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

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

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

Lチカ アナログ出力編

デジタル3ピンに差し替えるだけ

ミニブレッドボード 回路図

48

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

Lチカ まとめ★ここまでで配線をつなぎ、デジタル出力やアナログ出力を行ってきました

★アナログ出力とGNDが理解出来れば、カラーLEDなども容易に使いこなせます!★3ピンのLEDや4ピン(RGB)のLED(GND+2or3)

★次はセンサー値を読み取る前に、色々遊べるスイッチングをやってみます★プルダウン抵抗はたまに嵌りますので

49

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

参考:フルカラーLED

★ GND以外のピンに電流を流すとRGBに対応した色が発色する

★流す電流をアナログ出力にすると、RGBで(255,255,255)のカラーコードを指定できる

★情報の視覚的なアウトプットとして有効★ 赤:危険、エラー、青:正常 など

50

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

タクトスイッチ★タクトスイッチは、通常は片側のピンのみ回路が繋がっていますが、ボタンを押すことで全てのピンの回路が繋がります

★ボタンを押すと、LEDがつくタクトスイッチ版のLチカをやってみましょう

★ボタンが押されるとデジタルピンに電圧がかかるような回路を作って行きます•

51

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

タクトスイッチ★どうやってつなげば良いか?★なんとなくいけそうな回路★回路が繋がれば5Vが入力されるはず

•ミニブレッドボード 回路図

52

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

タクトスイッチ★回路が繋がっていないときが問題★入力ピンが何も繋がっていない(=オープン)状態では、電圧は安定しません★ノイズ的なものとか・・・

★繋がっていない場合の電圧が安定するよう、入力ピンをGNDに繋げる必要があります★入力ピンとGNDの間に抵抗を入れておけば、電流は流れやすい方に流れるので、回路が繋がったときに入力ピンに5V流れます•

53

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

タクトスイッチ

★いけてる回路★ちなみに、プルダウン抵抗と呼びます★同じ目的でプルアップ抵抗もありますが、今回は割愛

•ミニブレッドボード 回路図

54

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

タクトスイッチ★ここまで理解出来たら終わったも同然

★ボタンを押したときにLEDを光らせてみましょう

★ ちなみに、Arduinoでは内部にプルアップ抵抗を持っていますが、これまた割愛

•55

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

タクトスイッチ

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

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

タクトスイッチ

一見複雑そうに見えるけど、単純な回路

ミニブレッドボード 回路図

57

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

タクトスイッチ まとめ

★電圧は安定させるに限るという話でした

★人の行動をトリガーとしたインタラクションがあると色々遊べそうですね

★そろそろ次はセンサー値を扱っていきます•

58

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

照度センサー(フォトレジスタ)

★センサーは照度センサーのCdSセルを使用します★CdSセルは上面に照射される光の強さに応じて抵抗値が変化します★暗いと抵抗が高くなり、明るいと抵抗が低い★抵抗値の変化を読み取ることで、光の強さを識別

★センサー値はアナログ値として読み取ります★ ON/OFFのようなものではなく、値に意味があるため

★センサー値をシリアル出力で確認していきます59

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

照度センサー(フォトレジスタ)

#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

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

照度センサー(フォトレジスタ)

ブレッドボード ミニブレッドボード

61

CdSセルの向きは気にしないでOK

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

照度センサー(フォトレジスタ)

回路図

ちなみに、5Vと入力ピンの間にCdSセルを挟むだけでいけそうな気がしますが、それだけでは抵抗値が大きすぎて電圧が取れません。。。

この辺りは抵抗分割の法則による分圧回路を利用していますhttp://ja.wikipedia.org/wiki/%E5%88%86%E5%9C%A7%E5%9B%9E%E8%B7%AF

GND側に抵抗を設けて、入力ピンに分圧した電圧が流れるように大きめの抵抗を入れときます

62

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

照度センサー(フォトレジスタ)Arduinoから出力したシリアル値は、USBを経由してArduinoIDEのシリアルモニタで確認出来ます 「ツール」 > 「シリアルモニタ」

63

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

照度センサー(フォトレジスタ)シリアルモニタでは、Arduinoからの出力を確認する他に、Arduinoへシリアル入力を行うことも出来ます

シリアルモニタの右下のbaudの値はArduinoと合わせます

64

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

照度センサー まとめ★センサー値が取れましたか?

★CdSセルはレイヤーが低い部品のため、分圧とか若干めんどくさい話が出て来ましたが。。★ 近のセンサーは3ピンのものが増えてきたので、

接続するだけでセンサー値が取れるようになってきました★VDDピン, GNDピン, DATAピン(センサー値出力)★5VとGNDとアナログピンにつなぐだけ

★他のセンサーつないだり、照度センサーの値によってLEDを変化させるような回路を作ってみてください•

65

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

★Arduinoでは、Arduinoにかぶせて使うシールドというものもあります★回路を組まなくてもつなぐだけで使えるので、

とっても便利

★今日もサンプルでいくつか持って来てます★ XBeeシールド★ Xbee用(後述)

★ イーサネットシールド★ 有線LAN接続用

★ Groveシールド★ これとっても便利、Grove製のセンサーつけ放題

★ プロトタイプシールド★ Arduinoにハンダ付け

66

Arduino シールド

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

プログラムで読み込んでみよー

67

電子工作入門とりあえずやってみよう

プログラムで読み込もう

クラウドに蓄積しよう リモート通信 自由時間

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

★シリアル出力でセンサー値を確認することは出来たけど、Arduinoにだけ値があってもしょうがない・・・

★せっかくセンサー値が取れるなら利用したい★どこかに蓄積したり・・・★センサー値を分析したり・・・★閾値を設けたり・・・

センサー値とれたけど・・・

68

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

★Arduinoとシリアル通信するプログラムを書いて、センサー値を取り扱えるようにしよう

まずは・・・

69

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

★今回はNode.jsを使って、Arduinoからセンサー値を読み込みます

★シリアル通信が簡単に出来れば何でも良いのですが・・・★Node.jsにしたのは、比較的環境構築がしやすいのと、使えるライブラリが多い、という点もあり・・・★Node.jsからArduinoを操作することも可能になってきたので・・・

何を使おう?

70

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

★まず作業用のディレクトリを適当に作成します★例)★Windows: c:/iot★Mac: /User/xxx/iot

★Node.jsを操作する際には、黒い窓を触ります★Windows: コマンドプロンプト★Mac: ターミナル

Node.jsでシリアル通信

71

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

★必要なライブラリのインストール★Node.jsでシリアル通信するために「serialport」をインストールします

★コマンドプロント(or ターミナル)で作業ディレクトリに移動し、npmコマンドを実行します

Node.jsでシリアル通信

> cd 作業ディレクトリ> npm install serialport Windowsでエラーが発生した場合、

エラーメッセージに記載されているnpmフォルダを作成してから再実行してみてください

72

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

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

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

★Node.jsのプログラムを実行します★コマンドプロント(or ターミナル)で作業ディレクトリにいる状態で、下記コマンドを実行します

• ※シリアルモニタを閉じてから実行してください• シリアルポートが使われているとエラーになります

Node.jsでシリアル通信

> node step1.js

74

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

★簡単な手順でシリアル通信を行うプログラムを作成しました

★プログラムでセンサー値を読み込んだ後、何をするかはあなた次第!

まとめ

75

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

クラウドサービスに蓄積してみよー

76

電子工作入門とりあえずやってみよう

プログラムで読み込もう

クラウドに蓄積しよう リモート通信 自由時間

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

★センサーデータをクラウド上で永続化★センサーデータは膨大な量になるため、クラウドサービスを

利用して蓄積する★クラウド上に蓄積しておくと、後で分析するときにも楽★センサーデータ以外のデータとも組み合わせたり

★クラウドサービスも豊富に★センサーデータやストリーム通信を目的とした

クラウドサービスの増加

★センサーデータはストリーム通信が必須★センサーデータは毎秒発生するため、

いちいちコネクションはれない

クラウドへの蓄積(再掲)

77

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

★Plot.ly(https://plot.ly/)★ Web上でデータの可視化(グラフ描画など)を行えるサービス★ Streaming APIが用意されているため、

センサーデータをストリームでサーバ上にアップ出来る

★ Streaming APIでは、Web上でリアルタイムにグラフ描画が行われるので、センサーデータを単純にグラフ化したい場合はこれで充分かも

★永続性は無いので注意★ Rなどでデータを取り出すことも可能★無料なので、とりあえず使ってみましょ

今回使うのは・・・

78

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

https://plot.ly/streaming/

79

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

★まずはPlot.lyでアカウント作成します★アカウントの作成に抵抗がある場合は、用意したアカウントを使用していただきます

Plotly

80

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

★アカウントを作成し、ログイン後の右上のユーザ名のメニューから、「Subscription」を選択するとAPI Keyなどが表示されます

Plotly

81

★Streaming APIを使用する場合はTokenの発行も行います★ここで表示される内容を後のプログラムで書き換えて使用します

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

★必要なライブラリのインストール

★Node.jsでPlotlyと通信するために「plotly」をインストールします

★コマンドプロント(or ターミナル)で作業ディレクトリに移動し、npmコマンドを実行します

> cd 作業ディレクトリ> npm install plotly

82

Plotly

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

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

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

★前スライドのプログラムを作業ディレクトリに保存「step2.js」★ UsernameやAPI Key, Tokenは自分のアカウントの情報を・・・★あとportNameは前回同様に・・・

★コマンドプロント(or ターミナル)で作業ディレクトリにいる状態で、下記コマンドを実行します

> node step2.js

84

Plotly

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

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

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

★センサーデータがWeb上にリアルタイムに可視化出来るようになりました★外出先から家の温度などをモニタリングすることが出来ます

★蓄積したデータはプログラムで読み出すことも出来るので、Rなどで分析してみましょう

★色々構想が膨らみそうですね

まとめ

86

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

リモートでセンサー値を取得してみよー

87

電子工作入門とりあえずやってみよう

プログラムで読み込もう

クラウドに蓄積しよう

リモートで取得しよう 自由時間

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

おわび

88

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

部品が一つしかないので、全員は試せないかと思います。。。予めご了承ください。。。

89

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

★USB経由でセンサーデータを取得していたけど、PCが無いと計測できないなんて、そんなのセンサーじゃない

★センサーネットワーク★センサーデータを近距離の無線通信で収集する★ワイヤレスにすることで、センサーの設置場所の制約を軽

減出来る★なるべく省電力なものを採用★電力は貴重なリソースなので、通信部にあまり費やしたく

ない★近距離無線通信★ BLE, Zigbee, MQTT

センサーデータの収集(再掲)

90

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

★Xbeeモジュール (Zigbee規格)★省電力(データ量も少量)★スケーラブルなネットワーク構成★スター型、メッシュ型、ツリー型

★多くの機器がネットワークに参加可能

★通信するモジュールの情報を予め書き込んでおくことで、該当するモジュールへ情報の送信を行う★デバイスタイプ:★coodinator: 親機★router: 子機

今回使うのは・・・

91

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

★Xbeeのセットアップでは、X-CTUというアプリケーションから設定します

http://www.digi.com/support/productdetail?pid=3352★ USBでXbeeモジュールを接続し、セットアップする

★今回は予めモジュール設定済みのものを使用★ PCにUSB接続するモジュール側の設定★ Coodinator AT/透過モード

★ Arduinoモジュール側★ Router AT/透過モード•

Xbee

92

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

★ArduinoはXbeeのシールドをかぶせる形で接続

★PCはUSBでXbeeモジュールと接続★デバイスドライバはArduinoIDEに含まれています★Windowsの場合、自動認識ではインストール

されないので、個別にドライバの設定★そして何故か2回やらないと認識しない。。。。

★AT/透過モードに設定しているため、シリアル通信がそのままリモート通信となる★特別なプログラムを記述する必要がない

Xbee

93

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

★リモート通信や近距離無線と難しそうな単語が出て来ましたが、予想以上に簡単にリモート化を体感出来たかと思います

★シリアル通信を透過的に行っているため、USBで動作確認したものをプログラムそのままでリモート化できます

★これまた色々構想が膨らみそうですね

まとめ

94

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

番外編

95

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

★センサーデータをリアルタイムに分析したい★閾値を超えたら何かしたり・・・★より本格的な利用

★AWS Kinesis (http://aws.amazon.com/jp/kinesis/)★AWS上のリアルタイムデータ処理サービス★データの受け付けとデータを処理するための

ストリームがAWS上で提供されている

★あくまでストリーム基盤の提供であり、ストリームの受け付け先のサービスは自分で実装する

リアルタイムに処理がしたい

96

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

★Node.jsからAWSのKinesisを利用するサンプル★AWSの課金が発生するので、気をつけて使用してください

★1ヶ月ストリーム使うと・・・★ $0.0195 per provisioned shard-hour 744 ShardHour $14.51★ ※一ヶ月使用した実際の請求金額

Kinesisのサンプル

98

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

★必要なライブラリのインストール

★Node.jsでAWSのサービスを利用するために「aws-sdk」をインストールします

★コマンドプロント(or ターミナル)で作業ディレクトリに移動し、npmコマンドを実行します

Kinesisのサンプル

> cd 作業ディレクトリ> npm install aws-sdk

99

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

Kinesisのサンプル

{ "accessKeyId": "XXXXXX", "secretAccessKey": "XXXXXX", "region": "ap-northeast-1" }

config.jsonを用意

※自分の環境に合わせて、AWSのアカウント情報を設定

100

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

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のサンプル (書き込み)

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

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のサンプル (読み込み)

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

104

好きなセンサーや、LEDなどを組み合わせて何か作ってみてください

後に出来た作品を是非発表してください

電子工作入門とりあえずやってみよう

プログラムで読み込もう

クラウドに蓄積しよう

リモートで取得しよう 自由時間

☆★自由時間☆★

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

•Let’s have Fun!! :)

•105

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

•fin...Zzz...zzz...

106