ESP8266やArduinoでMilkcocoaを使う方法(Milkcocoa Arduino SDK)

Posted: / Modified: / Tags: Arduino ESP8266



今まで、本ブログではRaspberry Pi(記事)やTessel(記事)等、JavaScriptで扱えるデバイスで、Milkcocoaを使ってデータのやり取りや保存をする方法を書いてきました。

ただ、ハード側の開発に着目したときに、それらのデバイスはArduino等の組み込み言語を扱うマイコンに比べて難易度が高いように思います。そのためか「ArduinoのSDK作って欲しい」といった声も多く頂いていました。

実は今までも、MQTTクライアントを使えばArduinoやESP8266でMilkcocoaを利用することはできましたが、使いにくい点が多々ありました。

そこで、先日ようやく、ArduinoやESP8266のためのシンプルなMilkcocoa SDKを作ったので、今回はその導入方法や使い方を、ESP8266を使った具体的な実装に沿って説明したいと思います。

※追記(2015-12-20):従来のMilkcocoa Arduino SDKを、従来通りのESP8266をArduino化して使う場合のSDK(ESP8266 SDK)と、新しく追加したArduinoからESP8266のATコマンド経由で使う場合のSDK(Arduino SDK)にわけました。この記事は、前者のESP8266 SDKの使い方になります。

すぐにMilkcocoa Arduino SDKの使い方に移動したい方はこちらからどうぞ

必要なもの

  • ESP8266
  • 作業用パソコン(Arduino IDE 1.64以降をインストール済)
  • パソコンとESP8266間でシリアル通信ができるまでに必要な機器(詳細は以下で紹介するCerevoさんの記事を参照)

私は、作業用パソコンはMacBook Pro(OSX 10.9)を使って、ESP8266は@wamisnetさんが作った「USBでPCに差すだけでシリアル通信から始められるESP8266互換ボード(以下の写真)」を使用しました。ちなみにこのボードは、近日発売予定とのことです。

パソコンとシリアル通信をする

まずは、パソコンとESP8266間でシリアル通信が出来るようにします。そちらの方法については、以下の記事を参考にして下さい。

ちなみに私は、先ほど書いたようにESP8266互換ボードを使ったのでこの辺は全部すっ飛ばせました(笑)

Arduino IDEでESP8266を使えるようにする

シリアル通信ができるようになったら、以下の手順通りにArduino IDEでESP8266を使えるようにしましょう(以下の手順はこちらの記事を参考にしています)。

まず、Arduino IDEの「Preferences」を開いて、「Additional Board Manager URLs」フィールドにhttp://arduino.esp8266.com/stable/package_esp8266com_index.jsonと書いて、OKで保存します。

保存したら、「ツール」 > 「ボード」 > 「Boards Manager...」から、「esp8266 platform」をインストールします。

インストール後、「ツール」 > 「ボード」から「Generic ESP8266 Module」を選びます。

これで、Arduino IDEからESP8266のプログラムを開発できるようになりました。

Milkcocoa Arduino SDK(現在はMilkcocoa ESP8266 SDK)をインストール

Arduino IDEでESP8266が使えるようになったので、Milkcocoa SDKをインストールします。

GithubレポジトリからZipでダウンロードする

まず、SDKを作業用パソコンにダウンロードします。以下のリンクを開き、右のほうにある「Download ZIP」ボタンをクリックして保存します。

ライブラリのインストール

ダウンロードが終わったら、Arduino IDEの「スケッチ」 > 「Include Library」 > 「Add ZIP Library...」をクリックします。

ファイル選択画面が開かれるので、先ほどダウンロードしたZIPファイルを選択して読み込みます。

これでインストール完了です。「スケッチ」 > 「Include Library」の中に「Milkcocoa ESP8266 SDK(画像はArduino SDKになっていますがESP8266 SDKです)」が追加されていれば、インストール成功です。

※現在はZIPでダウンロードしてライブラリをインストールするかたちですが、このSDKがArduinoライブラリに登録されれば「スケッチ」 > 「Manage Libraries」から直接インストールできるようになります。登録申請が通り次第、こちらの方法は更新します。

SDKの使い方

使い方を説明します。といっても、現在できることは以下の3つです(他のメソッドについては、随時追加していきます)。

  • send():データの送信
  • push():データの送信&保存
  • on()send()push()の監視

まずは、いくつかの情報を使ってmilkcocoaオブジェクトを作成します。

milkcocoaオブジェクトの作成
#define MILKCOCOA_APP_ID      "...YOUR_MILKCOCOA_APP_ID..."
#define MILKCOCOA_DATASTORE   "esp8266"

#define MILKCOCOA_SERVERPORT  1883

const char MQTT_SERVER[] PROGMEM    = MILKCOCOA_APP_ID ".mlkcca.com";
const char MQTT_CLIENTID[] PROGMEM  = __TIME__ MILKCOCOA_APP_ID;

