M5StackとFirebaseを使ってenebularとつないでみよう

image

外部ライターの田中正吾です。今回はenebularにディスプレイつきのコンパクトなIoT機器M5Stackとリアルタイムにデータをやり取りできるサービスFirebaseをつないでみようと思います。

今回やりたいこと

まず、今回のやりたいことです。Firebaseを経由してenebularとM5Stackがやり取りを行います。

image

まず、M5Stackからenebularにデータを送信する仕組みです。M5StackのボタンAを押すとFirebase経由でメッセージが送信されます。

image

つづいて、enebularからM5Stackにデータを送信する仕組みです。enebularからFirebase経由でタイムスタンプを表示させます。

Firebaseとは

Firebaseとは

FirebaseはGoogle のモバイル プラットフォームで高品質のアプリを開発するための様々ツールが揃っています。Firebaseはもともとはモバイルからはじまったものですが、IoTの目線でも注目されています。

image

このように機能を眺めてみると、アプリデータを瞬時に保存および同期するRealtime Database、ユーザーを簡単かつ安全に認証 Authentication の部分は重宝するところです。

image

そういった流れから、最近、ウフルのenebularとしてもenebular との連携度がアップし、Firebaseのノードをプリインストールさせることで連携を深めています。つまり、enebularでFirebaseと連携する場合は、flowですぐに使うことが可能です!(2018/10/23現在)

Firebaseの準備

まず、Firebaseの準備をしていきましょう。enebular のドキュメントで DataSource Firebaseの説明がとてもわかりやすくこちらを参考にすると良いでしょう。

こちらの記事では、手短にですが設定の流れをお伝えします。

Google Developerログインを済ませて、Firebaseにアクセスします。

image

コンソールへ移動します。

image

プロジェクトを追加を押してプロジェクト作成します。

image

Firebaseは無料で使える数が限られているので、プロジェクトの名前は注意しましょう。私はキャプチャを撮るために何度も生成していたら制限数をオーバーしました 🙂

Firebaseの使い方によりますが、たとえばenebularでのみ試す場合は、このようにenebularと打ち込むと後半にランダムに文字列が追加されます。もしも、もっと大きいくくりで「IoT全般で試したい」や「自分の試したいプロジェクトで試したい」といった場合は、命名を落ち着いて設定しましょう。

設定をメモ

さて、作成されたら設定をメモしておきます。Firebaseで作成されたらProject Overviewに進みます。

image

「ウェブアプリに Firebase を追加」をクリックします。

image

こちらに表示される設定を後で使うのでメモしておきます。

Realtime Databaseをテストモードにする

image

こちらもDocsに詳細がありますが、Realtime Databaseをテストモードにして、扱いやすくし、設定をスムーズに行えるようにします。慣れてきたら細かく設定を調整していきましょう。

M5Stack

つづいて、M5Stackです。

M5Stackとは

image

つづいて、M5StackはディスプレイつきのコンパクトなIoT機器です。Wi-FiボードESP32をベースにしたパッケージがしっかりしていて見た目にも親しみやすいマイコンです。

積み重ねていく形で機能追加ができたり、単体でもGPIOやGrove I2Cポートなども、他のセンサーやアクチュエーターへの接続も充実していてIoTを学んでいくにも最適です。

また、日本国内でもユーザーグループ M5Stack User Group Japan が立ち上がり、第1回のイベントはなんと100人を越える参加者で注目が集まっています。

M5Stackの準備

さて準備です。

M5Stack Grayで進めます。

M5Stack自体のセットアップの方法や、実際の使い方は以下の情報が充実しているので、参考にしてください。

また、M5StackとFirebaseの連携の基本的なやり方はこちらがとてもわかりやすいです。ぜひ一度見ていただけると雰囲気がつかめると思います。

今回はM5Stackの基本的なセットアップは済ませていてArduino IDEで開発ができる前提で進めます。

Arduino IDEにFirebaseライブラリをインストール

Arduino IDEでFirebaseライブラリを使えるように整えます。

ioxhop/IOXhop_FirebaseESP32: Get Set Push Stream value on Firebase via ESP32

image

こちらからZIPファイルをダウンロードします。

image

このIOXhop_FirebaseESP32ライブラリをArduino IDEにインストールするため、 メニュー>スケッチ>ライブラリをインクルード>.ZIP形式のライブラリをインストール の操作を行いインストールします。

M5Stackにソースコードを書き込みます

M5Stackには以下のコードを書き込みます。

#include <IOXhop_FirebaseESP32.h>
#include <M5Stack.h>
#include <WiFi.h>

#define WIFI_SSID "WIFI_SSID"
#define WIFI_PASSWORD "WIFI_PASSWORD"

#define FIREBASE_DATABASE_URL "XXXXXX.firebaseio.com"

void setup() {
  M5.begin();
  
  Serial.begin(115200);
  
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.fillScreen(GREEN);
  
  M5.Lcd.setTextColor(BLACK);
  M5.Lcd.setTextSize(3);
  M5.Lcd.println("enebular-Firebase");
  M5.Lcd.println();

  // connect to wifi.
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("connecting");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println();

  // WiFi Connected
  Serial.println("\nWiFi Connected.");
  Serial.println(WiFi.localIP());
  M5.Lcd.println("WiFi Connected.");
  M5.Lcd.println("");
  
  Firebase.begin(FIREBASE_DATABASE_URL);
  Firebase.stream("/M5Stack/message", [](FirebaseStream stream) {
    String eventType = stream.getEvent();
    eventType.toLowerCase();
     
    Serial.print("event: ");
    Serial.println(eventType);
    if (eventType == "put") {
      String path = stream.getPath();
      String data = stream.getDataString();
      Serial.print("data: ");
      Serial.println(stream.getDataString());
      // ディスプレイ表示
      M5.Lcd.setCursor(0,60);
      M5.Lcd.fillScreen(GREEN);
      M5.Lcd.setTextColor(BLACK);
      M5.Lcd.setTextSize(3);
      M5.Lcd.println("message : ");
      M5.Lcd.setTextSize(3);
      M5.Lcd.println();
      M5.Lcd.println(data);
    }
  });

  Firebase.setString("/M5Stack/message", "start");
}

