茱萸note

電子工作の備忘録と旅行の記録

Alexa Arduino AWS ESP8266 IoT マイコン 電子工作

ESP8266 と AWS IoT を連携させる【Alexa×Arduino その1】

投稿日:2020年12月9日 更新日:

AWS IoT Core と ESP8266 を連携させて、AWS から ESP8266 の LED を操作できるようにします。最終的には、Alexa を搭載した Amazon Echo 等を使って ESP8266(Arduino)を制御するのが目標です。


目次


前回の記事では、Alexa で ESP8266 を制御する方法を複数紹介しました。

今回と次回の記事は、Alexa Smart Home Skill と AWS IoT を組み合わせることで Alexa から ESP8266 に接続した LED を操作する方法を具体的に説明しようと思います。

今回の記事は、AWS IoT Core と ESP8266 の接続の部分を実装していきます。

AWSアカウントを作成する

AWSアカウントを持っていなければ、作成します。確かクレジットカード情報の登録が必須だった気がします。持ってない場合どうなるのでしょうか。わかりません。

https://console.aws.amazon.com/console/home

アカウントを作成し、ログインをすると、コンソール画面が現れます。コンソール画面が現れたら、左上の『サービス』をクリック。すると、サービスの一覧画面が表示され、ここからAWSの各種サービスにアクセスできます。今回使うのは『IoT Core』『IAM』『Lambda』です。

AWSは自覚なき高額請求に悩まされる人や、不正利用があとを絶ちません。定期的に『Billing』を確認して、請求額を把握しておく必要があります。

https://console.aws.amazon.com/billing/home

IoT Core で“モノ”を用意する

サービスの一覧画面から『IoT Core』にアクセスします。

https://us-west-2.console.aws.amazon.com/iot/home

リージョンを変更する

リージョンの変更をします。リージョンとは、サーバーの場所です。リージョンによって利用量が異なるのですが、無料利用枠に収まる予定なのでどこでも良いと思います。後述する『Lambda』ではリージョンを「オレゴン」に設定する必要があるので、『IoT Core』のリージョンも「オレゴン」に設定しておくと良いと思います。

新しい“モノ”を作成する

『管理』の『モノ』を選択します。『モノの登録』を選択します。

『単一のモノを作成する』を選択。

デバイスの名前を決めて入力します。ここでは「ESP8266」に設定します。

名前以外の欄はイジらないで大丈夫です。『次へ』を選択。

『証明書なしでモノを作成』を選択。

『ESP8266』という“モノ”が追加されました。これをクリックすると、詳細を確認できます。

『相互作用』を選択。ここにエンドポイントが書いてあります。Arduino IDE でプログラムを書く時に必要になる情報です。

IAM でユーザーを作成しポリシーを付与する

サービスの一覧画面から『IAM』にアクセスします。

https://console.aws.amazon.com/iam/home

IAM ユーザ を追加します。

『アクセス管理』の『ユーザー』を選択。『ユーザーを追加』を選択。

ユーザー名を決めて入力します。『ESP8266User』とでもしておきます。そして『プログラムによるアクセス』にチェックを付けます。

アクセス許可の設定です。『既存のポリシーを直接アタッチ』を選択。検索欄に「IoT」と入力して検索し、『AWSIoTFullAccess』を選択。本当はもう少し権限を絞ったほうが安全ですが、面倒なのでフルアクセスを許可してしまいます

タグの追加はよくわからないので何もせずに次のステップへ。

アクセス権限が適切に設定されていることを確認してユーザーを作成します。

『.csvのダウンロード』をすると、『アクセスキー』と『シークレットアクセスキー』が入手できます。この画面でも『表示』を押せば確認できます。

この画面を閉じると、二度と確認できなくなるので、必ず .csvのダウンロード をするか、メモっておきましょう。

Arduino IDE で ESP8266 のプログラムを書く

Arduino IDE のインストールは済んでいる前提で進めます。

ESP8266を使う準備をする

環境設定の『追加のボードマネージャのURL』欄に以下を入力します。

https://arduino.esp8266.com/stable/package_esp8266com_index.json

『ツール → ボード:…. → ボードマネージャ』からボードマネージャを開きます。『ESP8266』とかで検索し、『esp8266』ライブラリをインストールします。今回私が使ったバージョンは、『2.7.3』です。 『2.7.3』では「Exception (9)」が頻発してしまうので、バグ修正済みの『2.7.4』以降を使ってください。

ボードの選択と設定をします。私は下の画像のとおりに設定しています。正直どこをどうするのが正解なのか私は分かってません

ライブラリをダウンロードしてインストールする

今回必要な Arduino ライブラリは、以下の通りです。

『aws-sdk-arduino』は『↓Code』の『Download ZIP』からダウンロードしてください。それ以外の3つのライブラリは、Release の該当するバージョンの Assets から .zip ファイルをダウンロードしてください。

『スケッチ → ライブラリをインクルード → .ZIP形式のライブラリをインストール』で、ダウンロードした4つのライブラリを1つずつインストールします。

プログラムを書く

下のリンクのプログラム(スケッチ)をコピペしてください。

コピペが済んだら、何箇所か修正を加える必要があります。

まずは、IAM でユーザーを作った際にメモっておいた『アクセスキー』と『シークレットアクセスキー』を記述します。

ちなみに、これらの情報は外部に漏れるとマズいものなので、安易に GitHub のパブリックリポジトリに Push しないでください。GitHub や Amazon から怒られます。体験談

