ESP32 DevKitC とAmazon FreeRTOSでIoT Core にメッセージを送信するプログラムを試してみた | そう備忘録

ESP32 DevKitC とAmazon FreeRTOSでIoT Core にメッセージを送信するプログラムを試してみた

Amazon FreeRTOS

Interface誌の2021年4月号に Amazon×マイコン FreeRTOS入門が載っていたので遅ればせながら試してみた。

FreeRTOS(リアルタイムのオペレーティングシステム)を2017年に Amazon が買収して Amazon FreeRTOS として展開している。

  • 軽量でシンプルなRTOS(Real Time Operating System)
  • Real Time OS なので一定時間内にタスクを実行する等のリアルタイム性を要求される処理に向いている
  • AWS IoT Core に接続が容易(IoTに対応)
  • 製品にも使いやすいMITライセンス(自分で改変したソースコードは公開が必須では無い。元々のFreeRTOSはMITライセンスだったので商用目的では若干使いづらかった)
  • セキュリティ機能が用意されている(公開鍵方式でAWSに接続して暗号化される)

等の特徴がある。

雑誌に載っていた手順に従ってESP32 DevKitC(ESP-WROOM-32)に Amazon FreeRTOS とサンプルプログラムをインストールして、 AWS IoT Core に接続してメッセージをPublish(送信)してみたので備忘録として記事にしておく。

概要図

ESP32 DevKitCからAWS IoT Coreへメッセージを送信の概要図
  • AWSの FreeRTOS デバイスソフトウェアページから該当のサンプル(FreeRTOSを含む)のダウンロード
  • AWS IoT Core の設定
  • パソコンの ESP-IDF 環境にてコンパイル
  • ESP32 DevKitC に書き込み
  • 数秒間隔で IoT Core にメッセージを Publish(送信)するプログラム

環境

今回は試した環境は以下の通り。

IoT デバイス

ESP32 DevKitC(ESP-WROOM-32)

開発環境のパソコンとOS

DELL G7 15 7588

Windows10 Home バージョン2004

OSビルド:19041.985

※ ちなみに Windows10 のWSL(Windows Subsystem for Linux)配下の Ubuntu 20.04 LST 、ESP-IDF v3.3 でもコンパイル、IoT機器への書き込みが問題なく動作した。

ESP-IDF

v3.3

※現時点での ESP32 DevKitC 向けのバージョンでは v4.2 はまだ非推奨とあった

必要な機器

ESP-WROOM-32 を積んだモジュールを購入した。

  • Tensilica LX6デュアルコア CPU プロセッサ
  • 520 KB SRAM
  • Wi-Fi  802.11 b/g/n、Bluetooth 4.2
  • SPI / SDIO / I2C / UART インターフェイス
  • ピン×30本(15本×2)
  • Micro USB Type-B(給電、データ転送)
  • ボタン×2(EN+BOOT)
  • LEDインジケーター×2

手順

大まかな手順は以下の通り。

  • AWS コンソールから FreeRTOS をダウンロードすると同時に AWS IoT Core の設定を行う
  • 認証情報のダウンロード
  • パソコン上で ESP-IDF のツール類のインストール
  • 環境変数の設定
  • CMake環境の構築
  • ソースを修正してビルド、コンパイル
  • ESP32 DevKitC に書き込み(Flush)

FreeRTOS ダウンロード

AWS(Amazon Web Services)のコンソールにログインをしてサービスの一覧から AWS IoT Core のページに移動する。

左下のメニューから “ソフトウェア” を選択する。

AWS IoT Coreからソフトウェアを選択

“FreeRTOS デバイスソフトウェア” の「ダウンロードの設定」ボタンをクリックする。

FreeRTOSデバイスソフトウェアの「ダウンロードの設定」をクリックする

下にスクロールして “Connect to AWS IoT – ESP32-DevKitC ESP32-DevKitC” の “クイック接続” をクリックする。

※似たような名前の “Connect to AWS Greengrass – ESP32-DevKitC” もあるので注意。

ESP32-DevKitC クイック接続

手順が表示されるので下にスクロールする。

  1. デバイス用の FreeRTOS のダウンロード
  2. デバイスの登録
  3. 認証情報のダウンロード
  4. FreeRTOS をデバイス上で設定
  5. デバイスをテストする

手順を確認して、「開始方法」ボタンをクリックする。

手順の確認と「開始方法」
  • 使用する FreeRTOS バージョンを選択してください:202012.00 最新
  • ハードウェアプラットフォーム:ESP32-DevKitC

