FreeRTOSをM5StickC PlusにインストールしてAWS IoTにメッセージを飛ばす(Windowsにて作業)

Amazon FreeRTOSを触ってみたくて、手元にあったM5StickC Plusにインストールしようとしたのですが、WEBや書籍の情報通りやったらバージョン依存等でかなりハマったので、最終的に纏めた手順を残しておきます。

作業は全てブラウザ(AWS Management Console)とコマンドプロンプトで行います。

同じ手順を手元の ESP-WROOM-32 でも動かして動作確認済みです。

f:id:yomon8:20210504182323p:plain:w300

IDFの準備(は不要)

まず最初にIDF等のツールはFreeRTOSの内部ツールでインストールできるので事前作業不要です。

最初のESP32用の環境がインストールされていたお陰で結構ハマりました。

IDF_PATH をしっかり設定すれば問題無く動くとは思いますが、もしFreeRTOSのために何かインストールしようとしているのなら、この記事の手順を使ってみても良いかもしれません。

最低限 Python3.7以上とGitが入っていれば動くはずです。

Standard Setup of Toolchain for Windows - ESP32 - — ESP-IDF Programming Guide release-v4.2 documentation

The installer can also download and run installers for Python 3.7 and Git For Windows if they are not already installed on the computer.

AWS IoTの設定

接続設定には tools\aws_config_quick_start\SetupAWS.py を使う方法もありますが、AWS Management Consoleから接続情報を取得する方法を取ります。

AWS IoTから以下のメニューを選択します。

f:id:yomon8:20210504144646p:plain:w500

Connect to AWS IoT - ESP32-DevKitC の 「クイック接続」を選択します。

f:id:yomon8:20210504144923p:plain:w500

ウィザードで設定される一覧が出ます。確認して「開始方法」をクリックします。

f:id:yomon8:20210504145058p:plain:w500

適当な名前を設定して「作成してダウンロードします」を選択します。

f:id:yomon8:20210504145450p:plain:w500

以下のようにFreeRTOSのダウンロードされるので保存しておきます。

f:id:yomon8:20210504145326p:plain:w200

AWS IoT Coreの「モノ(Thing)」の名前を設定します。

f:id:yomon8:20210504145735p:plain:w500

認証情報のダウンロード画面になります。こちらもダウンロードして保存しておきます。

f:id:yomon8:20210504145754p:plain:w500

この説明にある作業は後で実施します。

f:id:yomon8:20210504145913p:plain:w500

「テスト」ボタンをクリックするとMQTTのサブスクライブの画面になりますが、無視して完了とします。

f:id:yomon8:20210504145943p:plain:w500

ダウンロードファイルの確認

FreeRTOSのZIPファイル freertos-xxxxxx.zipCredentials.zip を解凍します。

FreeRTOS\
Credential\

FreeRTOSへ認証情報の設定

先程ダウンロードした認証情報のZIPファイルを解凍すると以下のようになっていると思います。

この中の以下の2ファイルに証明書情報等が記載されています。

  • aws_clientcredential.h
  • aws_clientcredential_keys.h

f:id:yomon8:20210504150419p:plain

Wifiの接続情報を aws_clientcredential.h の以下の部分に設定します。

/*
 * @brief Wi-Fi network to join.
 *
 * @todo If you are using Wi-Fi, set this to your network name.
 */
#define clientcredentialWIFI_SSID       "YOUR_WIFI_SSID"

/*
 * @brief Password needed to join Wi-Fi network.
 *
 * @todo If you are using WPA, set this to your network password.
 */
#define clientcredentialWIFI_PASSWORD   "YOUR_WIFI_PASSWORD"

Wifiの接続情報入力して保存したら、以下のように demos\include の同名のファイルを上書きコピーします。

f:id:yomon8:20210504174600p:plain:w500

これでデモ用の認証情報の設定ができました。

ESP-IDF等の関連ツールのインストール

まずビルド等に利用する開発ツールである、ESP-IDFをインストールします。

先程取得したリポジトリのディレクトリに入ります。

cd FreeRTOS

vendors\espressif\es-idf の下に各種ツールがあります。

まずは install.bat を実行して関連ツールをダウンロードしてインスト-ルをします。 %userprofile%\.espressif にインストールされます。

Githubから取得したAmazon FreeRTOSの場合はIDFのGit情報からバージョンを取得しますが、AWSから取得したリポジトリはGitでは無いので、自分でバージョンを指定してあげる必要があります。

以下のように version.txt をIDFのトップディレクトリに配置することで、インストーラーにバージョンを指示できます。

