M5Stack(ESP32マイコン)とAWS IoTで始めるIoT入門

f:id:karaage:20180902141927j:plain:w640

M5Stack(ESP32マイコン)とAWSを繋ぐテスト

 最近ESP32マイコンが色々な用途につかえそうで面白そうだなーと思っています。Interface 2018年9月の特集は、色々な応用例も書かれていて中々良かったです。

Interface(インターフェース) 2018年 09 月号

Interface(インターフェース) 2018年 09 月号

f:id:karaage:20180902141945j:plain:w640

 とりあえず、本に書かれていたESP32マイコンとAWSを繋いでみるってところをやって見ました。本に書かれている内容や、ネットにも多く公開されている内容そのままなのですが、いつもの通り実際やってみると細かくつまづいたりしたのと、デバイスとしてM5Stackを使ったりしたので、自分へのメモとして書いておきたいと思います。

ESP32マイコン側の環境設定

 ESP32マイコンの開発環境としては、以下2通りを試しました。

  • M5Stack
  • ESPr Developer 32

 M5Stackは、ESP32マイコンに加えてディスプレイやセンサまで全部入りの今話題のデバイスです。M5Stackでの環境設定は、以前実施した以下内容でOKでした。

M5Stack Basic

M5Stack Basic

 単純にESP32マイコン単体の開発環境が欲しい場合は、ESPr Developer 32がUSBに繋げて、そのままArduino IDEで開発ができるので、良さそうでした。スイッチサイエンスさんで購入できます。

ESPr Developer 32

ESPr Developer 32

 秋月さんでも同じようなデバイスが安い価格で買えますが、スイッチサイエンスさんの方が電源周りの回路にお金をかけている分安定しているらしいです(自分で検証はしていません)。

f:id:karaage:20180902141927j:plain:w640

 ESPr Developer 32は、以下のようにPCに繋ぎます。環境設定はM5Stackとほぼ同じですが、Arduino IDEのボード周りの環境設定が異なります(ESP32 Dev Moduleにする必要があります)。具体的には、以下のように設定しました。

f:id:karaage:20180811123709p:plain:w480

 なお、Arduino IDE共通の話ですが、Arduinoの設定を以下のように設定すると詳しくログが見れるので、デバッグが捗ります。通常エラーで原因が分からず詰まった時は設定してみましょう(全然知らなかったです)。

「ツール -> Core Debug Level -> Verbose」

f:id:karaage:20180812215744p:plain:w480

AWSの準備

 AWS側の設定です。AWSの「IoT Core」で操作を行います。ブラウザはGoogle Chromeを使った方が良さそうでした。AWSのIoT Coreの概要やできることに関しては、以下記事参照下さい。

 要は、AWSの「IoT Core」を使ってAWSにセキュアにデータを送れて、後はAWSの機能でデータを使って色々できるってことみたいです(AWS初心者なので、勘違いしてたらすみません)。

AWSアカウントの取得

 以下のアドレスから新規アカウントを登録します(既に持っている人は次に進んでください。)

AWS Console - Signup

 以下画面の「IoT デバイスを接続」をクリックして「IoT Core」の画面に遷移します。 f:id:karaage:20180813175220j:plain:w640

ポリシーの登録

 「安全性」->「ポリシー」を選択して「作成」をクリック

 アドバンスドモードに切り替えて、以下のようにステートメントを追加します。

f:id:karaage:20180811150938p:plain:w640

 ステートメントのコードは以下

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iot:*",
      "Resource": "*"
    }
  ]
}

モノの登録

 証明書作成してダウンロードします。

f:id:karaage:20180811171918p:plain:w640

 証明書を全てダウンロードします。Root CAに関しては、CAダウンロード先のリンクに、複数の証明書があるのですが、一番上の「VeriSign Class 3 Public Primary G5 root CA certificate」でOKでした。

f:id:karaage:20180811172049j:plain:w640

 証明書に先ほどのポリシーをアタッチしておきましょう。

ESP32マイコン側の設定

 AWS IoTと通信するためのMQTTライブラリを入れます。「スケッチ」-> 「ライブラリをインクルード」-> 「ライブラリの管理」からライブラリマネージャーを開いて、以下のように「PubSubClient」で検索します。複数出てきますが、以下の赤枠のものをインストールしましょう。