が選択されている事を確認して “詳細情報の表示” をクリックする。

※2021年5月時点では 202012.00 が最新だった。

詳細情報の表示

ライブラリー一覧で “別のライブラリを追加します” をクリックする。

別のライブラリーを追加する

“OTA Updates” をクリックしてダウンロードするライブラリーに追加する。

OTA(Over-The-Air)は無線でソフトウェアをアップデートする機能で IoT 端末のプログラムを遠隔で更新したい時に使用する。

今回の記事では OTA のデモについて記載しないが、Amazon s3 に更新バイナリーファイルを格納すると ESP32 DevKitC が最新ファイルを取得して無線で最新ソフトウェアに自動で更新される事を確認している。

OTA Updatesを追加する

インストールライブラリーに OTA が追加された事を確認して下にスクロールする。

インストール用ライブラリーにOTAが追加された

デモプロジェクトで “coreMQTT Demos” のデモの有効化が選択されている事を確認する。

この後、複数のデモプロジェクトがパソコンにダウンロードされるのだが、ここではどのデモプロジェクトをコンパイルして実行するのかを指定している。

まずは MQTT のデモプロジェクトを有効化しているが、ダウンロードした後でも aws_demo_config.h の記述を修正する事によりコンパイルするプロジェクトは変更する事ができる。

coreMQTT Demosが有効化されている事を確認する
  • 名前:ConnecttoAWSIoT-ESP32-DevKitC-test
  • 説明:Get started with the libraries required to securely connect to AWS IoT.-test

を入力して「作成してダウンロードします」ボタンをクリックする。

“作成して” とは本来であれば AWS IoT Core にてモノの作成や証明書の発行、ポリシーの作成が必要なのだが、裏で自動的に作成してくれる、との意味だ。

既に手動でモノや証明書、ポリシーを作成済みであれば「ダウンロードのみ」でも良い。

名前と説明を入力して「作成してダウンロードします」

freertos-xxxxx.zip ファイル(約60MB)を適当なフォルダーに保存したら解凍する。

freertos-xxxxx.zip ファイルを保存する

ディレクトリ構造

D:¥GoogleDriveD¥M2B¥配下(任意のフォルダー)に解凍した。

├─d:
│  │      
│  ├─GoogleDriveD
│  │  │
│  │  ├──M2B
│  │  │  │
│  │  │  ├──build ・・・ 空で作成しておく(buildファイル格納用)
│  │  │  │
│  │  │  ├──FreeRTOS ・・・ ここに解凍する
│  │  │  │  │
│  │  │  │  ├──demos ・・・デモ用アプリケーション
│  │  │  │  │
│  │  │  │  ├──device
│  │  │  │  │
│  │  │  │  ├──freertos_kernel ・・・ FreeRTOSのカーネル
│  │  │  │  │
│  │  │  │  ├──libraries ・・・ ライブラリー
│  │  │  │  │
│  │  │  │  ├──tests
│  │  │  │  │
│  │  │  │  ├──tools ・・・ ツール類(認証ファイルの変換ツール等)
│  │  │  │  │
│  │  │  │  ├──vendors ・・・ ESP-IDF環境
│  │  │  │  │

デバイスの登録

デバイスの登録ページに遷移するので、

  • 名前:ESP-WROOM-32-Test

を入力して「次へ」ボタンをクリックする。

デバイスを登録して次へ

「ダウンロードして実行」ボタンをクリックすると認証情報が作成されてダウンロードされると同時にAWS IoT Core のモノとポリシーが作成される。

モノの作成と認証情報のダウンロード

認証情報

認証情報ファイル(Credentials.zip)が作成されるので保存して解凍する。

認証情報ファイルがダウンロードされるので保存する

・aws_clientcredential.h
・aws_clientcredential_keys.h
・ESP-WROOM-32-Test.cert.pem
・ESP-WROOM-32-Test.private.key
・ESP-WROOM-32-Test.public.key

上記の5つのファイルが解凍される。

AWSコンソールでは “FreeRTOSをデバイス上で設定” が表示されているので、その内容に沿って先程解凍したファイルを自分の環境に合わせて変更してゆく。

主にWi-Fi 認証情報の設定と AWS 認証情報の設定を行う。

AWSコンソールのページではFreeRTOSをデバイス上で設定のページが表示されている