C++💩// AWS IoT Core config
const char *aws_iam_key = "XXXXXXXXXXXXXXXXXXXX";
const char *aws_iam_secret_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";

IoT Core でモノを作った際にメモっておいたエンドポイントを記述します。

リージョンも記述します。オレゴンの場合は us-west-2 です。

const char *aws_endpoint = "xxxxxxxxxxxxxxxxxx.iot.us-west-2.amazonaws.com";
const char *aws_region = "us-west-2";

IoT Core のモノの名前に合わせて、トピック名を変更します。『ESP8266』というデバイス名なら "$aws/things/ESP8266/shadow/..." となります。

Topic Shadow の詳細についてはあとで説明します。

const char *aws_topic_shadow = "$aws/things/ESP8266/shadow/update";
const char *aws_topic_shadow_delta = "$aws/things/ESP8266/shadow/update/delta";

最後に、接続する WiFi の設定をします。

// WiFi config
#define WIFI_SSID "XXXXXXXXXXXXX"
#define WIFI_PASS "xxxxxxxxxxxxx"

以上でプログラムの修正箇所は以上です。

ESP8266 に LED を接続する

今回は LED をチカチカさせたいので、LED をつなぎます。今回は IO4 IO16 に LED を接続します。保護抵抗(電流制限抵抗)を介すのを忘れずに。

参考として、秋月の ESP-WROOM-02FT234X 超小型シリアル変換モジュールを用いた場合の回路図・配線図を示します。

ESP8266 にプログラムを書き込む

プログラム(スケッチ)を ESP8266 に書き込みましょう。

↑の通りに配線した場合は、IO0 ピンに繋いだスイッチを押したまま Reset ピンに繋いだスイッチを押す→離すして、ブートモードに突入させてから書き込む必要があります。

書き込みを終えたら、シリアルモニタを起動して、出力を確認してみましょう。

上のように出力されていれば、WiFi への接続、AWS IoT Core への接続が成功しています。

IoT Core のテスト画面から ESP8266 の LED を操作する

ESP8266 の電源を入れ、ESP8266 が AWS IoT Core に接続されるのを待ちます。30秒弱かかります。

AWS の『IoT Core』にアクセスし、『テスト』を選択します。

『発行』の『トピック欄』には、 $aws/things/ESP8266/shadow/update を入力します。

『メッセージ欄』は、一度全ての項目を削除して、以下の JSON メッセージを記述します。

json💩{
  "state": {
    "desired": {
      "led" : true
    }
  }
}

入力が済んだら、『トピックに発行』します。

すると、LED が光ります!

LED を消すには、"led" : false にして、『トピックを発行』します。

Thing Shadow を理解する

AWS IoT Core の Thing Shadow について理解を深めます。

Thing Shadow とは何か

AWS の『IoT Core』にアクセスし、『管理』『モノ』で、作成したデバイスを選択します。

『シャドウ』を選択すると、「Classic Shadow」と表示されています。これが Thing Shadow です。「Classic Shadow」を選択してみます。

『シャドウステータス』に JSON らしきものが表示されています。

{
  "desired": {
    "welcome": "aws-iot",
    "led": false
  },
  "reported": {
    "welcome": "aws-iot",
    "led": false
  }
}

先ほど、『テスト』画面で Publish したメッセージは、モノ『ESP8266』の Thing Shadow の desired の値を更新するものです。

『シャドウステータス』を確認しながら、『テスト』画面でメッセージを発行してみてください。"desired" : { "led" : true } が変化すると思います。

ESP8266 は、$aws/things/ESP8266/shadow/update/delta を Subscribe しています。.../delta を Subscribe していると desiredreported に差分が生じた時に通知がいきます。"desired" : { "led" : true } が変更されると、desiredreported に差が生じ、.../delta を Subscribe している ESP8266 のコールバック関数が呼ばれます。コールバック関数内では、LED の点灯/消灯と、Thing Shadow の reported を更新する処理をしています。

『テスト』画面で Thing Shadow の desired を更新すると、reporteddesired に差が生じます。すると、ESP8266 のコールバック関数が呼ばれて LED が点灯/消灯 され、Thing Shadow の reported が更新されます。

今回、『テスト』画面で Thing Shadow の desired を更新しましたが、これを Alexa から更新できるようになると、Alexa で ESP8266 を制御できるようになると思いませんか???


次回は、AWS Lambda で Alexa Smart Home Skill を実装し、Alexa から ESP8266 に接続した LED を制御できるようにします。

-電子工作
-, , , , , ,


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

WSLでGUIアプリを起動させる

WSLでGUIアプリを動かすためにVcXsrvというX Window サーバーをインストールします。

ESP8266 で Tp-Link のスマートプラグ『Tapo P105』を直接操作する

Tp-Link のスマートプラグ『Tapo P105』をアプリや IFTTT といった外部サービスを用いずに、ESP8266 から直接操作してみます。

プロキシ設定が必要な学内LANに接続するときに役に立つスクリプト

プロキシ設定が必要な学内 or 社内LANに接続する際のプロキシ設定の切り替えをしやすくするスクリプトを用意します。

【Emacs万歳!】WSLでEmacsを使う

WSLでEmacsを使うことを強要されている人々に向けて書きます。GUI版Emacsを動かす方法も説明します。

Online Storageの画像を貼る

Online Storage上にアップロードした画像をBlog等に貼る方法を考察します。