sakura.ioで家の外から施錠確認をする(IoT)-ソフト編
前回まで
前回は,ドアの施錠を確認するためにちょっとした回路を組みました.
今回の概要
完成形

すること
今回はいよいよソフトウェアに入っていきます.
Arduino側のプログラム作成と,環境構築とNode-REDを使ったノードベースプログラミングについて少し見ていきたいと思います.
さくらインターネットが基礎をわかりやすく解説したスライドを公開しているので,それを参考にしていきます.【最新版誘導用】sakura.io handson:https://www.slideshare.net/sakura_pr/sakuraio-handson
製作
sakura.ioの準備
https://sakura.ioにアクセスして右上のログインをクリックします.
自分のアカウントでログインします.
ログインしたらプロジェクト追加をクリックしてください
名前は適当でいいです.
ホームに戻った後,モジュールの追加をクリック
ここで入力する登録用IDと登録用パスワードは通信モジュールの紺色のシールをはがして確認してください.
再度ホームに戻って,サービス追加をクリックします.
今回は一番上の「WebSocket」を選択します.
名前を適当に決めてください.
URLは後でサービスと連帯するときに使うので,メモ帳にでもコピペしておくといいと思います.
Arduinoの準備
さくらインターネットからArduino用のライブラリが提供されているので今回使用します.
Arduino IDEをインストールしていない方は,公式からダウンロードしてインストールしてください.https://www.arduino.cc/en/Main/Software(寄付してもいいと思いますが,JUST DOWNLOADで寄付なしでいけます)
IDEを起動して,「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理」
検索バーに「sakura」と入力すればそれらしきライブラリがヒットします.インストールしてください.

インストールできたら「ファイル」→「スケッチ例」→「SakuraIO」→「Standard」をクリックし,そのままArduinoに書き込みます.
上手くいけば,シリアルモニタが以下のようになります.
先ほどのsakura.io サービス連携の編集のページの下の方に届いたデータが表示されます.
簡易表示モードに切り替え⇔詳細表示モードに切り替え とトグル選択できます.
さくらのクラウドと連帯
さくらのクラウドログインページにアクセスします.
右上あたりの「コントロールパネルログイン」をクリック.
自分のアカウントでログインします(普通は左側:さくらインターネット会員).
アカウントを作成します.
自分の好きなように決めてください.
ホームに戻って,さくらのクラウド(IaaS)をクリック(サービスの中の左上).
右上のバーの「追加」をクリック.
サーバーを作成します.右上のシンプルモードのチェックを外してください.
変更がある点だけピックアップします.詳しくは,さくらインターネット作成のスライドを確認してください.
「アーカイブ選択」は「CentOS 7.x ・・・」を選択してください.