// 'client'は、Ethernet or WiFiのClient
Milkcocoa milkcocoa = Milkcocoa(&client, MQTT_SERVER, MILKCOCOA_SERVERPORT, MILKCOCOA_APP_ID, MQTT_CLIENTID);

必ず変更する必要があるのはMILKCOCOA_APP_IDの部分だけです。必要に応じてMQTT_CLIENTIDMILKCOCOA_DATASTOREも変更して下さい。

続いて、send()push()の方法です。

send(), push()
loop(){
  // 以下をloopの中で必ず実行します
  milkcocoa.loop();

  // データ格納用のオブジェクトです
  DataElement elem = DataElement();

  // 以下のようにkey, valueを設定していきます。
  elem.setValue("name", "Milk");
  elem.setValue("age", 35);

  // データストア名を指定して、データをpushもしくはsendします
  milkcocoa.push(MILKCOCOA_DATASTORE, elem);
  // or
  milkcocoa.send(MILKCOCOA_DATASTORE, elem);
}

on()は以下のように使います。

on()
void setup() {
    // on()はsetup()内で呼び出します。onpush()にpushされたときの処理を書きます。
    milkcocoa.on("datastore name", "push", onpush);
    // or
    milkcocoa.on("datastore name", "send", onsend);
}
void loop() {
 // ...
}
void onpush(DataElement elem) {
  // 受け取ったデータを取り出すときは、getStringやgetIntなど型によって関数を使い分けます。
  Serial.println(elem.getString("name"));
  Serial.println(elem.getInt("age"));
  // 出力結果:
  // Milk
  // 35
}
// or
void onsend(DataElement elem) {
  // ...
}

使い方は以上です。一応説明しましたが、使い方を見るよりスケッチの例をベースに自分用にカスタマイズするほうが良いかと思います。

スケッチの例からプログラムを動かしてみる

では、実際に例を動かして、動作確認をしてみましょう。

※Milkcocoaに登録していない方は、Milkcocoaで登録(無料)した後、アプリを作成してアプリのapp_idを控えておいてください。

Arduino IDEの「ファイル」 > 「スケッチの例」 > 「Milkcocoa ESP8266 SDK」 > 「milkcocoa_esp8266」を開きます。

こちらのプログラムでは、「データストアへのデータ保存:push()」と「pushされたデータの監視(pushしたタイミングで処理を実行する):on(push)」がテストできます。

テストをする前に、必要な情報を入力しましょう

  • 利用可能なWiFiのアクセスポイントのSSIDとパスワードを書き換える
  • 自分のMilkcocoaアプリのapp_idを書き換える(データストア名も変えたければ)
milkcocoa_esp8266.ino
/************************* WiFi Access Point *********************************/

#define WLAN_SSID       "...SSID..."
#define WLAN_PASS       "...PASS..."

/************************* Your Milkcocoa Setup *********************************/

#define MILKCOCOA_APP_ID      "...YOUR_MILKCOCOA_APP_ID..."
#define MILKCOCOA_DATASTORE   "esp8266"

こちらを書き換えて、「マイコンボードを書き込む」で書き込んでシリアルモニタを立ち上げたら、シリアルモニタに5秒ごとにonpush 1という表示が出てくると思います。

ちゃんとデータが保存されているか、データストアでも確認してみましょう。

Milkcocoaにログイン、今回使用したアプリをクリックして、「データストア」 > 「データストアを選択」の中から「esp8266」を選択して「リスト表示」をすると、{v:1}というデータが複数表示されるかと思います。

照度センサーを使ってみました

試しに以下の記事を参考に照度センサーのデータを保存してみました。

雑ですが、ありものを使って以下のような回路にしました。抵抗がこんなふう(2:1)になってるのは、TOUTが0V〜1Vまでしか測れないっぽいからです(参考記事を参照下さい)。GND・3.3V・TOUTはそれぞれESP8266の該当する場所につなげて下さい。

この回路で、「ファイル」 > 「スケッチの例」 > 「Milkcocoa ESP8266 SDK」 > 「milkcocoa_esp8266_tout」を走らせると「何もしてない状態で900〜1000くらい」「手で光を遮ると600〜700くらい」の値が見られました。

ちゃんとデータが保存されているか、データストアでも確認してみましょう(画像内ではesp8266/lightになっていますが、スケッチの例にデフォルトで書かれているデータストアはesp8266/toutになっています)。

おわりに

今回は、ESP8266での実例を用いて、Milkcocoa Arduino SDK(現在はMilkcocoa ESP8266 SDK)の使い方について説明しました。

これまでもMQTTクライアントから利用可能だったのですが、やはり使いにくい点が見受けられたので、Arduino用のSDKを開発致しました。

ESP8266とMilkcocoaを使うことで、安価でかつ高速なIoT開発が実現できるかと思いますので、是非使って頂ければと思います。