2015.07.01

【電子工作】Arduino YúnをGoogle DocsやTwitterと連携してみた

始めに

こんにちは。次世代システム研究室のT.D.Qです。
ウェブアプリケーション開発やスマホアプリ開発業務を日々取り組んできていますが、IoTにも非常に面白く感じましたので、部署内のIoT研究チームに参加し、電子工作を楽しむことができるマイコンのArduino(アルデュイーノ)Yúnを使って、気軽に始める電子工作プログラミングをチャレンジしました。Arduino YúnのAM2302センサーで温度と湿度データを収集し、クラウドサービスのGoogle DocsとTwitterへ配信してみましたので、今回のエントリーでこの実験についてご紹介したいと思います。

Arduinoとは

Arduinoとは制御するプログラムを書き込むマイコンとセンサーやLEDなどを接続する入出力ピン(I/Oピン)、C言語がベースとなっている言語で構成されたマイコンボードです。Uno、Megaなど数あるArduinoシリーズのうち、YúnはEthernetおよびWi-Fiの機能を有しているのが特徴です。公式ページはこちら

Arduino Yúnをインターネットに接続する

YúnにmicroUSBケーブルを繋いで電源を供給します。電源を入れるとLinuxが起動し、ボードの上にある白いLEDが点くあたりで無線LANも使えるようになっています。Arduino Yúnがインターネットに接続するため、PCのブラウザでYúnの設定サイトにアクセスし、無線ネットワークの選択とパスワードを正しく入力だけで完了できます。
yun_webpanel_config yun_webpanel_homepage_1
設定完了したら、SSHなどでYúnにアクセスし、pingコマンドなどでインターネットの接続を確認します。
yun_ping_to_gmo

AM2302センサーとの配線作業

AM2302は、湿度が0~100%RH、温度が-40~125℃を計測可能なデジタル湿気及び温度検出センサーです。AM2302から湿度と温度のデータを収集するため、以下のようにYúnとAM2302を配線します。
AM2303_Arduino_yun

AM2302からの温度及び湿度を収集するプログラムを実装します
/*
  Arduino Yunの検証プログラム
  AM2302 Temperature / Humidity Sensor (DHT22)で室内の温度・湿度情報を取得する
*/
#include "DHT.h"          // DHT & AM2302センサーのライブラリ

// AM2302センサーへ接続するデータPin
#define DHTPIN 8 //センサーを接続しているピンの番号
#define DHTTYPE DHT22       // DHT 22  (AM2302)

DHT dht(DHTPIN, DHTTYPE);   // LED pins

// Variables
float humidity;
float temperature;

//設定
void setup() {
  // Setup serial monitor
  Serial.begin(9600);

  // Wait 3 seconds
  delay(3000);

  //AM2302の初期化
  dht.begin();
}

//メイン処理
void loop() {

  //センサーから温度値を読み出します。読込み失敗なら"NAN"を返す
  humidity = dht.readHumidity();
  //センサーから湿度値を読み出します。読込み失敗なら"NAN"を返す
  temperature = dht.readTemperature();

  // 温度と湿度が取得できたかチェックする
  if (isnan(temperature) || isnan(humidity)) {
    //シリアルモニターに出力する
    Serial.println(F("Failed to read from DHT"));
  }
  else {
    //シリアルモニターに出力する
    printToSerialMonitor(temperature, humidity);
  }

  // 3秒後に繰り返す
  delay(3000);
}

//シリアルモニターに出力する
void printToSerialMonitor(float temperature, float humidity) {
  Serial.print(F("Humidity: "));
  Serial.print(humidity);
  Serial.print(F(" %\t"));
  Serial.print(F("Temperature: "));
  Serial.print(temperature);
  Serial.println(F(" C"));
}
プログラム実行すると、Arduinoスケッチのシリアルモニターに数値が出ます。
serial_monitor
上記はスケッチのシリアル表示画面の湿度・温度を読込む処理結果です。
読み込まれた湿度(%)はHumidity、温度値(℃)はTemperatureとして表示されます。このときGoogleで天気情報の数値は湿度78%で温度22℃でしたので、センサーの精度が確認できないが、室内の温度が外より高く、湿度が外より低いことだけ確認できました。

