こんにちは、mizuno_asです。
先日、ついにさくらのIoT Platformの開発者向けベータ版の出荷が始まりましたね。じつは先日、弊社の会議室でさくらのIoTのハンズオンが開催されました。筆者もそこでさくらのIoTを初体験したのですが、これが非常に面白く、即日社長に買ってーとおねだりしてみました。
さくらのIoTが誕生したきっかけは、田中社長の「ものがつぶやけばいいのに」という一言だそうです。その通り、さくらのIoTは何らかのセンサーから受け取った情報を発信するためのモジュールです ((実際はLTE閉域網を用いた安全な通信経路の確保や、データの蓄積、他サービスとのインターフェイスの提供と、すべてをひっくるめてさくらのIoT Platformなわけですが、ここでは便宜上、通信モジュールだけに限定して話しています。)) 。つまり発信した情報を受け取る「なにか」が必要になるわけです。
一方弊社のクリスタルシグナルPiは、監視システムからの通知をトリガーに、色で情報を可視化するガジェットです。単体ではただのLEDでしかなく、情報を上げてくる対向側システムの存在が必要不可欠なわけです。
あれ? もしかして、これってなんか相性いいんじゃないでしょうか?
というわけで、組み合わせてみました!
システムの概要
やりたいことはざっくり以下の通りです。
- Arduinoに何らかのセンサーを取り付ける
- センサーが検知した値をさくらのIoTに投げる
- さくらのIoTサーバーからWebSocketで値を取得する
- 値に応じてクリスタルシグナルPiを光らせる
3番と4番はクリスタルシグナルPi本体にやらせてもよいのですが、今回は中継用のサーバーでNode-REDを動かすことにしました。
Arduinoにセンサーを取りつける
何らかのセンサーを取りつける……とは言ったものの、たまたま筆者のお道具箱に入っていたセンサーらしきものは、サンハヤトの磁気センサーモジュール「MM-DE21D」だけでした。仕方ないのでこいつを使うことにします。磁気センサーですから、扉の開閉状態をチェックするなんてのが定番でしょう。そこで今回のお題は、リフレッシュルームの冷蔵庫の開閉をチェックするセンサーに決定です。
MM-DE21D(以下センサー)には、VDDと5Vのふたつの入力端子があります。今回はArduino Leonardoを使ったので、Arduinoの3.3Vの電源ピンとVDDを接続します。そしてセンサーのGND端子をArduinoのGNDに繋いで回路を作ります。
出力端子はOUT1/OUT2のふたつです。どちらも磁気を検知するとHIGHレベルになるという点では同じですが、磁気(S/N)の向きによって、HIGHになる端子が変わる仕様です。つまり磁気の向きによって異なる動作をする回路を作ることができるわけですね。OUT1/2をそれぞれ、Arduinoのデジタルピンの8番と9番に接続しました。また5kΩの抵抗を挟んで、3.3Vとも繋いでおきます。ついでにデバッグ用に、センサーの状態を表す青色LEDもつけておきました。こいつはデジタルピンの7番に接続します。
さくらのIoT 通信モジュールを取り付ける
ベータ版ドキュメントに従い、通信モジュールとシールドボードを組み立てます。シールドボードのジャンパ設定は、モジュールのI2C_SCL・SDAとArduinoのSCL・SDAを接続するようにショートさせました。
Arduinoにプログラムを書き込む
まずさくらのIoTのArduino用ライブラリをクローンして、Arduino IDEから読み込めるようにしておいてください。クローンしたディレクトリを、Macの場合は「~/Documents/Arduino/libraries」、Windowsの場合は「My Documents\Arduino\libraries」以下に保存して、IDEを再起動すればよいでしょう。
以下のプログラムをArduinoに書き込みました。さくらのIoTとの通信部分は、ほぼサンプルコードそのままです。センサー部分は、今回は向きに関係なく磁力を検知できればそれでいいため、out1、out2のどちらかがHIGHになっていることを検知するようにしました。なおドアが開いている時にtrueとしたいため、センサーの値と0/1は逆転させています。この値を0番チャネルとして送信します。1番チャネルにはデバッグ用にカウンター値を入れてみました。
#include <SakuraIO.h> SakuraIO_I2C sakuraio; uint32_t cnt; uint8_t led1 = 7; uint8_t out1 = 8; uint8_t out2 = 9; void setup(){ pinMode(out1,INPUT); pinMode(out2,INPUT); pinMode(led1,OUTPUT); cnt = 0; while((sakuraio.getConnectionStatus() & 0x80) != 0x80){ Serial.println("Waiting to come online..."); delay(1000); } } void loop() { cnt++; uint8_t o1 = digitalRead(out1); uint8_t o2 = digitalRead(out2); uint32_t door = 0; if (o1 == LOW && o2 == LOW) { digitalWrite(led1, HIGH); door = 1; } else { digitalWrite(led1, LOW); door = 0; } sakuraio.enqueueTx(0,door); sakuraio.enqueueTx(1,cnt); sakuraio.send(); Serial.println(cnt); delay(2000); }
モジュールをプロジェクトに登録する
さくらのIoTのサイトからコントロールパネルにログインしてください。「モジュールの追加」をクリックして、通信モジュールに記載されているIDとパスワードを入力します。
これで通信モジュールから送信されてくるデータを受け取る準備ができました。続いてデータを連携するための、出口を作らなければなりません。今回はWebSocketを使うので、「サービス追加」→「WebSocket」をクリックします。ソケットに任意の名前をつけると、アクセスに必要なトークンとURLが生成されます。
作成したWebSocketをクリックして、値が受信できていれば成功です。
クリスタルシグナルPiと連携する
WebSocketの値を読み、クリスタルシグナルPiにHTTPリクエストを投げるため、社内にNode-REDサーバーを用意しました。Ubuntu 16.04 LTSをインストールし、以下のコマンドを実行します。
$ sudo apt install npm nodejs-legacy $ sudo npm install -g --unsafe-perm node-red $ node-red
WebブラウザからNode-REDにアクセスして、以下のフローを作成しました。さくらのIoTからWebSocketを読み、JSON nodeでStringをObjectに変換しています。その後にチャネル0のvalueを読み、0/1で処理を分岐しています。0(閉状態)では青点灯、1(開状態)では赤点灯としてみました。
いかがでしょうか? 思っていたよりもレスポンスが良くて驚いています ((センサーのディレイを2秒にしているため、検出まで多少のタイムラグがあります。ディレイを500msくらいにすると、ほぼラグは気にならなくなるようです。)) 。さくらのIoTもクリスタルシグナル Piも、アイデア次第で色々な用途で活躍できるんじゃないでしょうか。もしもクリスタルシグナルPiが気になった方は、下記サイトから支援をよろしくお願いいたします。
クリスタルシグナルPi公式サイト
ACT NOW プロジェクトページ