f:id:karaage:20180811123645j:plain:w640

 また、ここでパケットサイズを増やしておく必要があります(詳細は本記事末尾の参考サイトの記事等を参照下さい)。

 PubSubClient.hというファイルを編集します。私の場合は以下の場所にありました。

~/Documents/Arduino/libraries/PubSubClient/src/PubSubClient.h

 以下の通り2048に設定しました。

#define MQTT_MAX_PACKET_SIZE 2048

ESP32マイコンとAWSの通信とモニタリング

 これで一通り準備ができたので、ESP32マイコンとAWSを連携させてみましょう。

 ソフトは、Interfaceや参考リンクのネット情報を元に作成して以下に公開しました。

 ESPr Developer 32の場合は「esp32-iot」というディレクトリのソフトを、M5Stackの場合は「m5stack-iot」というディレクトリの中のソフトを使いましょう。使用前にWiFiやAWSの環境に合わせて以下の空欄やxxxとなっている箇所を修正しておいて下さい。

// WiFi Setting
const char* ssid = "";
const char* password = "";

// AWS IoT Setting
const char* awsEndpoint = "xxx.xxx.xxx.amazonaws.com";
const int awsPort = 8883;
const char* pubTopic = "pub01";
const char* rootCA = "-----BEGIN CERTIFICATE-----\n" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n" \
"-----END CERTIFICATE-----\n";
const char* certificate = "-----BEGIN CERTIFICATE-----\n" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n" \
"-----END CERTIFICATE-----\n";
const char* privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n" \
"-----END RSA PRIVATE KEY-----\n";

 Arduino IDEでビルドして、実行するとAWSとの通信が始まります。プログラムはpub01というトピックに時間に応じてインクリメント(増加)し続ける数字を投げているだけなので、pub01というトピックをAWS側でモニタリングしてやるだけです。

 AWSのMQTTクライアントで、pub01を追加してやります。

f:id:karaage:20180812215651j:plain:w640

 あとは、以下のように増えていく数字がモニタリングできます f:id:karaage:20180812215633j:plain:w640

 M5StackでAWSと通信してモニタリングしている様子です

M5StackとAWSでIoT的なことやってる。ただカウントしてるだけなのでめちゃ地味

karaageさん(@karaage)がシェアした投稿 -

トラブルシューティング

 M5StackがWiFiに接続しなくなって困ってしまったことがあったのですが、以下のとおりで解決しました。

 同様に困っている人は、WiFi.beginの前に以下を入れてみましょう。

WiFi.disconnect(true);
delay(1000);

まとめ

 ESP32マイコンとAWSを連携させてみました。今回は数字をカウントしてモニタリングするだけの例だったので、地味で全然面白く無いですが、色々IoT的な応用例が作れそうですね。IoT的な使い方をするとき課題になりそうなのは電力ですが、ESP32マイコンは省電力で動かせるディープスリープモードも搭載されているので、うまく使えば長期間のモバイル電源での運用も期待できそうです。

 また、そのあたりもうまく工夫して、面白いアプリケーションが作りたいなと思っています。

Interface(インターフェース) 2018年 09 月号

Interface(インターフェース) 2018年 09 月号

M5Stack Basic

M5Stack Basic

ESPr Developer 32

ESPr Developer 32

参考リンク

ESP32マイコン関係の設定

ESPr Developer 32 で WROOM-32 を Wi-Fi に繋いでみる - Tech Blog by Akanuma Hiroaki

ESP32 の Wi-Fi のみ OFF および温度・湿度・気圧センサー BME280 の再調整など | mgo-tec電子工作

ESP32 ( ESP-WROOM-32 , M5Stack )自分的 トラブルシューティング まとめ | mgo-tec電子工作

ESP32とAWS IoTとの連携

ESP32〜AWS IoTでMQTT通信して詰んだ話【ClientID】

ESP32でAWS IoTに繋いでThing Shadowを弄る – コーヒーサーバは香炉である

ESP32でAWS IoTに繋いでThing Shadowを弄る(2) トラブルシューティング編 – コーヒーサーバは香炉である

ESP32 DeveloperでAWS IoTを動かそうとしてハマったメモ – 1ft-seabass.jp.MEMO

低電力関連

【ESP32】スリープモードについて - ソースに絡まるエスカルゴ

関連記事