AWS IoTとArduinoでセンシングしてみた

こんにちは、メディアシステム開発部の山浦です。

年が明けたばかりだし、なにか新しいことを始めたいと思いまして、β版から正式版になったAWS IoTを取り上げてみることにしました。

AWS IoTとは

昨年10月のre:Inventで発表され、同年12月に正式リリースされたAWSサービスの1つです。 IoTに特化しており、デバイス同士の接続やAWS SNS、DynamoDBなどと連携することができます。 これまでIoT環境を構築するには、メッセージブローカーの構築やセキュリティ対策などいくつものハードルがありましたが、AWSによってマネージドされたサービスとして提供されたことにより、IoTがより身近なものになりました。 AWS IoTとデバイスは、MQTTまたはHTTPSプロトコルを介して通信を行います。

気になる料金ですが、東京リージョンの場合
100 万通のメッセージあたり 8 USD
と設定されています。

IoTとは

Internet of Thingsの略です。 世の中の様々なモノがインターネットに接続する技術のことをさし、 第4次産業革命のキーワードともなっている、とてもホットな分野です。

目標

下記のような流れを実装し、AWS IoTがどのようなサービスかを知りたいと思います。

image
  1. Arduinoで光量をセンシング
  2. センシング結果をAWS IoTにパブリッシュ
  3. パブリッシュされた結果をAWS SNSでメール送信

Arduinoとは

初心者でも簡単に扱えるマイコンボードのことです。 さまざまなセンサと組み合わせることで、周囲の環境を感知することができます。 開発にはArduinoIDEという開発環境が用意されており、コーディングからプログラムの書き込みまでを一括して行うことができます。

AWS SNSの準備

それでは手始めにAWS SNSの設定から始めたいと思います。 こちらを最初に登録しておく必要があるため、AWS IoTを触りたい気持ちをグッとこらえて設定を行っていきます。

1. Topicの登録

image

Topicを作成します。AWS IoTでこのTopicを呼び出すことになります。

2. Subscriptionsの登録

image

Subscriptionsの設定をします。目標がメール通知なので、Protocolにemailを設定し、送り先のメールアドレスを登録します。

以上でAWS SNSの設定は完了です。

AWS IoTの準備

いよいよ本題のAWS IoTを設定してきます。 大きく分けて4つの項目を設定する必要があります。

top
  1. Thingの登録・・・デバイス自体の登録します。
  2. Ruleの定義・・・デバイスから受け取ったデータを処理するルールを定義します。
  3. Certificateの作成・・・証明書、秘密鍵、公開鍵を作成します。
  4. Policyの作成・・・AWS IoTの各種操作を許可するためのポリシーを作成します。

各設定を順番に行っていきます。CLIから行う方法もありますが、今回はすべての設定をコンソール画面から設定してみます。

1. Thingの設定

image

Nameを入力し、Createボタンで登録完了です。 Thingの設定はこれだけです。

2. Ruleの定義

image

まずはRuleの名前を決めます。 次に受け取ったデータを処理するルールを定義します。SQLになっているので直感で理解しやすいのが特徴です。 TopicFilterに設定した【topic/test】を設定した場合、同一のトピック名でパブリッシュされたデータを、次で定義するアクションに受け渡します。

image

パブリッシュされたデータをどのように処理するか定義します。 SNSとの連携を行いたい場合、【Send message as a push notification】を選択します。 (他にも、DynamoDB、Kinesis、Lambda、S3、SQSと様々なAWSサービスが選択可能です。)

続いて、一番最初に設定をしたAWS SNSの SNS Topic と Role Name を指定したら、Add Action をクリックしアクションを決定します。

最後にCreateボタンをクリックします。

3. Certificateの作成

image

証明書と秘密鍵と公開鍵を生成します。 既存のCSRから鍵を生成することもできますが、【1-Click certificate】を使用することが推奨されています。

image

鍵と証明書が生成されるとダウンロードすることができます。 鍵はこのタイミングでしかダウンロードできないので、忘れずにダウンロードしておく必要があります。

4. Policyの作成

image

デバイスに対して、AWS IoTの各種操作を許可するためのポリシーを作成します。 今回は全ての操作を許可するように設定します。 図の赤枠を入力したら、Createボタンをクリックします。

5. Certificateの有効化とThing、Policyのひも付け

image

最後にCertificateにThingとPolicyをひも付け、有効化を行います。 この行程を行うことで先ほどダウンロードした証明書と鍵が有効になります。

以上でAWS IoTの設定は全て完了です。

Arduinoの準備

Arduino側の設定は大きく分けて3つです。

  1. 回路の作成
  2. Arduinoに組み込むプログラムの作成
  3. Arduinoでセンシングしたデータを受け取りパブリッシュするプログラムの作成

1. 回路の作成

Arduino単体で光量をセンシングすることができないため、外部に回路を作ります。

image

実際の回路はこのようになりました。赤枠で囲んだものが照度センサです。 センサが受け取った値をアナログ0番ピンで取得できるようになっています。

2. Arduinoに組み込むプログラムの作成

センサの値を出力するプログラムを作成します。 言語はArduino言語という、C/C++をベースにした独自言語で使用します。

serial.ino

int val = 0;

void setup() {
    Serial.begin(9600);
}

void loop() {
    val = analogRead(0);
    Serial.println(val/4); 
    delay(1000);
}


アナログINの0番ピンからデータを受け取り出力します。

ArduinoIDEでコンパイルが通ったら、Arduinoに書き込んでおきます。

3. Arduinoでセンシングしたデータを受け取りパブリッシュするプログラムの作成

AWS IoTにパブリッシュするプログラムです。 MQTTで通信できれば言語の指定はありませんが、今回はRubyで書いてみました。

(Arduinoは単体で通信が行えないため、パブリッシュはPCを介して行います。)

前準備として、serialportとmqttというgemが必要なのでインストールしておきます。 mqttはRubyからMQTTプロトコルで通信を行うためのgem、serialportはシリアル通信をするためのgemです。

$ gem install mqtt
$ gem install serialport

serial.rb

require 'serialport'
require 'mqtt'

# Arduinoで設定したポート
port = '/dev/cu.usbmodem1411'

sp = SerialPort.new(port, 9600, 8, 1, SerialPort::NONE)

client = MQTT::Client.connect(host: 'YourEndpoint',
                                port: 8883,
                                ssl: true,
                                cert_file: 'certificate.pem.crt',
                                key_file: 'private.pem.key',
                                ca_file: 'rootCA.pem')

loop do
  sensor_val = sp.gets
  puts "Illuminance = " + sensor_val
  if sensor_val.to_i 

Illuminanceの値は、明 40 ~ 250 暗 程度の値を取るので、やや暗いところで実行したことが分かります。

Illuminanceの値が【50】を切った時にAWS IoTにパブリッシュされるので、明示的に光源を照度センサに近づけてみましょう。

image

値が小さくなっているのが分かるかと思います。 実際にパブリッシュされた文字列がメールで送信されているでしょうか。

image

届いていました! センシングされた値を基にパブリッシュされ、AWS IoTからSNS経由でメールが送信されたことが確認できました。

まとめ

AWS IoTを初めて使用してみましたが、設定から稼働までとても簡単にできました。他のAWSサービスとの連携が予想以上にスムーズに行えたことに驚きました。

今まで時間をとられていた環境構築の悩みをAWS IoTが解消してくれたので、あとはアイディア次第で面白いものを作っていけると思います。

今回はArduinoを使いましたが、もちろん他のIoTデバイスも使用可能なので、今後も色々と試していきたいと思います。

みなさまもステキなIoTライフを!