ESP32 DevKitC とAmazon FreeRTOSでIoT Core にメッセージを送信するプログラムを試してみた
Contents
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(送信)してみたので備忘録として記事にしておく。
概要図
- 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 のページに移動する。
左下のメニューから “ソフトウェア” を選択する。
“FreeRTOS デバイスソフトウェア” の「ダウンロードの設定」ボタンをクリックする。
下にスクロールして “Connect to AWS IoT – ESP32-DevKitC ESP32-DevKitC” の “クイック接続” をクリックする。
※似たような名前の “Connect to AWS Greengrass – ESP32-DevKitC” もあるので注意。
手順が表示されるので下にスクロールする。
- デバイス用の FreeRTOS のダウンロード
- デバイスの登録
- 認証情報のダウンロード
- FreeRTOS をデバイス上で設定
- デバイスをテストする
手順を確認して、「開始方法」ボタンをクリックする。
- 使用する FreeRTOS バージョンを選択してください:202012.00 最新
- ハードウェアプラットフォーム:ESP32-DevKitC
が選択されている事を確認して “詳細情報の表示” をクリックする。
※2021年5月時点では 202012.00 が最新だった。
ライブラリー一覧で “別のライブラリを追加します” をクリックする。
“OTA Updates” をクリックしてダウンロードするライブラリーに追加する。
OTA(Over-The-Air)は無線でソフトウェアをアップデートする機能で IoT 端末のプログラムを遠隔で更新したい時に使用する。
今回の記事では OTA のデモについて記載しないが、Amazon s3 に更新バイナリーファイルを格納すると ESP32 DevKitC が最新ファイルを取得して無線で最新ソフトウェアに自動で更新される事を確認している。
インストールライブラリーに OTA が追加された事を確認して下にスクロールする。
デモプロジェクトで “coreMQTT Demos” のデモの有効化が選択されている事を確認する。
この後、複数のデモプロジェクトがパソコンにダウンロードされるのだが、ここではどのデモプロジェクトをコンパイルして実行するのかを指定している。
まずは MQTT のデモプロジェクトを有効化しているが、ダウンロードした後でも aws_demo_config.h の記述を修正する事によりコンパイルするプロジェクトは変更する事ができる。
- 名前:ConnecttoAWSIoT-ESP32-DevKitC-test
- 説明:Get started with the libraries required to securely connect to AWS IoT.-test
を入力して「作成してダウンロードします」ボタンをクリックする。
“作成して” とは本来であれば AWS IoT Core にてモノの作成や証明書の発行、ポリシーの作成が必要なのだが、裏で自動的に作成してくれる、との意味だ。
既に手動でモノや証明書、ポリシーを作成済みであれば「ダウンロードのみ」でも良い。
freertos-xxxxx.zip ファイル(約60MB)を適当なフォルダーに保存したら解凍する。
ディレクトリ構造
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 コンソールの手順はテスト(MQTTのメッセージを受け取る)のだが、その前にパソコン側で ESP-IDF の環境を整える。
ブラウザのAWS コンソールはそのまま放置でも、またはここで一旦終了しても良い(後からテスト画面は呼び出すことができる)。
Wi-Fi 認証情報を設定
先程ダウンロードして解凍した認証情報の aws_clientcredential.h にWi-Fi 情報を設定する。
変更箇所は以下の3箇所。
- clientcredentialWIFI_SSID:SSID を指定する
- clientcredentialWIFI_PASSWORD:パスワードを指定する
- clientcredentialWIFI_SECURITY:暗号化(セキュリティ)方式を指定する※
※ 暗号化は以下の3種類が指定可能
- eWiFiSecurityOpen
- eWiFiSecurityWEP
- eWiFiSecurityWPA
AWS 認証情報を設定
- aws_clientcredential.h
- aws_clientcredential_keys.h
を d:¥GoogleDriveD¥M2B¥FreeRTOS¥demos¥include¥~ にコピーする。
※ 同名のファイルが既に存在するので念の為、名前を変更してバックアップをしておいた。
尚、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版)をダウンロードする。
ダウンロードした esp-idf-tools-setup-1.2.exe を実行するとライセンスの承認確認が表示されるので、 “I accept the agreement” を選択して「Next」ボタンをクリックする。
インストール場所(デフォルトはC:¥Program Files¥Espressif¥ESP-IDF Tools)を選択して「Next」ボタンをクリックする。
“Custom Installation” を選択して「Next」ボタンをクリックする。
- 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 インストールされているのでチェックを外したが各自の環境に応じてチェックをいれて欲しい。
「Install」ボタンをクリックする。
正常にインストールされた。
環境変数の設定
Windows の環境変数に IDF_PATH を設定する。
スタートメニューから “環境変数” で検索して “システム環境変数の編集” を選択する。
“詳細設定” タブの 「環境変数」ボタンをクリックする。
“システム環境変数” 欄で「新規」ボタンをクリックする。
※このユーザでしか ESP-IDF を使用しないのであればユーザ環境変数でもOK。
- 変数名:IDF_PATH
- 変数値:下記の値をセットする
D:\GoogleDriveD\M2B\FreeRTOS\vendors\espressif\esp-idf
上記を入力して「OK」ボタンをクリックする。
IDF_PATH が追加された。
続いてシステム環境変数の Path を選択して「編集」ボタンをクリックする。
既に設定されている Path の一覧が表示されるので「新規」ボタンをクリックする。
最下行が追加されるので以下の Path を追加して「OK」ボタンをクリックする。
D:\GoogleDriveD\M2B\FreeRTOS\vendors\espressif\esp-idf\tools
先程の画面で「OK」ボタンをクリックして環境変数の設定は終了。
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.20.2-windows-x86_64.msi” を実行するとインストーラーが起動されるので「Next」ボタンをクリックする。
ライセンス認証確認が表示されるので “I accept the terms in the License Agreement” にチェックを入れて「Next」ボタンをクリックする。
“Add CMake to the system PATH for all users” (全てのユーザのPathに追加)を選択して「Next」ボタンをクリックする。
インストール先を指定して「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にて推奨構成が載っていたので気になる方は参照して欲しい。
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/ を指定した。 |
cmake コマンドが正常に実行されると以下のメッセージが表示されて 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)で接続をする。
その後、 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 で接続するとESP-32 DevKitC のシリアルコンソールへの出力結果がモニターできる。
- Topic Name:ESP-WROOM-32-GGTest/iotdemo/topic/1
でPublish(送信)している事が分かる。
MQTTテストクライアント
AWS IoT Core 側でメッセージを Subscribe(受信)している事を確認する。
先程の AWS コンソールがそのままであればテストメッセージを受信して表示する事ができる。
もし閉じてしまっているのならば、 AWS のコンソールでサービス一覧から IoT Core を選択して AWS IoT のページに遷移した後、メニューから “MQTTテストクライアント” を選択する。
トピックのフィルター欄に “#” (シャープはワイルドカードなので全てのTopicが表示される)を入力して「サブスクライブ」ボタンをクリックする。
暫く待つと ESP-32 DevKitC からのメッセージ(Hello World! from ESP-WROOM-32)を連続して受信する。
受信したメッセージが JSON 形式で無いので “メッセージを指定した形式で表示できません。” のメッセージが表示されているが気にしなくても良い。
このサンプルプログラムは数回メッセージを送信するとプログラムが終了する。
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のアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。
最近のコメント