Amazon FreeRTOS ESP32-DevKit-CでMQTT Hello World (Mac版)


Amazon FreeRTOSをESP32開発ボードESP32-DevKit-Cにセットアップして、マイコンからMQTTのメッセージを送信し、AWS IoTのコンソール上で確認するHello Worldサンプルを動かしてみたので手順をまとめてみました。

FreeRTOSのセットアップ手順は公式ドキュメントの「Espressif ESP32-DevKitC と ESP-WROVER-KIT の開始方法」を参考にしています。
このドキュメントではESP-IDF v3とESP-IDF v4を利用したセットアップ方法が記載されていますが、今回は「ESP-IDF v4」の手順を選択しました。

クイック接続を利用してAWS IoTをセットアップ

クイック接続ワークフローを利用して、AWS IoTのセットアップをしていきます。

マネジメントコンソールにログインして、「FreeRTOS」で検索して、「FreeRTOS」をクリックして開きます。

[FreeRTOS デバイスソフトウェア]のページで、[ESP32-DevKitC]の[クイック接続]をクリックします。

手順の説明が表示されるので[開始方法]をクリックして次のページに進みます。

[Connect to AWS Greengrass – ESP32-DevKitC]のページでは、各入力はデフォルトのまま[作成してダウンロードします]をクリックします。

ここで、FreeRTOSのソースコードがダウンロードされますが、ソースはダウンロードされたものは使用せずGithubからクローンしたものを使用します。

[デバイスの登録]では、[名前]に適当な値を入力して[次へ]をクリックします。

[認証情報のダウンロード]では、[ダウンロードして続行]をクリックします。

認証情報を含む「Credentials.zip」というファイルがダウンロードされます。こちらに含まれるソースは、後で利用します。

[FreeRTOS をデバイス上で設定]が表示されます。表示されているインストラクションに従ってESP32-DevKIT-Cをセットアップしていきます。

[テスト]は、以下のデバイスのセットアップが完了した後、クリックします。

ソースコードの入手

Amazon FreeRTOSはGithubに公開されているので、Githubからクローンしてくるのが最も簡単な入手方法です。

Githubリポジトリ: https://github.com/aws/amazon-freertos

このリポジトリではESP-IDFをはじめ様々な外部モジュールを参照しています。サブモジュールも同時に落としてくるように--recurse-submodulesオプションを付けてクローンします。

$ git clone https://github.com/aws/amazon-freertos.git --recurse-submodules

USBシリアルドライバのインストール

「CP210x USB to UART Bridge VCP Drivers」をインストールします。
Silicon Labsのページを開き[Downloads]タブを開いて「CP210x VCP Mac OSX Driver v6.0」をダウンロードします。

ダウンロードしたら「macOS_VCP_Driver/SiLabsUSBDriverDisk.dmg」を開いて「Install CP210x VCP Driver」をクリックするとインストーラが起動します。

インストーラが起動したらウィザードに沿ってインストールできます。

インストールできたらESP32-DevKit-CをUSB接続してシリアルポートとして認識されているか確認します。
以下のコマンドで「/dev/cu.SLAB_USBtoUART」が表示されればOKです。

$ ls /dev/cu.*
/dev/cu.Bluetooth-Incoming-Port /dev/cu.SOC
/dev/cu.MALS            /dev/cu.usbserial-0001
/dev/cu.SLAB_USBtoUART

ツールチェーンのインストール

ツールチェーンに必要なソフトウェアのインストール

Standard Setup of Toolchain for Mac OSに従って、ツールチェーンの前提条件をセットアップします。

Pytohn v3

Installing Python 3には、「将来Mac OSでv2はサポートされなくなるのでv3にしといたほうが良いよ」と書いてあります。また、新しいpipはPython 3をサポートしていないので、Pythonはv3に上げておくのが無難です。

pyenvをhomebrewでインストールし、pyenvで3.9.4をインストールします。

$ brew install pyenv

パスを.bash_profileに指定して反映します。

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile 

2021.4.10時点での安定版の最新3.9.4をインストールします。

$ pyenv install 3.9.4

バージョンを確認します。

$ python --version
Python 3.9.4

参考: MacのPythonを2系から3系にアップデートする

pip