int i = 0;
void loop() {
  String payload;
  if(M5.BtnA.wasPressed()) {
    Serial.printf("wasPressed A \r\n");
    // ディスプレイ表示
    M5.Lcd.setCursor(10, 100);
    M5.Lcd.fillScreen(RED);
    M5.Lcd.setTextColor(YELLOW);
    M5.Lcd.setTextSize(3);
    M5.Lcd.printf("Pressed  ");
    M5.Lcd.setTextSize(10);
    M5.Lcd.printf("A");
    // Firebaseへ送信
    Firebase.setInt("/M5Stack/button", 1);

    delay(1000);
  }

  if(M5.BtnB.wasPressed()) {
    Serial.printf("wasPressed B \r\n");
    // ディスプレイ表示
    M5.Lcd.setCursor(10, 100);
    M5.Lcd.fillScreen(BLUE);
    M5.Lcd.setTextColor(WHITE);
    M5.Lcd.setTextSize(3);
    M5.Lcd.printf("Pressed  ");
    M5.Lcd.setTextSize(10);
    M5.Lcd.printf("B");
    // Firebaseへ送信
    Firebase.setInt("/M5Stack/button", 2);

    delay(1000);
  }

  if(M5.BtnC.wasPressed()) {
    Serial.printf("wasPressed C \r\n");
    // ディスプレイ表示
    M5.Lcd.setCursor(10, 100);
    M5.Lcd.fillScreen(GREEN);
    M5.Lcd.setTextColor(BLACK);
    M5.Lcd.setTextSize(3);
    M5.Lcd.printf("Pressed  ");
    M5.Lcd.setTextSize(10);
    M5.Lcd.printf("C");
    // Firebaseへ送信
    Firebase.setInt("/M5Stack/button", 3);
    
    delay(1000);
  }
  
  M5.update();
}

ソースコード内の定数は、以下のように設定します。

  • WIFI_SSID
  • Wi-FiのSSID
  • WIFI_PASSWORD
  • Wi-Fiのパスワード
  • FIREBASE_DATABASE_URL
  • 以下参照

FIREBASE_DATABASE_URLは、先ほどメモしたdatabaseURLの https:// を無くした部分を使います。

image

enebularの準備

ここまで進めばあとはenebularでデータを操れます。

enebular Discover Flow から読み込み

enebular Discover Flow からフローデータを読み込みます。

image

enebularはDiscover Flowを使うことで、プロジェクトに簡単にフローを取り込むことが可能です。

image

プロジェクトを作ったら、早速、Discover Flow (flow-firebase-simple-inout) にアクセスします。

image

Forkを押して取り込みます。

image

Firebaseノードの設定

Forkしたフローを編集します。Firebaseノードの設定を行います。enebular のドキュメントで DataSource FirebaseにてFirebaseノードの設定が説明がとてもわかりやすく、こちらを参考にすると良いでしょう。

image

invalid credentialになっています。

image

Firebaseノードをクリックしてノード設定画面を開きます。

image

Firebase項目は、add new firebase config を選択した状態で、鉛筆ボタンをクリックしてFirebase設定を編集します。

image

Firebase設定では、

  • Firebase
  • 以下参照
  • Auth Type
  • None

Firebase設定でドメイン設定をする部分は、すでにfirebaseio.comが補完されているので、projectIdに相当するサブドメイン名だけ指定します。

image

以上を設定して、Addを押します。

image

ノード設定に戻るのでDoneを押します。

image

もう一つのFirebaseノードにも先ほど行った指定をします。ダブルクリックします。

image

先ほどど同じようにノード設定画面がでてくるので、すでに出来上がっている設定を選択してDoneを押します。

image

Deployボタンを押して、FIrebaseノードがこのようにreadyと反応したら設定完了です。

動作を確かめる

image

うまく設定できたか動作を確かめてみましょう。

image

injectノードをクリックしてデバッグウィンドウを見てみます。

image

デバッグウィンドウで、タイムスタンプが更新されたデータが流れてきます。

こちらで、enebularの設定は完了です。

実際に動かしてみます

では、enebularのフローを起動して待っておきます。

M5Stack→enebular

image

M5Stackのボタンを押します。今回は一番左のAボタンを押します。

image

enebularのデバッグウィンドウでデータを確認できます。

一度Aボタンを押してしまうと以後Aボタンを何度も押し続けても値が変わらないので、B→C→A→C・・・のように、ボタン値が変化するように試してみましょう。

enebular→M5Stack

image

injectノードの矢印のボタンをクリックします。

image

M5Stackが送信された反応します!

まとめ

ディスプレイつきのコンパクトなIoT機器M5StackをFirebaseを使ってenebularとつないでみました。

M5StackはこのようにIoTの基礎となるセンシングのきっかけと見立ててボタンの動作を楽しむことも出来ますし、大きなディスプレイで様々な反応を絵で表示できるので、目に見えた変化でIoTを楽しむことが可能です。

またFirebaseがenebularと連携することで簡単にエッジとクラウドの連携を理解することが可能です。