収集したデータをクラウドサービスへ配信する

Yúnからクラウドサービス(Youtube、Dropbox、Google DocsやTwitterなど)にデータを配信するため、連携するウェブサービスが必要です。 今回の実験で、ArduinoのパートナーであるTembooというウェブサービスを使って、YúnからGoogle DocsやTwitterに連携するAPIを叩いて、センサーデータを送信します。

Tembooとは

TembooはIoT向けのプラットフォームであり、クラウドサービスへの接続するため、Arduino Yúnに100以上のAPIを提供しています。TembooのChoreos(連携処理)で、Arduino Yúnがクラウドサービス(Dropbox、Facebook、Google、Twitterなど)と簡単に連携できます。TembooとArduinoの連携の詳細についてはこちら

Tembooによるインターネットへの接続(http://www.arduino.cc/en/Guide/ArduinoYun)



無料プランで1ヶ月間にTembooのAPIを250回、データ通信量が1GBまで使用できます。Tembooのアカウントを登録し、ログインすると以下のイメージでマイページが表示されます。
temboo_dashboard

Google DocsにAM2302センサーのデータを記録してみる

まず、Google Docsに「ArudinoSensorData」というSpreadSheetを作成します。Google Docsと連携するため、GoogleからクライアントID(ClientID)、クライアントシークレット(ClientSecret)、更新トークン(RefreshToken)の認証情報が必要です。
Google Developer Consoleで今回の実験用のプロジェクトを作成し、ClientIDとClientSecretが作成されます。
google project
上記のクライアント認証情報でTembooのOath処理を行い、TembooがGoogle Docsへのアクセスを許可します。設定完了したらRefreshToken情報を取得できます。

ArduinoからGoogle Docsへデータを送信するプログラムを実装してみます。ソースが少し長いのでGitHubへ公開しましたフルソースを参照してください。
// Google Docsにデータを送信するメソッド
void sendToGoogleDocs(float temperature, float humidity) {
  // Format data
  String data = genGoogleDocsData(temperature, humidity);
  //Exe Temboo api
  runAppendRow(data);
}

//配信データを生成する
String genGoogleDocsData(float temperature, float humidity) {
  // Restart the date process:
  if (!date.running())  {
    date.begin("date");
    date.addParameter("+%F-%T");
    date.run();
  }

  // 時刻データを読み込み
  String timeString = date.readString();

  // Google Docs APIのデータフォーマットを生成する
  String data =""; 
  data = data + timeString + "," + String(temperature) + "," + String(humidity);
  Serial.println("Upload to Google docs: " + data);
  return data;

}

//TembooのAPIを実行する
void runAppendRow(String data) {
  // テストなので、APIの実行回数を制限する
  if (numRuns <= maxRuns) {
    Serial.println("Running AppendRow - Run #" + String(numRuns++));

    TembooChoreo AppendRowChoreo;

    // Tembooクライアントを初期化
    AppendRowChoreo.begin();

    // Tembooアカウント情報を設定
    AppendRowChoreo.setAccountName(TEMBOO_ACCOUNT);
    AppendRowChoreo.setAppKeyName(TEMBOO_APP_KEY_NAME);
    AppendRowChoreo.setAppKey(TEMBOO_APP_KEY);

    // Google Docsの認証情報や配信データを設定する
    AppendRowChoreo.addInput("ClientSecret", GOOGLE_DOCS_CLIENT_SECRET);
    AppendRowChoreo.addInput("RefreshToken", GOOGLE_DOCS_REFRESH_TOKEN);
    AppendRowChoreo.addInput("RowData", data);
    AppendRowChoreo.addInput("SpreadsheetTitle", SPREADSHEET_TITLE);
    AppendRowChoreo.addInput("ClientID", GOOGLE_DOCS_CLIENT_ID);

    // Temboo Library(choreo)を設定する
    AppendRowChoreo.setChoreo("/Library/Google/Spreadsheets/AppendRow");

    // データ配信処理を実行
    AppendRowChoreo.run();

	//処理結果をシリアルに出力する
    while (AppendRowChoreo.available()) {
      char c = AppendRowChoreo.read();
      Serial.print(c);
    }
    AppendRowChoreo.close();
  }
}

実装したプログラムを実行してみると、Google Docsにセンサーデータを記録されたこと確認できました
google_spreadsheet2

収集したデータをTwitterに配信してみる

Google Docsと同じように、TembooAPIを使ってArduino YúnからTwitterへの配信を試したいと思います。
連携するため、Temboo がTwitterへのアクセスを許可する必要です。そのため、Twitterでアプリを生成し、認証情報でTembooのAuth処理を実行します。
次は、ArduinoからTwitterへ配信するため、プログラムを実装します。フルソースも、興味があれば、Githubの参照をお願いします。メインの部分は以下の通りです。
//Twitterへデータを配信する
void postToTwitter(float temperature, float humidity)
{
  // テストなので、APIの実行回数を制限する
  if (numRuns <= maxRuns) {

    Serial.println("Running SendATweet - Run #" + String(numRuns++) + "...");

    // define the text of the tweet we want to send
    String tweetText("My Arduino Yun has been running for " + String(millis()) + " milliseconds. Data collected from AM2302 sensor: temperature=" +  String(temperature)  + " degree C, humidity=" +  String(humidity) + "%");
    //Output to Serial monitor
    Serial.println("Twist data=" + tweetText); 
    
    TembooChoreo StatusesUpdateChoreo;

    // Tembooクライアントを初期化
    StatusesUpdateChoreo.begin();

    // Tembooアカウント情報を設定
    StatusesUpdateChoreo.setAccountName(TEMBOO_ACCOUNT);
    StatusesUpdateChoreo.setAppKeyName(TEMBOO_APP_KEY_NAME);
    StatusesUpdateChoreo.setAppKey(TEMBOO_APP_KEY);

    // Twitterアプリの認証情報を設定する
    StatusesUpdateChoreo.addInput("ConsumerKey", TWITTER_API_KEY);
    StatusesUpdateChoreo.addInput("ConsumerSecret", TWITTER_API_SECRET);
    StatusesUpdateChoreo.addInput("AccessToken", TWITTER_ACCESS_TOKEN);
    StatusesUpdateChoreo.addInput("AccessTokenSecret", TWITTER_ACCESS_TOKEN_SECRET);

    // Tweetデータを設定する
    StatusesUpdateChoreo.addInput("StatusUpdate", tweetText);
        
    // Temboo Library(choreo)を設定する
    StatusesUpdateChoreo.setChoreo("/Library/Twitter/Tweets/StatusesUpdate");
    
    // データ配信処理を実行
    unsigned int returnCode = StatusesUpdateChoreo.run();

    // 正常終了の場合は、処理コードが0です
    if (returnCode == 0) {
      Serial.println("Success! Tweet sent!");
    } else {
      // 異常終了の場合は、エラーメッセージをシリアルモニタに出力する
      while (StatusesUpdateChoreo.available()) {
        char c = StatusesUpdateChoreo.read();
        Serial.print(c);
      }
    }
    StatusesUpdateChoreo.close();
  }
}

準備できたので、プログラムをマイコンボードへ書き込んでテストしましょう。Arduino Yúnが自動的にTwitterへ接続し、センサーから読み込んだ温度・湿度をTwistするはずです。しばらく待つと自分のTwitterにArduinoから収集した情報を投稿されました!!
twitter_arduino

最後に

いかがでしょうか。これまで、Arduino YúnにAM2302センサーを接続して周辺環境の温度・湿度数字を取得することができました。また、Arduinoに強く連携しているTembooというウェブサービスを経由してArduino Yúnから収集したデータをクラウドサービスに配信し、データを保存したり、発信したりする環境が用意できました。Arduino Yún、センサーやクラウドサービスの力でIoT関連の面白いアイディアは他にもいろいろありますが、それはまた次の機会に。

参考文献

モノのインターネット(Internet of Things : IoT)
Guide to the Arduino Yún
DHT temperature & humidity sensors
Your Arduino Yún comes loaded with Temboo

次世代システム研究室では、アプリケーション開発や設計を行うアーキテクトを募集しています。アプリケーション開発者の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。

皆さんのご応募をお待ちしています。

  • Twitter
  • Facebook
  • はてなブックマークに追加

グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。

 
  • AI研究開発室
  • 大阪研究開発グループ

関連記事