気軽にIoTデバイスをつくろう


はじめに

この記事はリンク情報システムが主催するイベント「Tech Connect! Autumn」のリレー記事です。
Tech Connect! Autumn」は engineer.hanzomon のグループメンバによってリレーされます。
(リンク情報システムのFacebookはこちらから)
千秋楽の担当は2度目登場のmk-takahashiです。

本日は秋分の日ですね。
秋分の日は「祖先を敬い、亡くなった人をしのぶ日」として1948年に国民の休日として制定されています。
みなさんも今日はこの記事を見た後、PCを閉じて家族と一緒に祖先の話をしたり、仏壇に手を合わせてみてはいかかでしょうか。

というわけで本題に入ります。

きっかけ

みなさんはこんな経験ありませんか。

「会社(or学校)行かなきゃ」

 ~家を出て数分後~

「あれ、鍵閉めたっけ...」

「いや、閉めたはず!!」

 ~さらに数分後~

「不安になってきた...」

「家に戻って確認しなきゃ...」

私はたまにあります。
こんな日は朝から憂鬱な気分になります。

これを解消したいなと常々考えていました。
が、作るのめんどくさいしなかなか時間が作れなくて後回しになっていました。

そんなわけで今回はそんな悩みを解消するための何かを作ろうと思います。

なにをつくろう

まず家の外から家の鍵の状態をチェックできるようにする必要があります。
それにはやはりIoTが最適かと思います。
鍵にセンサーを付けて、センサーの値をマイコンで拾ってサーバに投げてやればいいのです。

ただきっかけでも述べましたが、私はめんどくさがりで時間がなかなか作れないのであんまり手間のかかるものは好きではありません。

なのでタイトルにもある通り、気軽にIoTデバイスを作ろうと思います。

モジュールの選定

最近(結構前からあるけど)ではWiFiモジュールかつファームウェアの書き換えでArduinoマイコンとしても使えるESP-WROOM-02があるのでこれを使えば楽ができそうです。
ライブラリも豊富で楽をするのにもってこいです。

ただひとつ問題があります。
ESP-WROOM-02のファームウェア書き込みを行うためには開発ボードを使用するか、書き込み基板を作る必要があります。
当然書き込み機能のある開発ボードのほうが値段が高いです。
書き込み基板はひとつ作れば使い回しできるので手間はありますが、安く済みます。

筆者としては今後、IoTデバイスを複数作って運用したいとも考えてもいるので、可能な限り費用は抑えたい。

なので今回は書き込み基板も作成します。

よって今回の記事では
 ・書き込み基板を作る編
 ・IoTデバイスを作る編
の2部構成でお送りします。

書き込み基板を作る編

使用する部品

ESP-WROOM-02
・ユニバーサル基板
・タクトスイッチ×2
・ピンソケット
・ピンヘッダ
・3端子レギュレータ 3.3V
・セラミックコンデンサ 0.1μF
・電解コンデンサ 47μF
・抵抗 10KΩ×5
USBシリアルアダプター

環境

・macOS High Sierra バージョン10.13.6
・Arduino IDE 1.8.6

準備

まずArduino IDEにESP-WROOM-02のボードマネージャをインストールします。
これをしないとArduino IDEにESP-WROOM-02のボード情報がないのでビルドも書き込みも行えません。
基本的にはこちらのブログの手順に沿って実施すればインストールできると思います。

一応こちらでも簡単に解説入れます。

1.[Preferences]をクリックする。

2.[追加のボードマネージャのURL]の右横にあるアイコンをクリックする。

3.[ http://arduino.esp8266.com/stable/package_esp8266com_index.json ]をリストに貼り付ける。

4.[ツール]から[ボードマネージャ]を選択する。

5.検索窓に[esp8266]と入力し、[esp8266 by ESP8266 Communlty]をインストールする。

6.ボードの[Generic ESP8266 Module]を選択する。

以上で準備完了です。

基板作成

[回路図は後日掲載します。]

回路図を元にして基板を作成しました。

全て外した状態

書き込み

書き込みができるかどうか空のコードを書き込むことでテストします。

書き込み方は以下の手順で行います。
1.[→]ボタンを押して、コンパイルと書き込みを行う。

2.[最大1044464バイトの〜]のログが出たタイミングでリセットボタン(黒いボタン)、書き込みモード切替ボタン(赤いボタン)の順番に押して離す。

3.書き込み完了

以上の手順が完了したら書き込み基板を作る編は終了です。

ちなみにボタンを押すタイミングがずれると以下のようなログが出て、書き込みに失敗します。

IoTデバイスを作る編

使用する部品

ESP-WROOM-02
・ユニバーサル基板
・ピンソケット
・抵抗 10KΩ× 6
・単3電池ボックス
・チルト(傾斜)センサー

うちの鍵はサムターンなので鍵が縦状態と横状態になっているのを検出できればOKです。
なのでチルト(傾斜)センサーを用いてその状態を測定します。

環境

・macOS High Sierra バージョン10.13.6
・Arduino IDE 1.8.6

準備

今回はMQTTを使用するのでArduinoのMQTTライブラリであるPubSubClientとオープンソースのMQTTブローカーであるMosquittoを導入します。

PubSubClientの導入

1.Gitから[pubsubclient-master]をダウンロードする

2.[ライブラリのインクルード]から[.ZIP形式のライブラリをインストール]を選択し、1.でダウンロードしたファイルをインストールする。

Mosquittoの導入

1.ターミナルを開いて以下のコマンドを実行する。

brew install mosquitto

基板作成

[回路図は後日掲載します]

回路図を元にして基板を作成しました。

全て外した状態

※作成した基板は鍵に無理やり取り付けてください。

コード

今回はPubSubClientのサンプルをベースに使い、Serial通信の削除、LED点灯の削除、チルトセンサーの値の読み込み等を追加しています。
チルトセンサーの値が0のときは鍵は横向き、1のときは縦向きになります。

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* ssid = "*******";        // 任意のアクセスポイントのSSID
const char* password = "*******";    // 任意のアクセスポイントのパスワード
const char* mqtt_server = "*******"; // MQTTブローカーを入れたPCのIPアドレス

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

void setup_wifi() {

  delay(10);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  randomSeed(micros());
}

void reconnect() {
  while (!client.connected()) {
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    if (client.connect(clientId.c_str())) {
      client.publish("outTopic", "hello world");
    } else {
      delay(5000);
    }
  }
}

void setup() {
  pinMode(4, INPUT);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
}

void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  long now = millis();
  if (now - lastMsg > 2000) {
    lastMsg = now;
    value = digitalRead(4);
    snprintf (msg, 75, "value #%ld", value);
    client.publish("outTopic", msg);
  }
}

動作検証

1.ターミナルを2つ立ち上げる

2.片方のターミナルに以下のコマンドを入力

 /usr/local/opt/mosquitto/sbin/mosquitto

3.もう一方のターミナルに以下のコマンドを入力

mosquitto_sub -h MQTTブローカーのIPアドレス -t outTopic

4.基板に電源投入
[mosquitto_sub]を実行しているターミナルに以下のような表示がされる。

結果&今後

以上の流れでPC上から鍵の状態が監視できるようになりました。

ただ今のままの実装だと常時動き続けるので電池がすぐになくなります。
なので今後、10分に一回計測してあとはSleepするといった実装が必要になります。

また現状はIoTデバイスを作って動作確認しただけなので、外出先から鍵の状態を確認することはこのままではできません。
なのでその部分の仕組みも考える必要があります。

参考ページ

ESP-WROOM-02を買ったので、環境構築をメモしておく
mosquittoコマンドのインストール・使い方