「管理ユーザのパスワード」,「ホスト名」は適当に決めてください.
「配置するスタートアップスクリプト」は”Node-RED”を選択します.
「Node-REDのWeb UIポート番号」は,”80″を選択します.
ログインID,ログインパスワードは適当に決めてください.
下までスクロールすると作成をクリックします.以下の3つの項目がすべて成功すればサーバ作成が完了です.
左のリストの一番上「サーバ」をクリックすると,先ほど作成したサーバが表示されます.そして,画像赤丸のインターフェースというところの値がIPアドレスです.作成したサーバの上で右クリックをすると「IPアドレスをコピー」という項目が選択できるので選択します.
ブラウザで新しいタブを開いて,そのIPアドレスを貼り付けて移動すると,Node-REDのログイン画面が表示されます.先ほどのサーバ作成時に決めたユーザ名,パスワードでログインします.
ログインしたら左側のリスト(ノードパレット)から”WebSocket”ノードを中央の真っ白な部分(シート)へドラッグアンドドロップします.
“WebSocket”ノードをダブルクリックして,画像の赤丸(鉛筆マーク)をクリックします.
URLにはsakura.ioで連帯サービスを作成したときに表示されたアドレス(wss://api.sakura.io~)を指定します.「送信/受信」は”ペイロードを送信/受信”を選択します.
できたら,交信をクリックします.
種類は”接続”を選択,名前は適当に決めてください.完了をクリックします.
左にあるノードパレットから,”debug”ノードをドラッグアンドドロップします.”WebSocket”ノードの左端の丸から,”debug”ノードの右端の丸までドラッグアンドドロップで接続してください.
画面右上の”デプロイ”ボタンをクリックしてください.
デプロイボタンの下の”デバッグ”タブをクリックすると,無線モジュールというかsakura.ioからデータが送られてきます.
ここで,”debug”ノードを削除します.そして,右上角にあるボタンから「パレットの管理」を選択します.
“ノードを追加”タブを選択し,検索バーに”node-red-dashboard”と打ち込み,一番上の「node-red-dashboard」の右下の”ノードを追加”をクリックしてください.
これがブラウザから見た時のGUIのパーツになります.
次に,右上角のボタンから,「読み込み」→「クリップボード」を選択して,以下の画像下にある文字列(JSON形式)をコピーして,貼り付けてください.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
[ { "id": "1157869c.219529", "type": "json", "z": "6434d409.262a2c", "name": "String→Objectへの変換", "property": "payload", "action": "", "pretty": false, "x": 503, "y": 927, "wires": [ [ "de401eaa.91205" ] ] }, { "id": "de401eaa.91205", "type": "switch", "z": "6434d409.262a2c", "name": "Type=Channelsだけ通過", "property": "payload.type", "propertyType": "msg", "rules": [ { "t": "eq", "v": "channels", "vt": "str" } ], "checkall": "true", "outputs": 1, "x": 284, "y": 1033, "wires": [ [ "ef9ab424.92e438" ] ] }, { "id": "ef9ab424.92e438", "type": "function", "z": "6434d409.262a2c", "name": "Channel0(Lock) parse", "func": "if(msg.payload.payload.channels[0].value===0){\n return {payload:\"Locked\"};\n}else{\n return {payload:\"Unlocked\"};\n}", "outputs": 1, "noerr": 0, "x": 559, "y": 1032, "wires": [ [ "2e53ba8e.6708e6", "a3707c74.a5fa9" ] ] }, { "id": "2e53ba8e.6708e6", "type": "debug", "z": "6434d409.262a2c", "name": "", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "false", "x": 783, "y": 1032, "wires": [] }, { "id": "a3707c74.a5fa9", "type": "ui_text", "z": "6434d409.262a2c", "group": "f80a634d.67834", "order": 0, "width": "0", "height": "0", "name": "", "label": "LockStat", "format": "{{msg.payload}}", "layout": "col-center", "x": 765, "y": 1120, "wires": [] }, { "id": "f80a634d.67834", "type": "ui_group", "z": "", "name": "LockStat", "tab": "88dee300.913ca", "disp": true, "width": "6", "collapse": false }, { "id": "88dee300.913ca", "type": "ui_tab", "z": "", "name": "Status", "icon": "dashboard", "order": 1 } ] |
そうしたら,先ほどの”WebSocket”ノードにつなげてください.
問題なければ画面右上のデプロイをクリックします.
ブラウザで ”IPアドレス/ui” でアクセスすると,しょぼすぎるUIが表示されます(IPアドレスはNode-REDにアクセスしたときと同じ).
Arduinoに戻る
今までのコードを変更します.5秒ごとにセンサの状態を送信するので,反映されるまで若干のタイムラグがあります.
以下のコード,私的にはコピペOKですが,さくらインターネット的にどうなんでしょう.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
// ヘッダファイル指定 Including header files #include <SakuraIO.h> SakuraIO_I2C sakuraio; const int DoorSen = 2;//施錠確認センサー[pin番号] // 変数の定義 Definition of variables uint32_t isnLock = 0; // 起動時に1回だけ実行 Run once at startup void setup() { pinMode(DoorSen, INPUT); Serial.begin(9600); // オンライン状態に遷移するまで待機 Wait until transition to online state Serial.print("Waiting to come online"); for (;;) { if ( (sakuraio.getConnectionStatus() & 0x80) == 0x80 ) break; Serial.print("."); delay(1000); } } // 以下ループ実行 Loop execution void loop() { isnLock = digitalRead(DoorSen); //センサーデータを送信 sakuraio.enqueueTx(0, isnLock); sakuraio.send(); Serial.println(""); Serial.println("* Sent to sakura.io *"); // 利用可能な領域(Available)とデータが格納された領域(Queued)の取得 Get Available and Queued uint8_t available; uint8_t queued; if (sakuraio.getTxQueueLength(&available, &queued) != CMD_ERROR_NONE) { Serial.println("[ERR] get tx queue length error"); } Serial.print("Available :"); Serial.print(available); Serial.print(" Queued :"); Serial.println(queued); Serial.println(""); // sakura.ioからの受信データに応じたLED点灯 Lights the LED according to received data available = 0; if (sakuraio.getRxQueueLength(&available, &queued) != CMD_ERROR_NONE) { Serial.println("[ERR] get rx queue length error"); } sakuraio.clearRx(); delay(5000); } |
で動きます.ブラウザで確認してみましょう.
おわりに
前半はさくらインターネットのハンズオンのスライドと同じことをしているので,わからないところがあればそちらをご覧ください.