パイソンのパッケージマネージャpipをインストールします。

sudo easy_install pip

CMakeとNinja build

cmakeとNinja buildをhomebrewでインストールします。

$ brew install cmake ninja dfu-util

ツールチェーンのインストール

FreeRTOSのソースに含まれるESP-IDFのインストールスクリプトを実行するとツールチェーンを含む必要なライブラリをインストールしてくれます。

$ vendors/espressif/esp-idf/install.sh

...

All done! You can now run:

  . vendors/espressif/esp-idf/export.sh

export.shを実行してパスを通します。

$ . vendors/espressif/esp-idf/export.sh

...

Done! You can now compile ESP-IDF projects.
Go to the project directory and run:

  idf.py build

認証情報をプロジェクトFreeRTOSプロジェクトにコピー

クイック接続の[認証情報のダウンロード]ステップでダウンロードした「Credentials.zip」を解凍して、「aws_clientcredential.h」と「aws_clientcredential_keys.h」の2つのを「amazon-freertos/demos/include」にコピーして既存ファイルを置き換えます。

「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       ""

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

/*
 * @brief Wi-Fi network security type.
 *
 * @see WIFISecurity_t.
 *
 * @note Possible values are eWiFiSecurityOpen, eWiFiSecurityWEP, eWiFiSecurityWPA,
 * eWiFiSecurityWPA2 (depending on the support of your device Wi-Fi radio).
 */
#define clientcredentialWIFI_SECURITY   eWiFiSecurityWPA2

また、demos/coreMQTT/mqtt_demo_mutual_auth.cを開き、mqttexampleTOPICの値を「/example/topic」から「/iotdemo/topic/1」に変更して保存します。


/** * @brief The topic to subscribe and publish to in the example. * * The topic name starts with the client identifier to ensure that each demo * interacts with a unique topic name. */ #define mqttexampleTOPIC democonfigCLIENT_IDENTIFIER "/iotdemo/topic/1"

ビルドしてデバイスにフラッシュ

CMake FreeRTOS で をビルドしてフラッシュする」の手順でソースをビルドして、デバイスにフラッシュします。

buildディレクトリを作成して、cmakeコマンドを実行してビルドファイルを生成します。

$ mkdir build
$ cmake -DVENDOR=espressif -DBOARD=esp32_wrover_kit -DCOMPILER=xtensa-esp32 -S . -B ./build -DAFR_ENABLE_ALL_MODULES=1 -DAFR_ENABLE_TESTS=0 
...

=========================================================================

-- Configuring done
-- Generating done
-- Build files have been written to: /Users/hrendoh/workspace/amazon-freertos/build

Ninjaを使う場合

$ cmake -DVENDOR=espressif -DBOARD=esp32_wrover_kit -DCOMPILER=xtensa-esp32 -S . -B ./build -DAFR_ENABLE_ALL_MODULES=1 -DAFR_ENABLE_TESTS=0 -GNinja 

make erase_flashで開発ボードのフラッシュメモリを消去してから、
make flashでビルドし、ESP32-DevKIT-Cにフラッシュします。

シリアルポートは自動で検出してくれますが、環境変数ESPPORTでデバイスのシリアルポートを指定することもできます。

$ export ESPPORT=/dev/cu.SLAB_USBtoUART
$ make -C ./build erase_flash
$ make -C ./build flash

...

Writing at 0x000c8000... (97 %)
Writing at 0x000cc000... (100 %)
Wrote 1134176 bytes (710755 compressed) at 0x00020000 in 62.6 seconds (effective 144.9 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
[100%] Built target flash

テストクライアントでMQTTメッセージの受信を確認する

AWSマネジメントコンソールに戻り、クリック接続の[FreeRTOS をデバイス上で設定]のページの[テスト]をクリックします。

しかし、このテスト画面では受信できませんでした。。
この画面は[完了]して閉じ、気を取り直して、IoTの左のメニュから[テスト] > [テストクライアント]を開きます。

モニターを開始します。

$ vendors/espressif/esp-idf/tools/idf.py -p /dev/cu.SLAB_USBtoUART -B build monitor

モニターは 「Ctrl + ]」で閉じることができます。

少し待つと受信したメッセージが表示されます。

, ,