次の AWS コンソールの手順はテスト(MQTTのメッセージを受け取る)のだが、その前にパソコン側で ESP-IDF の環境を整える。

ブラウザのAWS コンソールはそのまま放置でも、またはここで一旦終了しても良い(後からテスト画面は呼び出すことができる)。

Wi-Fi 認証情報を設定

先程ダウンロードして解凍した認証情報の aws_clientcredential.h にWi-Fi 情報を設定する。

変更箇所は以下の3箇所。

  • clientcredentialWIFI_SSID:SSID を指定する
  • clientcredentialWIFI_PASSWORD:パスワードを指定する
  • clientcredentialWIFI_SECURITY:暗号化(セキュリティ)方式を指定する※

※ 暗号化は以下の3種類が指定可能

  1. eWiFiSecurityOpen
  2. eWiFiSecurityWEP
  3. eWiFiSecurityWPA
Wi-Fiの設定

AWS 認証情報を設定

  • aws_clientcredential.h
  • aws_clientcredential_keys.h

を d:¥GoogleDriveD¥M2B¥FreeRTOS¥demos¥include¥~ にコピーする。

※ 同名のファイルが既に存在するので念の為、名前を変更してバックアップをしておいた。

尚、aws_clientcredential_keys.h のファイルの中身は以下の通り。

aws_clientcredential_keys.h の中身

AWS IoT Core に接続する為のプライベートキー(ESP-WROOM-32-Test.private.key)等の情報がセットされていて改行部が ¥n”¥ で終わっている。

これは C のコード中にキー情報を記述する為のお約束らしく、元のキー形式を上記の形式に変換するツールが下記に入っていた。

D:\GoogleDriveD\M2B\FreeRTOS\tools\certificate_configuration\CertificateConfigurator.html

ESP-IDF ツール類

ESP-IDF のツール類(Ver 3.3)をこちらのページからダウンロードする。

2021年5月時点で ESP32-DevKitCのFreeRTOSの最新バージョン(202012.00)では Ver4.2 では無く Ver3.3 を推奨していた。

いずれ ESP-IDF Ver 4.2 にも対応するのだと思う。

下の方へスクロールして https://dl.espressif.com/dl/esp-idf-tools-setup-1.2.exe (ESP-IDF Ver 3.3版)をダウンロードする。

https://dl.espressif.com/dl/esp-idf-tools-setup-1.2.exe のダウンロード

ダウンロードした esp-idf-tools-setup-1.2.exe を実行するとライセンスの承認確認が表示されるので、 “I accept the agreement” を選択して「Next」ボタンをクリックする。

ライセンスの承認

インストール場所(デフォルトはC:¥Program Files¥Espressif¥ESP-IDF Tools)を選択して「Next」ボタンをクリックする。

インストール場所を選択してNext

“Custom Installation” を選択して「Next」ボタンをクリックする。

Custom Installationを選択
  • Add Tools to Path:For all users(すべてのユーザで使用する)
  • Download and Run CMake 3.11.1 Installer:チェックを外す
  • Download and Run Python 2.7.14 installer and install Python dependencies:チェックを外す

で「Next」ボタンをクリックした。

CMAKE は別途最新バージョンをインストールするのでチェックを外している。

また Python は既に Ver 3.7 インストールされているのでチェックを外したが各自の環境に応じてチェックをいれて欲しい。

CMakeインストーラー等のオプション

「Install」ボタンをクリックする。

インストール

正常にインストールされた。

正常にインストールされた

環境変数の設定

Windows の環境変数に IDF_PATH を設定する。

スタートメニューから “環境変数” で検索して “システム環境変数の編集” を選択する。

システム環境変数の設定

“詳細設定” タブの 「環境変数」ボタンをクリックする。

環境変数ボタン

“システム環境変数” 欄で「新規」ボタンをクリックする。

※このユーザでしか ESP-IDF を使用しないのであればユーザ環境変数でもOK。

システム環境変数
  • 変数名:IDF_PATH
  • 変数値:下記の値をセットする
D:\GoogleDriveD\M2B\FreeRTOS\vendors\espressif\esp-idf

上記を入力して「OK」ボタンをクリックする。

環境変数(Path)の設定

IDF_PATH が追加された。

IDF_PATHが追加された

続いてシステム環境変数の Path を選択して「編集」ボタンをクリックする。

システム変数のpathへの追加

既に設定されている Path の一覧が表示されるので「新規」ボタンをクリックする。

Pathを追加する