echo v4.2 > vendors\espressif\esp-idf\version.txt
vendors\espressif\esp-idf\install.bat

完了すると以下のようなメッセージが表示されます。

All done! You can now run:
   export.bat

インストール後に同ディレクトリにある export.bat を実行すると関連する環境変数などを設定してくれます。

vendors\espressif\esp-idf\export.bat

その後 idf.py が打てることを確認します。

FreeRTOSのビルド準備

準備ができたのでビルドの準備に入ります。

取得したリポジトリのディレクトリに入ります。

cd FreeRTOS

以下のコマンドでビルドの準備が走ります。(念のため export.bat を打っています)

vendors\espressif\esp-idf\export.bat
cmake -DVENDOR=espressif -DBOARD=esp32_wrover_kit -DCOMPILER=xtensa-esp32 -GNinja -S . -B build

M5StickC Plusに書き込み

FreeRTOSをビルドしてM5StickC Plusに書き込んでいきます。

Windowsの場合、USBに接続したESP32デバイスのCOMポートはデバイスマネージャで確認します。今回はCOM5でした。

f:id:yomon8:20210504154737p:plain:w500

念のため既存のイメージを削除します。

idf.py erase_flash  -p COM5 -b 115200

イメージを書き込みます。

idf.py flash -p COM5 -B build -b 115200

完了しました。

...
Wrote 1065936 bytes (662438 compressed) at 0x00020000 in 59.5 seconds (effective 143.3 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
Done

上記コマンドで -b 115200 と転送速度のBaudRateを設定していますが、これはM5StickCがサポートしているBaudRateに合わせています。

Baud rate supported by M5StickC: 1200 ~115200, 250K, 500K, 750K, 1500K

github.com

デフォルトの設定だと以下のようなエラーが発生します。

Changing baud rate to 460800
Changed.
Configuring flash size...

A fatal error occurred: Timed out waiting for packet header
esptool.py failed with exit code 2

動作確認

書き込めたので電源ONにしてみます。

idf.py monitor で状況をモニタできます。エラーが出てないか確認します。

idf.py monitor -p COM5

M5StickCPlus/example/topic というTOPICにデータをPublishしていることがログから読み取れます。

627 6677 [iot_thread] [INFO] [MQTT_MutualAuth_Demo] [mqtt_demo_mutual_auth.c:553] 628 6677 [iot_thread] Keeping Connection Idle...629 6677 [iot_thread]
630 6877 [iot_thread] [INFO] [MQTT_MutualAuth_Demo] [mqtt_demo_mutual_auth.c:533] 631 6877 [iot_thread] Publish to the MQTT topic M5StickCPlus/example/topic.632 6877 [iot_thread]
633 6878 [iot_thread] [INFO] [MQTT_MutualAuth_Demo] [mqtt_demo_mutual_auth.c:543] 634 6878 [iot_thread] Attempt to receive publish message from broker.635 6878 [iot_thread]
636 6882 [iot_thread] [INFO] [MQTT] [core_mqtt.c:886] 637 6882 [iot_thread] Packet received. ReceivedBytes=2.638 6882 [iot_thread]

AWS IoTで M5StickCPlus/example/topic のTOPICをサブスクライブしてみます。 Hello World のメッセージが受信できていることが確認できます。

掃除

設定を掃除していきます。

AWS IoTは裏で色々作成するのですが、以下の4カ所から名前検索したり紐付いた証明書を削除したりして掃除します。

f:id:yomon8:20210504173729p:plain:h300

ソフトウェアに関しては、登録時に見た画面の「自分用の設定」タブから設定を削除します。

f:id:yomon8:20210504173805p:plain:w500

【補足】GihubからのAmazon FreeRTOSの取得

この手順ではAWSから落としたFreeRTOSを利用しましたが、Githubから取得することも可能です。その場合はバージョン等はよく確認してください。

以下のように、Gitのオプションに --recursive をつけてサブモジュールも取得します。-b master でブランチを指定してダウンロードします。ダウンロードには結構時間がかかります。

こちらでも動くことを確認できましたが、バージョンの整合性等で動きが怪しい場合もありました。詰まる度にトラブルシュート時間かかりました・・

git clone https://github.com/aws/amazon-freertos.git --recursive -b master --depth 1 

参考情報

Interfaceの2021年4月号が「Amazon×マイコン FreeRTOS入門」と正にの内容です。 FreeRTOS初めての人はこちらの書籍読んでから触ることオススメします。

interface.cqpub.co.jp

サポートページに貼ってある動画もとても参考になりますのでオススメです。

interface.cqpub.co.jp

ESP-IDF v4.2の方を確認します。

docs.aws.amazon.com