Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

7,639 views

Published on

第3回 IoT勉強会(ハンズオン) 〜 センサーデータをクラウドに蓄積してみよう! 〜

Published in: Technology
  • Be the first to comment

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

  1. 1. IoTハンズオン勉強会 ~センサーデータをクラウドに蓄積してみよう~ 2015年1月期AITCオープンラボ 2015/01/24 1
  2. 2. 自己紹介 •菅井康之      •株式会社イーグル所属 •AITC運営委員会 •  &クラウドテクノロジー活用部会 サブリーダー • https://www.facebook.com/yasuyuki.sugai よろしくお願いしまーす 2
  3. 3. はじめに・・・ 基本的にはスライドに沿って 説明しながら進行していきますが、 内容無視して自由にセンサー 繋いだり、色々試していただいても OKです! ガチの人は最後にこんなの 作ってみたと発表してください! 何より楽しんでやりましょー! 3
  4. 4. ハンズオンの目的 ★簡単なセンサーを用いてArduinoを使用した 電子工作を体験します ★電子工作ということで、普段聞きなれない 用語なども出てきますが、なるべく説明して いく予定(つもり)です ★ 複雑なことをやるよりも、理解を優先しています ★電子工作ってどんなものか、IoTも含めて 雰囲気だけでもつかんでいただければと思い ます 4
  5. 5. 今日の目標・・・ ★Arduinoのセンサー値をPCに取り込み、最終的に クラウドサービスにセンサー値を蓄積することを 目標とします ★Arduinoから直接クラウドサービスに接続したい、 という考えもありますが、Arduinoはセンサー値の 収集に注力し、クラウドサービスとの通信は PCから行うことを予定しています ★ 何でもかんでもArduinoで、、というわけではなく・・・ ★ センサーネットワーク(後述)をイメージした構成となります ★ 割とArduinoからRaspberryPiなどのPCを経由する 構成にするケースが多いです ★ PC(プログラム)でセンサー値を取り扱えれば、後は何とでも・・・ 5
  6. 6. と、言い訳が多いですが 一番の理由は・・・ 6
  7. 7. ネットワーク系の部品の用意が難しい(高い)・・・ ボソッ 7
  8. 8. 環境について ★このスライドでは、以下のソフトウェアが インストールされていることを前提としていま す • Arduino IDE http://arduino.cc/en/Main/Software • Node.js http://nodejs.org/ 8 Node.jsは安定板でお願いします 2015年1月現在、開発版(v0.11)では動作しません 安定板(v0.10)をインストールしてください
  9. 9. そもそも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. 10. 電子工作入門 10 電子工作入門 とりあえず やってみよう プログラムで 読み込もう クラウドに 蓄積しよう リモート通信 自由時間
  11. 11. 電子工作って? ★大量生産を目的としない電子機器の 設計や製作のことである(by Wikipedia) ★小規模の実験・試作を行う、 プロトタイピング的なもの (or 趣味) ★要は、アイデアを形にする ★画面などの制約にとらわれず、現実のモノや 出来事に干渉できるようなアイデアを 実現可能とする 11
  12. 12. どうやって作るの? ★電子機器を繋いで回路を組み立てる ★ 回路は電源の+から始まり、機器を経由して-に戻ってくる ★ 輪っかを作成するようなイメージ ★Arduinoの登場により、複雑な回路を 組まなくてもプログラムで制御することが 可能になり、電子工作の敷居が下がった ★ ある程度の知識は必要だが、ネット上に回路が アップされていることも ★ ブレッドボードによって、ハンダ付けが 必須じゃなくなったことも 12
  13. 13. Arduinoって? ★マイコンの一種 http://www.arduino.cc/ ★ オープンソースハードウェア ★ 2005年にイタリアで安価なプロトタイピング・システムを 製造することを目的にスタート ★ センサーなどによる環境の感知、アクチュエーターを 使用した環境への働きかけを行う ★ シリアル通信(UART)によって多くのソフトウェアと 連動可能 ★ Makerブームの火付け役 13
  14. 14. プログラムが書けるって? ★Arduino IDE http://arduino.cc/en/Main/Software ★Windows, Mac, Linuxで動作(Javaで作成) ★エディター, コンパイラ, 基盤への転送機能を 有する ★ その他、シリアルポートによる基盤との双方向の通信が可能 ★独自の言語(Arduino言語) ★ Wiringから派生した、C言語風の構文で 基盤向けに最適化 ★デバイスドライバーも含まれているので、 まず最初にインストール 14
  15. 15. Arduino IDE 15
  16. 16. Arduinoで電子工作 ★輪っかを作るように部品をつなぐことで、 電子回路を組み立てる ★基本的には・・・5V(or3.3V)から始まり、 センサーを繋いでGNDに戻ってくる ★5V(or3.3V) ★ 常に5V(or3.3V)の電圧を出力するピン ★ 電気の+側 ★GND(グランド) ★ 0V(終着点)のピン ★ 大地に電気が流れていく(捨てられる)イメージ ★ 電気の-側 16
  17. 17. どうやって回路は組み立てるの? ★ ユニバーサル基盤 ★ 基板上に部品のピンをハンダによって接続する ★ 部品と部品を繋ぐ(回路)のも、ハンダ(orスズメッキ線)で 一つ一つ繋いでいく ★ 用途:製品用 ★ プリント基板 ★ 基盤上に部品のピンをハンダによって接続する ★ あらかじめ回路がプリントされているため、部品を接続するだけでOK ★ ただし、自分で自由に回路を作成することは出来ない ★ 用途:製品用 ★ ブレッドボード ★ 部品のピンを差し込むだけで接続できる ★ 縦、横に回路がひかれているため、直線状にピンを接続することで、 回路を組み立てていく ★ ハンダ付けが不要であるため、容易にトライ&エラーを 繰り返すことが出来る ★ 実験やプロトタイピング用 Wikipedia:基盤 Wikipedia:プリント基板 Wikipedia:ブレッドボード 17
  18. 18. ブレッドボード ★縦、または横一方向に回路が繋がっている ★回路上にピンを刺して行くことで回路を組み立てる ★一般的には・・・ ★ 横に繋がる赤い側に+を、青い側にーを刺す ★ 縦に繋がる所にセンサーなどの部品を刺す ★ 横のラインからジャンパーワイヤで電源を供給 ★ 省略・・・ 18
  19. 19. ミニブレッドボード ★縦一方向に回路が繋がっている ★回路上にピンを刺して行くことで回路を 組み立てる ★ブレッドボードと出来ることは同じ ★ この辺りは実際に使って行くと 感覚が分かります 19
  20. 20. とりあえずつないでみればいいのね? ★注意:部品が耐え切れない電流を 流すと、壊れる可能性がある ★LEDが焼けきれてしまったり、Arduino側にも 影響を及ぼすことも • 20
  21. 21. 抵抗 ★電流が強すぎる場合には、抵抗を入れることで 電流を下げる ★抵抗は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
  22. 22. オームの法則 ★電流I (A) = 電圧E (V) / 抵抗R (Ω) ★電圧E (V) = 抵抗R (Ω) * 電流I (A) ★抵抗R (Ω) =電圧E (V) / 電流I (A) 22
  23. 23. 色 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. 24. 抵抗 読み方 24 赤  赤  茶  金 2  2 10Ω ±5% 抵抗値: 220Ω 誤差: ±5%
  25. 25. センサーの値ってどうとるの? ★Arduinoでプログラムが書けるといっても、 部品とのインタフェースは基本的には 電圧となる ★0~5Vの電圧を変化させるor読み取ること で、制御することが可能 ★ センサーへの入力として電圧を変化 ★ センサーの出力を電圧で読み取る ★センサーの特性によって、デジタル値や アナログ値として扱う 25
  26. 26. デジタル?アナログ? ★ デジタル ★ 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
  27. 27. 必要なもの ★ジャンパワイヤー ★ 部品の結線で使用 ★ブレッドボード ★ 部品の接続で使用 ★抵抗 ★ 100Ω, 150Ω, 220Ω, 1KΩ 辺りがあれば大体事足りそう ★あった方がいいもの ★LED ★ 通電の確認で良く使用するので、あった方が良い ★ハンダ付けセット ★ ピンヘッダがついていない部品もたまにあるので、 ハンダ付けが出来た方が良い ★ トランジスタやコンデンサは慣れてきてから・・・ 27
  28. 28. LEDや抵抗、ジャンパワイヤーは たくさん用意してあります ※流行りの青色LEDは ちょっとしかありません。。28
  29. 29. 他にも色々・・・ 念のためハンダ付けセットも 足りないものがあれば秋葉まで走ります 29
  30. 30. とりあえずやってみよー 30 電子工作入門 とりあえず やってみよう プログラムで 読み込もう クラウドに 蓄積しよう リモート通信 自由時間
  31. 31. LED接続 ★ まずはArduinoにLEDを繋いで 光らせてみましょう ★ 線を繋ぐ前に・・・抵抗値を計算 ★ LEDは割と簡単に焼け切れてしまいます・・・ ★ LEDを電圧:2V, 電流:20mAとして、オームの法則から 抵抗値を計算 ★ ※LEDはモノによって違うけど。。。 ★ 抵抗R (Ω) = (Arduino:5V - LED:2V) / 0.02 = 150Ω ★ ※Arduinoが5V、LEDが2Vなので、3Vの電圧で計算 • 31
  32. 32. LED接続 ★150Ωとジャンパ、LEDをブレッドボードにつ ないでいきます(次スライド参照) ★抵抗には向きは無いけど、 LEDは向きがあるので注意 ★ 足の長い方が+側、足の短い方が-側 ★ArduinoをUSBに接続して、5Vを流してみま しょう ★ USB経由で電力を供給しているだけなので、 コードやセットアップなどは不要、つなげばOK 32 +ー
  33. 33. LED接続 ブレッドボード ミニブレッドボード 33
  34. 34. LED接続 回路図 34
  35. 35. ★スライドに記載している回路図や配線図 はFritzingというアプリケーションを使用し ています http://fritzing.org/ ★オープンソースの回路図作成アプリ ★プリント基板のパターン図を作成し、 実際に発注まで出来る ★回路図やパターン図を公開したり、 他の人が公開しているのを参照出来たり 回路図の作成について 35
  36. 36. Lチカ ★LEDがついたら、次はLEDの照明を Arduinoから制御してみましょう ★通称:Lチカ ★ArduinoIDEのセットアップを行う必要があります ★USB経由でシリアル通信でArduinoと通信する ための設定 • 36
  37. 37. Lチカ 何もセットアップしていないと、ArduinoIDEは 真っ白な画面が表示されています 37
  38. 38. Lチカ まずはArduinoを認識させるため、シリアルポートを 設定します  「ツール」 > 「シリアルポート」 ※環境によって異なります  Windowsの方は、デバイスマネージャーなどを  ご確認ください 38 Windows: 'COMX' Mac: /dev/tty.usbmodemXXXX
  39. 39. Lチカ Arduinoが正しい製品を指定されているか、 確認します  「ツール」 > 「マイコンボード」 39
  40. 40. Lチカ ★ Arduinoに書き込むプログラムを作成します ★ 基本的にArduinoのコードは、setupメソッド、loopメソッドを 実装することで動作する ★ setup: 最初の一回のみ実行される、初期処理用 ★ loop: 繰り返し実行される、メイン処理用(delayを入れないと大変なことに) ★ プログラムは次スライド参照 • ←白い所にプログラムを  書いて行きます 40
  41. 41. 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
  42. 42. Lチカ ★ Arduinoにプログラムを書き込みます ★ 左上の→ボタンを押下すると、Arduinoにプログラムの書き込み が行われます ★ プログラムを書き込んだ後は、PCは電力供給用でしかなくなる ★ 電源さえあれば動作可能 (ただし、シリアル値を読み込む場合は別) • 42
  43. 43. Lチカ ★Arduinoは電源が供給されるとプログラムが 自動的に動き出す ★前に書いた謎のプログラムが動いている可能性が あるため、注意 ★久しぶりに使うデバイスや人のを借りた場合は、 プログラムを書き込んでから配線しましょう ★5Vの接続をやめて、デジタルピン(今回は8ピン)から 電圧のON/OFF(5V/0V)を切り替えてみましょう • 5 43
  44. 44. Lチカ ブレッドボード ミニブレッドボード 44
  45. 45. Lチカ 回路図 45
  46. 46. Lチカ アナログ出力編 ★ついたり消したりではなく、照明の明るさを 変えてみましょう ★5Vを全て流すのではなく、アナログ出力で流す電圧を 調整します ★Arduinoでは、デジタルピンの3,5,6,9,10,11が アナログ出力(PWM)として使用可能 (チルダでPWMの対応が示されている) ★ PWM出力: HIGHとLOWを交互に繰り返すことで電圧を制御 ★ 通常のデジタルピンでも、交互にHIGH/LOWを繰り返すことで電圧を 制御することも可能(先ほどのLチカのdelayの間隔を短くするとLED の明るさ調整が可能) ※ただ、正確にやるのは難しい・・・ 46
  47. 47. 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
  48. 48. Lチカ アナログ出力編 デジタル3ピンに差し替えるだけ ミニブレッドボード 回路図 48
  49. 49. Lチカ まとめ ★ここまでで配線をつなぎ、デジタル出力や アナログ出力を行ってきました ★アナログ出力とGNDが理解出来れば、 カラーLEDなども容易に使いこなせます! ★3ピンのLEDや4ピン(RGB)のLED(GND+2or3) ★次はセンサー値を読み取る前に、 色々遊べるスイッチングをやってみます ★プルダウン抵抗はたまに嵌りますので 49
  50. 50. 参考:フルカラーLED ★ GND以外のピンに電流を流すと RGBに対応した色が発色する ★ 流す電流をアナログ出力にすると、RGBで(255,255,255)の カラーコードを指定できる ★ 情報の視覚的なアウトプットとして有効 ★ 赤:危険、エラー、青:正常 など 50
  51. 51. タクトスイッチ ★タクトスイッチは、通常は片側の ピンのみ回路が繋がっていますが、 ボタンを押すことで全てのピンの 回路が繋がります ★ボタンを押すと、LEDがつく タクトスイッチ版のLチカをやってみましょう ★ボタンが押されるとデジタルピンに 電圧がかかるような回路を作って行きます • 51
  52. 52. タクトスイッチ ★どうやってつなげば良いか? ★なんとなくいけそうな回路 ★回路が繋がれば5Vが入力されるはず •ミニブレッドボード 回路図 52
  53. 53. タクトスイッチ ★回路が繋がっていないときが問題 ★入力ピンが何も繋がっていない(=オープン) 状態では、電圧は安定しません ★ノイズ的なものとか・・・ ★繋がっていない場合の電圧が安定するよう、 入力ピンをGNDに繋げる必要があります ★入力ピンとGNDの間に抵抗を入れておけば、 電流は流れやすい方に流れるので、 回路が繋がったときに入力ピンに5V流れます • 53
  54. 54. タクトスイッチ ★いけてる回路 ★ちなみに、プルダウン抵抗と呼びます ★同じ目的でプルアップ抵抗もありますが、今回は割愛 •ミニブレッドボード 回路図 54
  55. 55. タクトスイッチ ★ここまで理解出来たら終わったも 同然 ★ボタンを押したときにLEDを 光らせてみましょう ★ ちなみに、Arduinoでは内部にプルアップ抵抗を持っていますが、これまた割愛 • 55
  56. 56. タクトスイッチ • 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. 57. タクトスイッチ 一見複雑そうに見えるけど、単純な回路 ミニブレッドボード 回路図 57
  58. 58. タクトスイッチ まとめ ★電圧は安定させるに限るという 話でした ★人の行動をトリガーとした インタラクションがあると 色々遊べそうですね ★そろそろ次はセンサー値を扱っていきます • 58
  59. 59. 照度センサー(フォトレジスタ) ★センサーは照度センサーの CdSセルを使用します ★CdSセルは上面に照射される 光の強さに応じて抵抗値が変化します ★ 暗いと抵抗が高くなり、明るいと抵抗が低い ★ 抵抗値の変化を読み取ることで、光の強さを識別 ★センサー値はアナログ値として読み取ります ★ ON/OFFのようなものではなく、値に意味があるため ★センサー値をシリアル出力で確認していきます 59
  60. 60. 照度センサー(フォトレジスタ) • #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. 61. 照度センサー(フォトレジスタ) ブレッドボード ミニブレッドボード 61 CdSセルの向きは気にしないでOK
  62. 62. 照度センサー(フォトレジスタ) 回路図 ちなみに、5Vと入力ピンの間に CdSセルを挟むだけでいけそうな 気がしますが、それだけでは 抵抗値が大きすぎて電圧が 取れません。。。 この辺りは抵抗分割の法則による 分圧回路を利用しています http://ja.wikipedia.org/wiki/%E5%88%86%E5%9C %A7%E5%9B%9E%E8%B7%AF GND側に抵抗を設けて、入力ピンに 分圧した電圧が流れるように 大きめの抵抗を入れときます 62
  63. 63. 照度センサー(フォトレジスタ) Arduinoから出力したシリアル値は、USBを 経由してArduinoIDEのシリアルモニタで 確認出来ます  「ツール」 > 「シリアルモニタ」 63
  64. 64. 照度センサー(フォトレジスタ) シリアルモニタでは、Arduinoからの出力を 確認する他に、Arduinoへシリアル入力を 行うことも出来ます シリアルモニタの右下の baudの値はArduinoと 合わせます 64
  65. 65. 照度センサー まとめ ★センサー値が取れましたか? ★CdSセルはレイヤーが低い部品のため、 分圧とか若干めんどくさい話が出て来ましたが。。 ★最近のセンサーは3ピンのものが増えてきたので、 接続するだけでセンサー値が取れるように なってきました ★VDDピン, GNDピン, DATAピン(センサー値出力) ★5VとGNDとアナログピンにつなぐだけ ★他のセンサーつないだり、照度センサーの値によって LEDを変化させるような回路を作ってみてください • 65
  66. 66. ★Arduinoでは、Arduinoにかぶせて使う シールドというものもあります ★回路を組まなくてもつなぐだけで使えるので、 とっても便利 ★今日もサンプルでいくつか持って来てます ★ XBeeシールド ★ Xbee用(後述) ★ イーサネットシールド ★ 有線LAN接続用 ★ Groveシールド ★ これとっても便利、Grove製のセンサーつけ放題 ★ プロトタイプシールド ★ Arduinoにハンダ付け 66 Arduino シールド
  67. 67. プログラムで 読み込んでみよー 67 電子工作入門 とりあえず やってみよう プログラムで 読み込もう クラウドに 蓄積しよう リモート通信 自由時間
  68. 68. ★シリアル出力でセンサー値を 確認することは出来たけど、 Arduinoにだけ値があっても しょうがない・・・ ★せっかくセンサー値が取れるなら 利用したい ★どこかに蓄積したり・・・ ★センサー値を分析したり・・・ ★閾値を設けたり・・・ センサー値とれたけど・・・ 68
  69. 69. ★Arduinoとシリアル通信する プログラムを書いて、センサー値を 取り扱えるようにしよう まずは・・・ 69
  70. 70. ★今回はNode.jsを使って、Arduinoから センサー値を読み込みます ★シリアル通信が簡単に出来れば何でも 良いのですが・・・ ★Node.jsにしたのは、比較的環境構築が しやすいのと、使えるライブラリが多い、 という点もあり・・・ ★Node.jsからArduinoを操作することも 可能になってきたので・・・ 何を使おう? 70
  71. 71. ★まず作業用のディレクトリを適当に作 成します ★例) ★Windows: c:/iot ★Mac: /User/xxx/iot ★Node.jsを操作する際には、黒い窓を 触ります ★Windows: コマンドプロンプト ★Mac: ターミナル Node.jsでシリアル通信 71
  72. 72. ★必要なライブラリのインストール ★Node.jsでシリアル通信するために 「serialport」をインストールします ★コマンドプロント(or ターミナル)で 作業ディレクトリに移動し、npmコマンドを 実行します • Node.jsでシリアル通信 > cd 作業ディレクトリ > npm install serialport Windowsでエラーが発生した場合、 エラーメッセージに記載されている npmフォルダを作成してから再実行 してみてください 72
  73. 73. 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
  74. 74. ★Node.jsのプログラムを実行します ★コマンドプロント(or ターミナル)で 作業ディレクトリにいる状態で、 下記コマンドを実行します • ※シリアルモニタを閉じてから実行してください • シリアルポートが使われているとエラーになります Node.jsでシリアル通信 > node step1.js 74
  75. 75. ★簡単な手順でシリアル通信を 行うプログラムを作成しました ★プログラムでセンサー値を 読み込んだ後、何をするかは あなた次第! まとめ 75
  76. 76. クラウドサービスに 蓄積してみよー 76 電子工作入門 とりあえず やってみよう プログラムで 読み込もう クラウドに 蓄積しよう リモート通信 自由時間
  77. 77. ★センサーデータをクラウド上で永続化 ★ センサーデータは膨大な量になるため、クラウドサービスを 利用して蓄積する ★ クラウド上に蓄積しておくと、後で分析するときにも楽 ★ センサーデータ以外のデータとも組み合わせたり ★クラウドサービスも豊富に ★ センサーデータやストリーム通信を目的とした クラウドサービスの増加 ★センサーデータはストリーム通信が必須 ★ センサーデータは毎秒発生するため、 いちいちコネクションはれない クラウドへの蓄積(再掲) 77
  78. 78. ★ Plot.ly(https://plot.ly/) ★ Web上でデータの可視化(グラフ描画など)を行えるサービス ★ Streaming APIが用意されているため、 センサーデータをストリームでサーバ上にアップ出来る ★ Streaming APIでは、Web上でリアルタイムに グラフ描画が行われるので、センサーデータを 単純にグラフ化したい場合はこれで充分かも ★ 永続性は無いので注意 ★ Rなどでデータを取り出すことも可能 ★ 無料なので、とりあえず使ってみましょ 今回使うのは・・・ 78
  79. 79. https://plot.ly/streaming/ 79
  80. 80. ★まずはPlot.lyでアカウント作成します ★アカウントの作成に抵抗がある場合は、 用意したアカウントを使用していただきます Plotly 80
  81. 81. ★アカウントを作成し、ログイン後の右上の ユーザ名のメニューから、「Subscription」を 選択するとAPI Keyなどが表示されます Plotly 81 ★Streaming APIを使用す る場合はTokenの発行も 行います ★ここで表示される内容を 後のプログラムで 書き換えて使用します
  82. 82. ★必要なライブラリのインストール ★Node.jsでPlotlyと通信するために「plotly」を インストールします ★コマンドプロント(or ターミナル)で作業ディレ クトリに移動し、npmコマンドを実行します • > cd 作業ディレクトリ > npm install plotly 82 Plotly
  83. 83. • 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
  84. 84. ★前スライドのプログラムを 作業ディレクトリに保存「step2.js」 ★ UsernameやAPI Key, Tokenは自分のアカウントの情報を・・・ ★ あとportNameは前回同様に・・・ ★コマンドプロント(or ターミナル)で 作業ディレクトリにいる状態で、 下記コマンドを実行します • > node step2.js 84 Plotly
  85. 85. • 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
  86. 86. ★センサーデータがWeb上にリアルタイムに 可視化出来るようになりました ★外出先から家の温度などを モニタリングすることが出来ます ★蓄積したデータはプログラムで 読み出すことも出来るので、 Rなどで分析してみましょう ★色々構想が膨らみそうですね まとめ 86
  87. 87. リモートでセンサー値を 取得してみよー 87 電子工作入門 とりあえず やってみよう プログラムで 読み込もう クラウドに 蓄積しよう リモートで 取得しよう 自由時間
  88. 88. おわび 88
  89. 89. 部品が一つしかないので、 全員は試せないかと思います。。。 予めご了承ください。。。 89
  90. 90. ★USB経由でセンサーデータを取得していたけど、 PCが無いと計測できないなんて、 そんなのセンサーじゃない ★センサーネットワーク ★ センサーデータを近距離の無線通信で収集する ★ ワイヤレスにすることで、センサーの設置場所の制約を軽 減出来る ★ なるべく省電力なものを採用 ★ 電力は貴重なリソースなので、通信部にあまり費やしたく ない ★ 近距離無線通信 ★ BLE, Zigbee, MQTT センサーデータの収集(再掲) 90
  91. 91. ★Xbeeモジュール (Zigbee規格) ★省電力(データ量も少量) ★スケーラブルなネットワーク構成 ★スター型、メッシュ型、ツリー型 ★多くの機器がネットワークに参加可能 ★通信するモジュールの情報を予め書き込んで おくことで、該当するモジュールへ情報の送信を行う ★デバイスタイプ: ★coodinator: 親機 ★router: 子機 今回使うのは・・・ 91
  92. 92. ★Xbeeのセットアップでは、X-CTUという アプリケーションから設定します http://www.digi.com/support/productdetail?pid=3352 ★ USBでXbeeモジュールを接続し、セットアップする ★今回は予めモジュール設定済みのものを使用 ★ PCにUSB接続するモジュール側の設定 ★ Coodinator AT/透過モード ★ Arduinoモジュール側 ★ Router AT/透過モード • Xbee 92
  93. 93. ★ArduinoはXbeeのシールドを かぶせる形で接続 ★PCはUSBでXbeeモジュールと接続 ★デバイスドライバはArduinoIDEに含まれています ★Windowsの場合、自動認識ではインストール されないので、個別にドライバの設定 ★そして何故か2回やらないと認識しない。。。。 ★AT/透過モードに設定しているため、シリアル通信が そのままリモート通信となる ★特別なプログラムを記述する必要がない Xbee 93
  94. 94. ★リモート通信や近距離無線と 難しそうな単語が出て来ましたが、 予想以上に簡単にリモート化を 体感出来たかと思います ★シリアル通信を透過的に行っているた め、USBで動作確認したものをプログラム そのままでリモート化できます ★これまた色々構想が膨らみそうですね まとめ 94
  95. 95. 番外編 95
  96. 96. ★センサーデータをリアルタイムに分析したい ★閾値を超えたら何かしたり・・・ ★より本格的な利用 ★AWS Kinesis(http://aws.amazon.com/jp/kinesis/) ★AWS上のリアルタイムデータ処理サービス ★データの受け付けとデータを処理するための ストリームがAWS上で提供されている ★あくまでストリーム基盤の提供であり、ストリームの 受け付け先のサービスは自分で実装する • リアルタイムに処理がしたい 96
  97. 97. https://www.gosquared.com/blog/kinesis-demo-aws-reinvent-2013 97
  98. 98. ★Node.jsからAWSのKinesisを利用する サンプル ★AWSの課金が発生するので、気をつけ て使用してください ★1ヶ月ストリーム使うと・・・ ★ $0.0195 per provisioned shard-hour 744 ShardHour $14.51 ★ ※一ヶ月使用した実際の請求金額 • Kinesisのサンプル 98
  99. 99. ★必要なライブラリのインストール ★Node.jsでAWSのサービスを利用するために 「aws-sdk」をインストールします ★コマンドプロント(or ターミナル)で作業ディレ クトリに移動し、npmコマンドを実行します • Kinesisのサンプル > cd 作業ディレクトリ > npm install aws-sdk 99
  100. 100. Kinesisのサンプル • { "accessKeyId": "XXXXXX", "secretAccessKey": "XXXXXX", "region": "ap-northeast-1" } config.jsonを用意 ※自分の環境に合わせて、AWSのアカウント情報を設定 100
  101. 101. • 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のサンプル (書き込み)
  102. 102. • 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のサンプル (読み込み)
  103. 103. ★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. 104. 104 好きなセンサーや、LEDなどを 組み合わせて何か作って みてください 最後に出来た作品を 是非発表してください 電子工作入門 とりあえず やってみよう プログラムで 読み込もう クラウドに 蓄積しよう リモートで 取得しよう 自由時間 ☆★自由時間☆★
  105. 105. •Let’s have Fun!! :) • 105
  106. 106. •fin...Zzz...zzz... 106

×