最下行が追加されるので以下の Path を追加して「OK」ボタンをクリックする。

D:\GoogleDriveD\M2B\FreeRTOS\vendors\espressif\esp-idf\tools
新規行にPathを追加する

先程の画面で「OK」ボタンをクリックして環境変数の設定は終了。

OKボタン

CMake

ダウンロード

続いて CMake のコンパイル環境を整える為に、こちらのページから CMake のインストーラーをダウンロードする。

下にスクロールする。

CMakeのダウンロード

Binary distributions の Platform = Windows x64 Installer: Installer tool has changed. Uninstall CMake 3.4 or lower first! の “cmake-3.21.0-rc1-windows-x86_64.msi” をダウンロードして適当なフォルダーに保存する。

cmake-3.21.0-rc1-windows-x86_64.msi のダウンロード

インストール

“cmake-3.20.2-windows-x86_64.msi” を実行するとインストーラーが起動されるので「Next」ボタンをクリックする。

Next ボタン

ライセンス認証確認が表示されるので “I accept the terms in the License Agreement” にチェックを入れて「Next」ボタンをクリックする。

ライセンス認証

“Add CMake to the system PATH for all users” (全てのユーザのPathに追加)を選択して「Next」ボタンをクリックする。

全てのユーザのPathに追加

インストール先を指定して「Next」ボタンをクリックする。

インストール場所の選択

「Install」 ボタンをクリックする。

インストール

インストールが正常に行われたので 「Finish」ボタンをクリックする。

インストールが正常に終了した

TOPICの変更

以下のファイルを開いてプログラムソースを若干変更する。

D:\GoogleDriveD\M2B\FreeRTOS\demos\coreMQTT\mqtt_demo_mutual_auth.c
  • #define mqttexampleTOPIC: “/iotdemo/topic/1”
  • #define mqttexampleMESSAGE:”Hello World! from ESP-WROOM-32″

topic とは MQTT でメッセージを仕分けるためのキーで “/”(スラッシュ)で階層構造を設定する事ができる。

任意の階層構造に出来るのだが、AWSのデザインペーパーのMQTT Telemetry Topic Syntaxにて推奨構成が載っていたので気になる方は参照して欲しい。

TPOICやメッセージの変更

CMake

Power shell を起動してFreeRTOSをインストールしたディレクトリに移動して以下のコマンドで build ファイルを作成する。

d:
cd .\GoogleDriveD\M2B\FreeRTOS\
cmake -DVENDOR=espressif -DBOARD=esp32_devkitc -DCOMPILER=xtensa-esp32 -G Ninja -S . -B ..\build\

パラメーター

-DVENDOR

会社名を指定する。

espressif(エスプレッシフ社)を指定した。

-DBOARD

ボード名を指定する。

esp32_devkitc を指定した。

-DCOMPILER

コンパイラーを指定する。

xtensa-esp32 を指定した。

-G

CMakeジェネレーターに Ninja ビルドシステムを指定した。

Windowsのみ

-S

ソースコードの位置を指定する。

事前に D:¥GoogleDriveD¥M2B¥FreeRTOS に移動しているのでカレントディレクトリの “.” を指定した。

-B

生成されたビルド ファイルの場所を指定する。

 ../build/ を指定した。

Buildファイルの作成

cmake コマンドが正常に実行されると以下のメッセージが表示されて build 配下に Buildファイルが作成される。

Buildファイルの作成

build するプログラムの指定

尚、build するサンプルプログラムの指定は下記のファイルで行っている。

D:\GoogleDriveD\M2B\FreeRTOS\vendors\espressif\boards\esp32\aws_demos\config_files\aws_demo_config.h

前述の AWSコンソールのデモの有効化にて “coreMQTT Demos” を有効化したので、 CONFIG_CORE_MQTT_MUTUAL_AUTH_DEMO_ENABLED が指定されている。

他のサンプルプログラムを build したいのであれば、32~47行目に設定可能なプロジェクト一覧があるのでそこから選択して #define で定義する。

コンパイルするサンプルプログラムの指定場所

Python環境によるエラー

Cmake 時に以下のエラーメッセージが表示されてエラーになったことがあった。

“Some Python dependencies must be installed.”(意訳:一部のPython依存関係をインストールする必要があります。)

その際は以下のコマンドで必要なモジュールを追加インストールする。

python -m pip install --user -r \vendors\espressif\esp-idf\requirements.txt

Build

build ファイルを以下のコマンドでコンパイルする。

