MQTTでArduino YunとmyThingsとつなげ、IoTをやってみた


今回、紹介するのはArduinoでもIoTができるよ! というものになります
例えば、こんな感じです
ArduinoでIoT
これは、スマホをサーバを経由し、Arduinoに命令を出し、ロボットアームを動かしています

IoTに関しての何かを作る時とか、そもそも自分の作ったデバイスをネットに繋げる時に選択肢として真っ先に上がるのは、RaspberryPiだと思います
しかし、実はArduinoもIoTに対して様々な取り組みをしており、当然ネットにつながるボードも出しているのです!
ArduinoのIoTへの取り組み

YunとTianと呼ばれているArduinoがボードがまさにそれです

ArduinoのほうがRaspberryPiよりも電気回路については優秀ですし、わかりやすいため電気回路、ハードウェアがメインのものを作る時はYunとTianを使うのがいいとも思います

というわけで早速やってみたいと思います!
今回はArduino Yunを使います

やるならIoTだよね! ということで日本製IoTアプリのmyThingsとつなげてみたいと思います

大雑把なシステム構成はこうなります

myThingsを使って、ボタンを押したらArduinoに通知がいくようにします
最終的には、毎朝7時でかつその日が晴れだったらArduinoに通知がいくします!

というわけで、やることは3つ
1. IDCFCloudの設定
2. myThingsの設定
3. Arduino Yunの設定

IDCFCloudの設定

サーバ構築

サーバを設定しましょう!
自分はここら辺の記事を参考しました!
myThingsをはじめよう - Part2: IDCFクラウドに「IDCF」チャンネルをセットアップする
myThingsのIDCFチャンネルサーバを簡単につくる

まず、IDCFCloudにアクセスし、一番安いサーバを作りましょう。初期登録が必要なので、登録がまだの方はそちらも行ってください。
そして、IPアドレスの設定を行い、それを先ほど作ったサーバと紐付けてください
自分のIPアドレスの設定はこんな感じです

環境の構築

ssh でサーバにはいって、下記のコマンドを実行しましょう! すると環境が構築できます

$ sudo apt-get update && sudo apt-get install -y git
$ mkdir ~/iot_apps && cd ~/iot_apps
$ git clone https://github.com/IDCFChannel/meshblu-compose
$ cd meshblu-compose
$ ./bootstrap.sh
$ docker-compose up -d openresty
$ cd ~/iot_apps/meshblu-compose
$ docker-compose run --rm iotutil register

それぞれの詳しいコマンドの意味はmyThingsをはじめよう - Part2: IDCFクラウドに「IDCF」チャンネルをセットアップするをみてください

210.XXX から始まるIPアドレスと、下記の2つの実行コマンドの結果はこの後も使うので、メモ帳などに残しておきましょう

$ docker-compose run --rm iotutil owner
$ docker-compose run --rm iotutil list

myThingsの設定

アプリのダウンロード

myThingsのアプリを入れましょう!

組み合わせの設定と認証

次にこのQRコードを読み込んで、組み合わせを作ってください

「ボタンを押したら、IDCFサーバに通知する」組み合わせです

すると認証画面が出てくると思います

IPアドレスには、さきほどのIDCFのIPアドレス(210から始まるものです)
認証トークンには、IDCFで実行したこちらのコマンドで表示されたmeshblu_auth_tokenを入力してください

$ docker-compose run --rm iotutil owner

myThingsの設定はこれだけです!!

Arduinoの設定

接続先のwifiの設定

まず、wifiの設定をします
ArduinoYunに電源を入れて、しばらく時間をおくとwifiの一覧に「Arduino Yun-XXXXXX」というものが出てきます
それに接続したあとに、http://arduino.local を開いてみてください!
すると、Arduinoの設定が始まります(初期パスワードは「arduino」です)
今後、Arduinoがどのwifiにつなぐか、といった設定を行ってください

最後まで設定すると、Arduinoの再起動が始まります
これまた時間を置いた後、さきほどArduinoがつながるwifiにPCもつなげ再度、http://arduino.local を開いてみてください
無事に開くことができたら、wifiの設定は完了です!

http://arduino.local を開いた画面

MQTTライブラリの追加

MQTTで通信を行う為、ライブラリを入れる必要があります
今回はarduino-mqttを使っていきます!(名前わかりやすい)
https://github.com/256dpi/arduino-mqtt

まず、まるごどzipでDownloadします

そして、Arduinoから
スケッチ -> ライブラリをインクルード → .ZIP形式でライブラリをインストール
で先ほどダウンロードしたファイルを選んでください

すると、Contributedライブラリの一覧に「MQTT」というのが増えていると思います

これでライブラリの追加の完了です!

プログラムの書き込み

https://github.com/hhata-hhajime/arduino_MQTT_sample/blob/master/simple_connect
にソースコードを置きました
適当に変数を書き換えてください
SERVER-IPADDRESSには、210から始まるIDCFのIPアドレス
ACTION1-UUIDとACTION1-TOKENには、IDCFで

$ docker-compose run --rm iotutil list

を実行した結果のaction-1のuuidとtokenを入力してください
プログラムの全文をこちらにも書いておきます

// SERVER-IPADDRESS, ACTION1-UUID, ACTION1-TOKEN is value
// sample values↓
// SERVER-IPADDRESS: 210.140.175.00
// ACTION1-UUID: 88d6d5f5-9553-456f-9264-389xxxxxxxx
// ACTION1-TOKEN: a828xxxxx

#include <Bridge.h>
#include <YunMQTTClient.h>


YunMQTTClient client;

void setup() {
  Bridge.begin();
  SerialUSB.begin(57600);
  client.begin("SERVER-IPADDRESS");
  connect();
}

void connect() {
  SerialUSB.print("connecting...");
  while (!client.connect("arduino", "ACTION1-UUID", "ACTION1-TOKEN")) {
    SerialUSB.print(".");
    delay(500);
  }

  SerialUSB.println("\nconnected!");
  client.subscribe("ACTION1-UUID");
}

void loop() {
  client.loop();
  if(!client.connected()) {
    connect();
  }
}

void messageReceived(String topic, String payload, char * bytes, unsigned int length) {
  SerialUSB.print("messageReceived: ");
  SerialUSB.print(topic);
  SerialUSB.print(" - ");
  SerialUSB.print(payload);
  SerialUSB.println();

  if(payload.indexOf("connect_to_arduino") > 0)
  {
    SerialUSB.println("start something");
  }
}

ポートの設定をしたあとに書き込みボタンで完了です!
ポートの設定はこんな感じです

接続チェック!

最後に本当にできているか確認します

Arduinoでシリアルモニタを開き、myThingsでさっき作った組み合わせを実行します
そうすると、Arduinoは下記のようにメッセージを受け取れます

connecting...
connected!
messageReceived: 88d6d5f5-9553-456f-9264-389c7c71d6a5 - {"topic":"message","data":{"devices":["88d6d5f5-9553-456f-9264-389c7c71d6a5"],"payload":"connect_to_arduino!","fromUuid":"86c23cef-7e45-46d0-9a22-4556114c188c"}}

ArduinoでIoT
payloadに組み合わせのメッセージ部分に入力したテキストが取得できるので、ここから条件式をつけて、いろいろアウトプットを変化させることもできます

長くなってしまいましたが、これで接続できました!
ちなみに↓の組み合わせを使うと、自動で晴れの日の朝7時になったらArduinoに通知がいくようになります!

「天気で晴れだったら、IDCFで通知する」組み合わせです!

ちなみに自分はこれで自動で動くカーテンを自作中です

それでは、みなさん良いIoTライフを!