cmake --build ..\build\

または build ディレクトリーに移動して下記のコマンドでもOK。

cd ..\build\
ninja

正常にコンパイルされて aws_demos.bin (実行ファイル)が作成される。

正常にコンパイルされた

書き込み(Flush)

パソコンと ESP32 DevKitC をUSB ケーブル(Type-B)で接続をする。

パソコンと ESP32 を接続

その後、 idf.py を使用してボードに書き込み(フラッシュ)する。

.\vendors\espressif\esp-idf\tools\idf.py flash -b 115200 -B ..\build\

idf.py

書き込みプログラムを指定している

flash

書き込み

erase_flash で削除指定

-b

書き込み速度を指定する。

115200 を指定したがエラーが出るようであれば速度を落としてみる

-B

build ファイルの場所を指定する。 

..\build\ を指定した。

-p

ポートを指定する。

flush(書き込み)の時は未指定でも自動で対象のCOMポートに書き込まれたが、明示的に指定する時は COM7 の様に指定が可能。

COMポートはデバイスマネージャのポート(COMとLPT)を見れば対象のポートが確認できる。

新しい Window が開いてボードに書き込みが始まる。

Writing at が 100% になると自動的に Window が閉じて書き込みが終了する。

ボードへの書き込み

尚、削除は以下のコマンドで行う。

.\vendors\espressif\esp-idf\tools\idf.py erase_flash -b 115200 -B ..\build\

実行結果

書き込みが終了すると同時にサンプルプログラムが動作して MQTT プロトコルでメッセージが AWS IoT Core に送信される。

モニター

PowerShell から以下のコマンドでモニター可能とあったのだが、残念ながら自分の環境では一瞬 Window が開くのだが直ぐに閉じてしまいモニターが出来なかった。

.\vendors\espressif\esp-idf\tools\idf.py flash monitor -p COM7 - b 115200 -B ..\build\

PowerShellからのコマンドによるモニターは諦めて PuTTY でシリアル接続をしてモニタリングしてみた。

シリアルにて以下の設定を行う。

  • 接続先のシリアルポート:COM7(環境によって異なる)
  • 通信速度:115200
  • データ長(ビット):8
  • ストップビット:1
PuTTYの設定

PuTTY で接続するとESP-32 DevKitC のシリアルコンソールへの出力結果がモニターできる。

  • Topic Name:ESP-WROOM-32-GGTest/iotdemo/topic/1

でPublish(送信)している事が分かる。

PuTTYでのモニター

MQTTテストクライアント

AWS IoT Core 側でメッセージを Subscribe(受信)している事を確認する。

先程の AWS コンソールがそのままであればテストメッセージを受信して表示する事ができる。

もし閉じてしまっているのならば、 AWS のコンソールでサービス一覧から IoT Core を選択して AWS IoT のページに遷移した後、メニューから “MQTTテストクライアント” を選択する。

トピックのフィルター欄に “#” (シャープはワイルドカードなので全てのTopicが表示される)を入力して「サブスクライブ」ボタンをクリックする。

MQTTテストクライアント

暫く待つと ESP-32 DevKitC からのメッセージ(Hello World! from ESP-WROOM-32)を連続して受信する。

受信したメッセージが JSON 形式で無いので “メッセージを指定した形式で表示できません。” のメッセージが表示されているが気にしなくても良い。

サブスクライブ(受信)したMQTTメッセージ

このサンプルプログラムは数回メッセージを送信するとプログラムが終了する。

ESP32 DevKitC のEN(Enable) ボタンを押すとリセットされて最初からプログラムが起動される。

リセットボタン

終わりに

このサンプルプログラムは Real Time OS の真価を発揮するプログラムでは無いが、AWS IoT Core には容易に接続することが出来た。

また ESP32 からクラウドサービスに接続する際には Amazon FreeRTOS で AWS IoT Core に接続する選択はセキュリティも担保されるので有力であると感じた。

いずれ別のサンプルプロジェクトも試してみたいと思う。

ただ自分的には開発、コンパイル環境が ESP-IDF では無く Arduino IDE だと非常にありがたいと感じる。

IDE(Integrated Development Environment/統合開発環境)での開発に慣れた身としてはコマンドベースでのコンパイルは時代が戻ったように感じる。

以上で今回の記事は終了とする。

最後に

この記事が何処かで誰かの役に立つことを願っている。

尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

質問やコメントや励ましの言葉などを残す

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。